diff TaskManager/Test/simple_render/polygon.cpp @ 85:9b96b190cb73

*** empty log message ***
author gongo
date Wed, 27 Feb 2008 04:25:04 +0900
parents 811ffebd8deb
children a309cf4eafc5
line wrap: on
line diff
--- a/TaskManager/Test/simple_render/polygon.cpp	Tue Feb 26 21:49:50 2008 +0900
+++ b/TaskManager/Test/simple_render/polygon.cpp	Wed Feb 27 04:25:04 2008 +0900
@@ -187,7 +187,7 @@
       //printf("x2:%f ,%f ,%f , %f, %f\n",xyz2[0],xyz2[1],xyz2[2],data[n+size*6+3],data[n+size*6+3+1]);
       //printf("x3:%f ,%f ,%f , %f, %f\n",xyz3[0],xyz3[1],xyz3[2],data[n+size*6+6],data[n+size*6+6+1]);
       Triangle *tri = new Triangle(ver1,ver2,ver3);
-      Span *span = new Span();
+      Span_c *span = new Span_c();
       span->viewer = viewer;
       span->p = this;
       span->create_span(tri,texture_image);
@@ -317,7 +317,7 @@
       Vertex *ver3 = new Vertex(xyz3[0],xyz3[1],xyz3[2],node.texture[nt+4],node.texture[nt+4+1]);
 
       Triangle *tri = new Triangle(ver1,ver2,ver3);
-      Span *span = new Span();
+      Span_c *span = new Span_c();
       span->viewer = viewer;
       span->p = this;
       span->create_span(tri,texture_image);
@@ -333,31 +333,75 @@
 
 void Polygon::draw(PolygonPack *pp)
 {
-    Vertex *ver1 = new Vertex(0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
-    Vertex *ver2 = new Vertex(0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
-    Vertex *ver3 = new Vertex(0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
-    
-    for (int n = 0; n < pp->info.size; n++) {
-	//Vertex *ver1 = new Vertex(pp->tri[n].x1,pp->tri[n].y1,pp->tri[n].z1,pp->tri[n].tex_x1,pp->tri[n].tex_y1);
-	//Vertex *ver2 = new Vertex(pp->tri[n].x2,pp->tri[n].y2,pp->tri[n].z2,pp->tri[n].tex_x2,pp->tri[n].tex_y2);
-	//Vertex *ver3 = new Vertex(pp->tri[n].x3,pp->tri[n].y3,pp->tri[n].z3,pp->tri[n].tex_x3,pp->tri[n].tex_y3);
-	
-	ver1->set(pp->tri[n].x1,pp->tri[n].y1,pp->tri[n].z1,pp->tri[n].tex_x1,pp->tri[n].tex_y1);
-	ver2->set(pp->tri[n].x2,pp->tri[n].y2,pp->tri[n].z2,pp->tri[n].tex_x2,pp->tri[n].tex_y2);
-	ver3->set(pp->tri[n].x3,pp->tri[n].y3,pp->tri[n].z3,pp->tri[n].tex_x3,pp->tri[n].tex_y3);
-	
-	Triangle *tri = new Triangle( ver1, ver2, ver3);
-	Span *span = new Span();
-	span->viewer = viewer;
-	span->p = this;
-	span->create_span(tri,texture_image);
-	delete tri;
-	delete span;
+  for(int n=0; n<pp->info.size; n++)
+    {
+      Vertex *ver1 = new Vertex(pp->tri[n].ver1.x,pp->tri[n].ver1.y,pp->tri[n].ver1.z,pp->tri[n].ver1.tex_x,pp->tri[n].ver1.tex_y);
+      Vertex *ver2 = new Vertex(pp->tri[n].ver2.x,pp->tri[n].ver2.y,pp->tri[n].ver2.z,pp->tri[n].ver2.tex_x,pp->tri[n].ver2.tex_y);
+      Vertex *ver3 = new Vertex(pp->tri[n].ver3.x,pp->tri[n].ver3.y,pp->tri[n].ver3.z,pp->tri[n].ver3.tex_x,pp->tri[n].ver3.tex_y);
+
+      Triangle *tri = new Triangle(ver1,ver2,ver3);
+      Span_c *span = new Span_c();
+      span->viewer = viewer;
+      span->p = this;
+      span->create_span(tri,texture_image);
+      delete ver1;
+      delete ver2;
+      delete ver3;
+      delete tri;
+      delete span;
     }
+}
 
-    delete ver1;
-    delete ver2;
-    delete ver3;
+
+void Polygon::draw(SPANPACK *sp)
+{
+  for(int n=0; n<sp->info.size; n++)
+    {
+      int end = sp->span[n].length_x;
+      Uint32 rgb;
+      float tex1 = sp->span[n].tex_x1;
+      float tex2= sp->span[n].tex_x2;
+      float tey1 = sp->span[n].tex_y1;
+      float tey2= sp->span[n].tex_y2;
+      int tex_xpos;
+      int tex_ypos;
+      int tex_zpos;
+      int x = sp->span[n].x;
+      int y = sp->span[n].y;
+      float z = sp->span[n].start_z;
+      float zpos = sp->span[n].end_z;
+      float tex_x,tex_y,tex_z;
+      
+      if(end == 1) {
+	//printf("end == 1\n");
+	//printf("tex_x:%f tex_y:%f\n",tex1,tex2);
+	//if(tex1 > 1) tex1 = 1;
+	//if(tey1 > 1) tey1 = 1;
+	tex_xpos = (int)((sp->span[n].tex_height-1) * tex1);
+	tex_ypos = (int)((sp->span[n].tex_width-1) * tey1);
+	tex_zpos = (int)z;
+	//printf("tex_xpos:%d tex_ypos:%d\n",tex_xpos,tex_ypos);
+	//printf("image->h:%d tex_x:%f\n",(int)sp->span[n].tex_height,tex1);
+	rgb = get_rgb(tex_xpos,tex_ypos);
+	viewer->write_pixel(x,y,zpos,rgb);
+      }else {
+	//printf("end != 1\n");
+	for(int j = 0; j < end; j++) {
+	  tex_x = tex1*(end-1-j)/(end-1) + tex2*j/(end-1);
+	  tex_y = tey1*(end-1-j)/(end-1) + tey2*j/(end-1);
+	  tex_z = z*(end-1-j)/(end-1) + zpos*j/(end-1);
+	  if(tex_x > 1) tex_x = 1;
+	  if(tex_y > 1) tex_y = 1;
+	  tex_xpos = (int)((sp->span[n].tex_height-1) * tex_x);
+	  tex_ypos = (int)((sp->span[n].tex_width-1) * tex_y);
+	  //printf("tex_xpos:%d tex_ypos:%d\n",tex_xpos,tex_ypos);
+	  //printf("z:%f zpos:%f tex_z:%f\n",z,zpos,tex_z);
+	  //printf("tex_x:%f tex_y:%f\n",tex_x,tex_y);
+	  rgb = get_rgb(tex_xpos,tex_ypos);
+	  viewer->write_pixel(j+x,y,tex_z,rgb);
+	}
+      }
+    }
 }