Mercurial > hg > Members > kono > Cerium
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); + } + } + } }