diff --git a/ediv/CHANGE_LOG.txt b/ediv/CHANGE_LOG.txt index 6547c45..bf87932 100644 --- a/ediv/CHANGE_LOG.txt +++ b/ediv/CHANGE_LOG.txt @@ -4,6 +4,7 @@ gran bug, la causa era una gran chorrada.. en fin.. el robots.prg ya es casi hasta jugable (si no fuera por las colisiones ke colisionan como les da la gana xD) (Er_Makina) + * Añadidos torus.prg y torus2.prg en el directorio bin/test (Er_Makina) 30/3/2003 --------- diff --git a/ediv/bin/test/torus.prg b/ediv/bin/test/torus.prg new file mode 100644 index 0000000..7684963 --- /dev/null +++ b/ediv/bin/test/torus.prg @@ -0,0 +1,211 @@ +/* + * TOROIDE EN 3D + * Adaptado de un ejemplo de PCMan¡a + * s¡, antes en PCMan¡a hab¡a cosas de programaci¢n... :'( + * + * TECLAS: + * Space = detener/continuar rotaci¢n + * P = alternar entre modo puntos/wireframe + */ + +Program Torus; +GLOBAL + Total_puntos; + Total_lineas; + donut[500,2]; + Rotado[500,2]; + lineas[1000,1]; + xdeg,ydeg,zdeg; + xoff,yoff,zoff; + sen[360],cosen[360]; + dibupun; + gir=1; + mx,my; + +BEGIN + crea_tablas(); + repeat + clear_screen(); + gira_Donut(xdeg,ydeg,zdeg); + pon_lineas(rgb(255,255,0)); + mx=mouse.x; + my=mouse.y; + frame; + if(key(_p)) + dibupun++; + while(key(_p)) + frame; + end + end + if(key(_space)) + gir++; + while(key(_space)) + frame; + end + end + if(gir) + xdeg=(xdeg+3)mod 360; + ydeg=(ydeg+3)mod 360; + zdeg=(zdeg+3)mod 360; + end + until(key(_enter)) +END + + +Function Line(x1,y1,x2,y2,color) +PRIVATE + i,deltax,deltay,numpixels; + d,dinc1,dinc2; + xx,xinc1,xinc2; + yy,yinc1,yinc2; + +BEGIN + deltax=abs(x2-x1); + deltay=abs(y2-y1); + if(deltax=>deltay) + numpixels=deltax+1; + d=(2*deltay)-deltax; + dinc1=deltay; + dinc2=(deltay-deltax); + xinc1=1; + xinc2=1; + yinc1=0; + yinc2=1; + else + numpixels=deltay+1; + d=(2*deltax)-deltay; + dinc1=deltax; + dinc2=(deltax-deltay); + xinc1=0; + xinc2=1; + yinc1=1; + yinc2=1; + end + if(x1>x2) + xinc1=-xinc1; + xinc2=-xinc2; + end + if(y1>y2) + yinc1=-yinc1; + yinc2=-yinc2; + end + for(i=1;i<=numpixels;i++) + put_pixel(x1,y1,color); + if(d<0) + d+=dinc1; + x1+=xinc1; + y1+=yinc1; + else + d+=dinc2; + x1+=xinc2; + y1+=yinc2; + end + end +END + + +Function Crea_donut(radio1,radio2,partes1,partes2) +PRIVATE + cont1,cont2; + circulo[25,2]; + xtemp; + +BEGIN + if(partes1*partes2>500) + // demasiao p'al body :P + return; + end + total_lineas=0; + total_puntos=partes1*partes2; + for(cont1=1;cont1<=partes1;cont1++) + circulo[cont1,0]=radio1*sen[360*cont1/partes1]+radio2*256; + circulo[cont1,1]=radio1*cosen[360*cont1/partes1]; + end + for(cont2=1;cont2<=partes2;cont2++) + for(cont1=1;cont1<=partes1;cont1++) + xtemp=circulo[cont1,0]; + donut[(cont2-1)*partes1+cont1,0]=xtemp*cosen[360*cont2/partes2]/256; + donut[(cont2-1)*partes1+cont1,1]=circulo[cont1,1]; + donut[(cont2-1)*partes1+cont1,2]=xtemp*sen[360*cont2/partes2]/256; + total_lineas++; + lineas[total_lineas,0]=(cont2-1)*partes1+cont1; + lineas[total_lineas,1]=(cont2-1)*partes1+(cont1 mod partes1)+1; + total_lineas++; + lineas[total_lineas,0]=(cont2-1)*partes1+cont1; + lineas[total_lineas,1]=(((cont2-1)*partes1+(cont1)+partes1-1)mod (total_puntos))+1; + end + end +END + +Function Crea_tablas(); +PRIVATE + xpos,ypos; + cont; + +BEGIN + xoff=160; + yoff=100; + zoff=64; + total_puntos=0; + from cont=0 to 360; + sen[cont]=(256*sin(pi*2*cont/360))/1000; + cosen[cont]=(256*cos(pi*2*cont/360))/1000; + end + crea_donut(5,15,15,15); +END + +Function Gira_Donut(Xrot,Yrot,Zrot); +PRIVATE + cont; + xtemp; + ytemp; + ztemp; + +BEGIN + for(cont=1;cont<=total_puntos;cont++) + rotado[cont,0]=Donut[cont,0]; + rotado[cont,1]=Donut[cont,1]; + rotado[cont,2]=Donut[cont,2]; + if(xrot<>0) + ytemp=rotado[cont,1]; + ztemp=rotado[cont,2]; + rotado[cont,1]=(ytemp*cosen[xrot]-ztemp*sen[xrot])/256; + rotado[cont,2]=(ytemp*sen[xrot]+ztemp*cosen[xrot])/256; + end + if(yrot<>0) + xtemp=rotado[cont,0]; + ztemp=rotado[cont,2]; + rotado[cont,0]=(ztemp*sen[yrot]+xtemp*cosen[yrot])/256; + rotado[cont,2]=(ztemp*cosen[xrot]-xtemp*sen[yrot])/256; + end + if(zrot<>0) + xtemp=rotado[cont,0]; + ytemp=rotado[cont,1]; + rotado[cont,0]=(xtemp*cosen[zrot]-ytemp*sen[zrot])/256; + rotado[cont,1]=(xtemp*sen[zrot]+ytemp*cosen[zrot])/256; + end + end +END + +Function Pon_lineas(col) +PRIVATE + cont; + punto1,punto2; + xfin1,yfin1; + xfin2,yfin2; + +BEGIN + for(cont=1;cont<=total_lineas;cont++) + punto1=lineas[cont,0]; + punto2=lineas[cont,1]; + xfin1=xoff+rotado[punto1,0]/(zoff+rotado[punto1,2]/256); + yfin1=yoff+rotado[punto1,1]/(zoff+rotado[punto1,2]/256); + xfin2=xoff+rotado[punto2,0]/(zoff+rotado[punto2,2]/256); + yfin2=yoff+rotado[punto2,1]/(zoff+rotado[punto2,2]/256); + if(!dibupun) + line(xfin1,yfin1,xfin2,yfin2,col); + else + put_pixel(xfin1,yfin1,col); + end + end +END diff --git a/ediv/bin/test/torus2.prg b/ediv/bin/test/torus2.prg new file mode 100644 index 0000000..286c155 --- /dev/null +++ b/ediv/bin/test/torus2.prg @@ -0,0 +1,235 @@ +/* + * TOROIDE EN 3D + * Adaptado de un ejemplo de PCMan¡a + * s¡, antes en PCMan¡a hab¡a cosas de programaci¢n... :'( + * + * TECLAS: + * Space = detener/continuar rotaci¢n + * P = alternar entre modo puntos/wireframe + */ + +Program Torus; +CONST + interlace=2; + +GLOBAL + Total_puntos; + Total_lineas; + donut[500,2]; + Rotado[500,2]; + lineas[1000,1]; + xdeg,ydeg,zdeg; + xoff,yoff,zoff; + sen[360],cosen[360]; + dibupun; + gir=1; + +PRIVATE + c,r,g,b; + a; + +BEGIN + crea_tablas(); + repeat + //clear_screen(); + for(x=a;x<=320-interlace+a;x+=interlace) + from y=2 to 199; + c=get_pixel(x-a,y); + get_rgb(c,&r,&g,&b); + if(b>0) + b-=50; + else + if(g>0) + g-=50; + else + if(r>0) + r-=50; + end + end + end + put_pixel(x,y-2,rgb(r,g,b)); + //put_pixel(x,y,c/2); + end + end + a=(a+1)%interlace; + gira_Donut(xdeg,ydeg,zdeg); + pon_lineas(rgb(250,250,250)); + frame; + if(key(_p)) + dibupun++; + while(key(_p)) + frame; + end + end + if(key(_space)) + gir++; + while(key(_space)) + frame; + end + end + if(gir) + xdeg=(xdeg+3)mod 360; + ydeg=(ydeg+3)mod 360; + zdeg=(zdeg+3)mod 360; + end + until(key(_enter)) +END + + +Function Line(x1,y1,x2,y2,color) +PRIVATE + i,deltax,deltay,numpixels; + d,dinc1,dinc2; + xx,xinc1,xinc2; + yy,yinc1,yinc2; + +BEGIN + deltax=abs(x2-x1); + deltay=abs(y2-y1); + if(deltax=>deltay) + numpixels=deltax+1; + d=(2*deltay)-deltax; + dinc1=deltay; + dinc2=(deltay-deltax); + xinc1=1; + xinc2=1; + yinc1=0; + yinc2=1; + else + numpixels=deltay+1; + d=(2*deltax)-deltay; + dinc1=deltax; + dinc2=(deltax-deltay); + xinc1=0; + xinc2=1; + yinc1=1; + yinc2=1; + end + if(x1>x2) + xinc1=-xinc1; + xinc2=-xinc2; + end + if(y1>y2) + yinc1=-yinc1; + yinc2=-yinc2; + end + for(i=1;i<=numpixels;i++) + put_pixel(x1,y1,color); + if(d<0) + d+=dinc1; + x1+=xinc1; + y1+=yinc1; + else + d+=dinc2; + x1+=xinc2; + y1+=yinc2; + end + end +END + + +Function Crea_donut(radio1,radio2,partes1,partes2) +PRIVATE + cont1,cont2; + circulo[25,2]; + xtemp; + +BEGIN + if(partes1*partes2>500) + // demasiao p'al body :P + return; + end + total_lineas=0; + total_puntos=partes1*partes2; + for(cont1=1;cont1<=partes1;cont1++) + circulo[cont1,0]=radio1*sen[360*cont1/partes1]+radio2*256; + circulo[cont1,1]=radio1*cosen[360*cont1/partes1]; + end + for(cont2=1;cont2<=partes2;cont2++) + for(cont1=1;cont1<=partes1;cont1++) + xtemp=circulo[cont1,0]; + donut[(cont2-1)*partes1+cont1,0]=xtemp*cosen[360*cont2/partes2]/256; + donut[(cont2-1)*partes1+cont1,1]=circulo[cont1,1]; + donut[(cont2-1)*partes1+cont1,2]=xtemp*sen[360*cont2/partes2]/256; + total_lineas++; + lineas[total_lineas,0]=(cont2-1)*partes1+cont1; + lineas[total_lineas,1]=(cont2-1)*partes1+(cont1 mod partes1)+1; + total_lineas++; + lineas[total_lineas,0]=(cont2-1)*partes1+cont1; + lineas[total_lineas,1]=(((cont2-1)*partes1+(cont1)+partes1-1)mod (total_puntos))+1; + end + end +END + +Function Crea_tablas(); +PRIVATE + xpos,ypos; + cont; + +BEGIN + xoff=160; + yoff=100; + zoff=64; + total_puntos=0; + from cont=0 to 360; + sen[cont]=(256*sin(pi*2*cont/360))/1000; + cosen[cont]=(256*cos(pi*2*cont/360))/1000; + end + crea_donut(5,15,15,15); +END + +Function Gira_Donut(Xrot,Yrot,Zrot); +PRIVATE + cont; + xtemp; + ytemp; + ztemp; + +BEGIN + for(cont=1;cont<=total_puntos;cont++) + rotado[cont,0]=Donut[cont,0]; + rotado[cont,1]=Donut[cont,1]; + rotado[cont,2]=Donut[cont,2]; + if(xrot<>0) + ytemp=rotado[cont,1]; + ztemp=rotado[cont,2]; + rotado[cont,1]=(ytemp*cosen[xrot]-ztemp*sen[xrot])/256; + rotado[cont,2]=(ytemp*sen[xrot]+ztemp*cosen[xrot])/256; + end + if(yrot<>0) + xtemp=rotado[cont,0]; + ztemp=rotado[cont,2]; + rotado[cont,0]=(ztemp*sen[yrot]+xtemp*cosen[yrot])/256; + rotado[cont,2]=(ztemp*cosen[xrot]-xtemp*sen[yrot])/256; + end + if(zrot<>0) + xtemp=rotado[cont,0]; + ytemp=rotado[cont,1]; + rotado[cont,0]=(xtemp*cosen[zrot]-ytemp*sen[zrot])/256; + rotado[cont,1]=(xtemp*sen[zrot]+ytemp*cosen[zrot])/256; + end + end +END + +Function Pon_lineas(col) +PRIVATE + cont; + punto1,punto2; + xfin1,yfin1; + xfin2,yfin2; + +BEGIN + for(cont=1;cont<=total_lineas;cont++) + punto1=lineas[cont,0]; + punto2=lineas[cont,1]; + xfin1=xoff+rotado[punto1,0]/(zoff+rotado[punto1,2]/256); + yfin1=yoff+rotado[punto1,1]/(zoff+rotado[punto1,2]/256); + xfin2=xoff+rotado[punto2,0]/(zoff+rotado[punto2,2]/256); + yfin2=yoff+rotado[punto2,1]/(zoff+rotado[punto2,2]/256); + if(!dibupun) + line(xfin1,yfin1,xfin2,yfin2,col); + else + put_pixel(xfin1,yfin1,col); + end + end +END