diff TaskManager/Test/simple_render/task/create_span.cpp @ 109:5c194c71eca8

Cerium cvs version
author gongo@gendarme.local
date Wed, 12 Nov 2008 17:39:33 +0900
parents 57bac9e07662
children 58fd16298954
line wrap: on
line diff
--- a/TaskManager/Test/simple_render/task/create_span.cpp	Wed Nov 12 17:29:35 2008 +0900
+++ b/TaskManager/Test/simple_render/task/create_span.cpp	Wed Nov 12 17:39:33 2008 +0900
@@ -1,9 +1,9 @@
 #include <iostream>
+#include "viewer.h"
 #include "polygon_pack.h"
-#include "spu_span.h"
+#include "SpuSpan.h"
 using namespace std;
 
-
 static float calc(float f1, float f2,int i, float base){
     float ans;
     ans = f1/f2*i + base;
@@ -11,23 +11,34 @@
 }
 
 
-static VertexPack *vMid1(VertexPack *vMid1,VertexPack *vMin, VertexPack *vMid, VertexPack *vMax) {
-    float d,d1;
-    d = (int)vMax->y-(int)vMin->y;
+static VertexPack*
+vMid1(VertexPack *vMid1, VertexPack *vMin, VertexPack *vMid, VertexPack *vMax)
+{
+    int d, d1;
+
+    // float2int のマクロとか書く?
+#if 0
+    d  = (int)vMax->y - (int)vMin->y;
     d1 = (int)vMid->y - (int)vMin->y;
-    vMid1->tex_x  = calc(vMax->tex_x - vMin->tex_x, d, (int)d1 , vMin->tex_x
-	);
-    vMid1->tex_y  = calc(vMax->tex_y - vMin->tex_y, d, (int)d1 , vMin->tex_y
-	);
-    vMid1->x      = calc(vMax->x - vMin->x, d, (int)d1 , vMin->x);
+#else
+    d  = (int)(vMax->y - vMin->y);
+    d1 = (int)(vMid->y - vMin->y);
+#endif
+
+    vMid1->tex_x  = calc(vMax->tex_x - vMin->tex_x, d, d1, vMin->tex_x);
+    vMid1->tex_y  = calc(vMax->tex_y - vMin->tex_y, d, d1, vMin->tex_y);
+    vMid1->x      = calc(vMax->x - vMin->x, d, d1, vMin->x);
     vMid1->y      = vMid->y;
-    vMid1->z      = calc(vMax->z - vMin->z, d, (int)d1 , vMin->z);
-    //printf("x:%f y:%f z:%f tex_x:%f tex_y:%f\n",vMid1->x,vMid1->y,vMid1->z,vMid1->tex_x, vMid1->tex_y);
+    vMid1->z      = calc(vMax->z - vMin->z, d, d1, vMin->z);
+
     return vMid1;
 }
 
-void half_triangle(SPUSPANLIST *ssl, long *tex_addr, long tex_width, long tex_height, VertexPack *vMin, VertexPack *vMid, VertexPack *vMid1) {
-//void half_triangle(SPANPACK *sp, long *tex_addr, long tex_width, long tex_height, VertexPack *vMin, VertexPack *vMid, VertexPack *vMid1) {
+void
+half_triangle(SpuSpan *ssl,
+	      long *tex_addr, long tex_width, long tex_height,
+	      VertexPack *vMin, VertexPack *vMid, VertexPack *vMid1)
+{
     float tmp_z,tmp_tex1, tmp_tex2 ,tmp_tey1,tmp_tey2;
     float tmp_xpos,tmp_end,tmp_zpos;
     int i;
@@ -40,7 +51,8 @@
     int l = 1;
     int start_y = (int)vMid->y;
     int end_y   = (int)vMin->y; 
-        
+    int real_x, real_y;
+
     if (start_y<end_y) { 
 	int i; i=end_y; end_y=start_y; start_y = i;
 	k = 1;
@@ -49,24 +61,22 @@
 
     div_y = start_y - end_y;  // > 0
 
-    //cout << "div_y : " << div_y+1 << endl;
-
     for(i = k; i < div_y+1; i++) {
 	tmp_xpos = calc(vMid1->x - vMin->x ,div_y, i, vMin->x);
 	tmp_end =  calc(vMid->x  - vMin->x ,div_y, i, vMin->x); 
 	tmp_z =    calc(vMid1->z - vMin->z ,div_y, i, vMin->z);
 	tmp_zpos = calc(vMid->z  - vMin->z ,div_y, i, vMin->z);
-	//printf("x:%f end:%f z:%f zpos:%f\n",tmp_xpos,tmp_end,tmp_z,tmp_zpos);
 
-	tmp_tex1 =((i/(div_y)) * vMid1->tex_x) +	\
-	    ( ((div_y - i)/(div_y)) * vMin->tex_x); 
-	tmp_tex2 =( (i/(div_y)) * vMid->tex_x) +	\
-	    ( ((div_y - i)/(div_y)) * vMin->tex_x); 
+	tmp_tex1 =((i/(div_y)) * vMid1->tex_x) +
+	     ( ((div_y - i)/(div_y)) * vMin->tex_x); 
+	tmp_tex2 =( (i/(div_y)) * vMid->tex_x) +	
+	     ( ((div_y - i)/(div_y)) * vMin->tex_x); 
     
-	tmp_tey1 =( (i/(div_y)) * vMid1->tex_y) +	\
-	    ( ((div_y - i)/(div_y)) * vMin->tex_y); 
-	tmp_tey2 =( (i/(div_y)) * vMid->tex_y) +	\
-	    ( ((div_y - i)/(div_y)) * vMin->tex_y); 
+	tmp_tey1 =( (i/(div_y)) * vMid1->tex_y) +      
+	     ( ((div_y - i)/(div_y)) * vMin->tex_y); 
+	tmp_tey2 =( (i/(div_y)) * vMid->tex_y) +	
+	     ( ((div_y - i)/(div_y)) * vMin->tex_y); 
+
 	if (tmp_xpos > tmp_end) {
 	    x = (int)tmp_end;
 	    y = (int)vMin->y + i*l;
@@ -89,41 +99,45 @@
 	    end_tex_y = tmp_tey2;
 	}
 
-	//printf("x:%d y:%d end:%d z:%f zpos:%f\n",x,y,length,start_z , end_z);
-	//printf("start_tex_x:%f end_tex_x:%f start_tex_y:%f end_tex_y:%fn",start_tex_x,end_tex_x,start_tex_y,end_tex_y);
-
-	//add(tex_addr,tex_width,tex_height,x,y,length,start_z,end_z,start_tex_x,end_tex_x,start_tex_y,end_tex_y);
+	// 画面外のものはここで
+	// この判定で当たってるのかな?
+#if 0
+	real_x = x + Viewer::width/2;
+	real_y = y + Viewer::height/2;
 
-	//y += 540;   // window_height = 1080  (1080/2 = 540)
-	y += 240;   // window_height = 480  (480/2 = 240)
-
-	int line_set = y/8;
+	if (real_x < 0 || real_x > Viewer::width ||
+	    real_y < 0 || real_y > Viewer::height) {
+	    continue;
+	}
 
-	//y -= 540;   // window_height = 1080  (1080/2 = 540)
-	y -= 240;   // window_height = 480  (480/2 = 240)
-
-	//if (x < 0 || x > 576 || y > 384 || y < 0 ) continue;
+	int line_set = (y + (Viewer::height/2))/TEXTURE_SPLIT_PIXEL;
+#else
+	if (x < 0 || x > Viewer::width ||
+	    y < 0 || y > Viewer::height) {
+	    continue;
+	}
 
-	int spu_no = line_set%6;
-   
-	int spp_no = line_set/6;
-	int span_no = ssl->ss[spu_no].spp[spp_no].info.size;
+	int line_set = y  / TEXTURE_SPLIT_PIXEL;
+#endif
+	
+	int spu_no   = line_set % SPE_NUM_MAX;
+	int spp_no   = line_set / SPE_NUM_MAX;
+
+	SpanPack *spack = &ssl->list[spu_no].packs[spp_no];
+
+	while (spack->next) spack = spack->next;
 
-#if 0 
-	ssl->ss[spu_no].spp[spp_no].span[span_no].tex_addr = tex_addr;
-	ssl->ss[spu_no].spp[spp_no].span[span_no].tex_width = tex_width;
-	ssl->ss[spu_no].spp[spp_no].span[span_no].tex_height = tex_height;
-	ssl->ss[spu_no].spp[spp_no].span[span_no].x = x;
-	ssl->ss[spu_no].spp[spp_no].span[span_no].y = y;
-	ssl->ss[spu_no].spp[spp_no].span[span_no].length_x = length;
-	ssl->ss[spu_no].spp[spp_no].span[span_no].start_z = start_z;
-	ssl->ss[spu_no].spp[spp_no].span[span_no].end_z = end_z;
-	ssl->ss[spu_no].spp[spp_no].span[span_no].tex_x1 = start_tex_x;
-	ssl->ss[spu_no].spp[spp_no].span[span_no].tex_x2 = end_tex_x;
-	ssl->ss[spu_no].spp[spp_no].span[span_no].tex_y1 = start_tex_y;
-	ssl->ss[spu_no].spp[spp_no].span[span_no].tex_y2 = end_tex_y;
-#else // 配列アクセスを無くしたつもり
-	SPAN_PTR span = &ssl->ss[spu_no].spp[spp_no].span[span_no];
+	if (spack->info.size >= MAX_SIZE_SPAN) {
+	    SpanPack *pack_new = new SpanPack();
+	    //SpanPack *pack_new;
+	    //posix_memalign((void**)&pack_new, 16, sizeof(SpanPack));
+	    pack_new->init();
+	    spack->next = pack_new;
+	    spack = pack_new;
+	}
+
+	int span_no = spack->info.size++;
+	Span *span = &spack->span[span_no];
 
 	span->tex_addr   = tex_addr;
 	span->tex_width  = tex_width;
@@ -137,86 +151,84 @@
 	span->tex_x2     = end_tex_x;
 	span->tex_y1     = start_tex_y;
 	span->tex_y2     = end_tex_y;
-#endif
-	ssl->ss[spu_no].spp[spp_no].info.size++;
     }
 }
 
+void
+fill(SpuSpan *ssl)
+{
+    for (int y = 0; y < Viewer::height; y = y + TEXTURE_SPLIT_PIXEL) {
+	int line_set = y / TEXTURE_SPLIT_PIXEL;
+	int spu_no = line_set % SPE_NUM_MAX;
+	int spp_no = line_set / SPE_NUM_MAX;
+
+	SpanPack *spack = &ssl->list[spu_no].packs[spp_no];
+
+	// 既に Span がある場合はスルー
+	if (spack->info.size > 0) continue;
+
+	// 塗りつぶし用 Span は info.size = -1
+	//
+	// ってことにしたけど、わかりづらいか・・・・
+	spack->info.size = -1;
+	Span *span = &spack->span[0];
+	span->y = y;
+    }
+}
 
 int create_span(void *rbuf,void *wbuf) {
-    //POLYGONPACK *polygon = (POLYGONPACK*)rbuf;
     PolygonPack *polygon = (PolygonPack*)rbuf;
-    //SPANPACK *sp = (SPANPACK*)wbuf;
-    //SPANPACKLIST *spl = (SPANPACKLIST*)wbuf;
-    //SPANPACKLIST *spl = polygon->spl;
-    SPUSPANLIST *ssl = polygon->ssl;
+    SpuSpan *ssl = polygon->ssl;
     VertexPack *vMin, *vMid, *vMax, *vMid10;
     VertexPack ver;
     vMid10 = &ver;
-
-    //cout << "create_span:spl->size = " << spl->size << endl;
-    //cout << "create_span:spl->dline[0].span = " << spl->dline[0].span << endl;
+    TrianglePack *triPack;
 
-    //for(int i=0; i<spl->size; i++)
-    for(int i=0; i<6; i++)  // 6 = number of SPU
-    {
-	ssl->ss[i].length = 0;
-	//for(int t=0; t<10; t++)   // window_height = 1080  ( 1080/8/6 = 22.5 )
-	for(int t=0; t<10; t++)    // window_height = 480  (480/8/6 = 10)
-	{
-	    ssl->ss[i].spp[t].info.size = 0;
-	}
-    }
-
-    //sp->info.size = 0;
-
-    //cout << sizeof(SPANPACK) << endl;
-    //cout << "polygon size : " << polygon->info.size << endl;
+    ssl->init();
 
     for(int a = 0; a < polygon->info.size; a++) {
-	//cout << "a = " << a << endl;
-	//cout << "polygon size : " << polygon->info.size << endl;
-	if (polygon->tri[a].ver1.y <= polygon->tri[a].ver2.y) {
-	    if (polygon->tri[a].ver2.y <= polygon->tri[a].ver3.y) {
-		vMin = &polygon->tri[a].ver1;
-		vMid = &polygon->tri[a].ver2;
-		vMax = &polygon->tri[a].ver3;
-	    } else if (polygon->tri[a].ver3.y <= polygon->tri[a].ver1.y) {
-		vMin = &polygon->tri[a].ver3;
-		vMid = &polygon->tri[a].ver1;
-		vMax = &polygon->tri[a].ver2;
+	triPack = &polygon->tri[a];
+	
+	if (triPack->ver1.y <= triPack->ver2.y) {
+	    if (triPack->ver2.y <= triPack->ver3.y) {
+		vMin = &triPack->ver1;
+		vMid = &triPack->ver2;
+		vMax = &triPack->ver3;
+	    } else if (triPack->ver3.y <= triPack->ver1.y) {
+		vMin = &triPack->ver3;
+		vMid = &triPack->ver1;
+		vMax = &triPack->ver2;
 	    } else {
-		vMin = &polygon->tri[a].ver1;
-		vMid = &polygon->tri[a].ver3;
-		vMax = &polygon->tri[a].ver2;
+		vMin = &triPack->ver1;
+		vMid = &triPack->ver3;
+		vMax = &triPack->ver2;
 	    }
 	} else {
-	    if (polygon->tri[a].ver1.y <= polygon->tri[a].ver3.y) {
-		vMin = &polygon->tri[a].ver2;
-		vMid = &polygon->tri[a].ver1;
-		vMax = &polygon->tri[a].ver3;
-	    } else if (polygon->tri[a].ver3.y <= polygon->tri[a].ver2.y) {
-		vMin = &polygon->tri[a].ver3;
-		vMid = &polygon->tri[a].ver2;
-		vMax = &polygon->tri[a].ver1;
+	    if (triPack->ver1.y <= triPack->ver3.y) {
+		vMin = &triPack->ver2;
+		vMid = &triPack->ver1;
+		vMax = &triPack->ver3;
+	    } else if (triPack->ver3.y <= triPack->ver2.y) {
+		vMin = &triPack->ver3;
+		vMid = &triPack->ver2;
+		vMax = &triPack->ver1;
 	    } else {
-		vMin = &polygon->tri[a].ver2;
-		vMid = &polygon->tri[a].ver3;
-		vMax = &polygon->tri[a].ver1;
+		vMin = &triPack->ver2;
+		vMid = &triPack->ver3;
+		vMax = &triPack->ver1;
 	    }
 	}
 
-	//cout << vMid->y << endl;
-	//cout << vMin->y << endl;
-
 	vMid1(vMid10,vMin,vMid,vMax);
+	
+	half_triangle(ssl, triPack->tex_addr, triPack->tex_width,
+		      triPack->tex_height, vMin, vMid, vMid10);
 
-	half_triangle(ssl,polygon->tri[a].tex_addr,polygon->tri[a].tex_width,polygon->tri[a].tex_height,vMin,vMid,vMid10);
-	half_triangle(ssl,polygon->tri[0].tex_addr,polygon->tri[0].tex_width,polygon->tri[0].tex_height,vMax,vMid,vMid10);
-	//printf("x:%d y:%d end:%d z:%f zpos:%f\n",sp->span[0].x,sp->span[0].y,sp->span[0].length_x,sp->span[0].start_z , sp->span[0].end_z);
+	half_triangle(ssl, polygon->tri[0].tex_addr, polygon->tri[0].tex_width,
+		      polygon->tri[0].tex_height, vMax, vMid, vMid10);
     }
-    //printf("create_span  x:%d y:%d end:%d z:%f zpos:%f\n",sp->span[0].x,sp->span[0].y,sp->span[0].length_x,sp->span[0].start_z , sp->span[0].end_z);
+
+    fill(ssl);
+    
     return 0;
-
-    //return sizeof(SPANPACKLIST);
 }