changeset 11:587baff06cbc

Initial revision
author akira
date Thu, 07 Feb 2008 19:17:06 +0900
parents 7aa4c006e4be
children 29e333952985 b658f8ca4408
files Renderer/DataPack/Test/SpanPack/main.cpp Renderer/DataPack/Test/SpanPack/polygonpack.cpp Renderer/DataPack/Test/SpanPack/polygonpack.h
diffstat 3 files changed, 224 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Renderer/DataPack/Test/SpanPack/main.cpp	Thu Feb 07 19:17:06 2008 +0900
@@ -0,0 +1,28 @@
+#include <iostream>
+#include "polygonpack.h"
+
+int main(int argc, char *argv[]) {
+	Polygon_Pack *akira = new Polygon_Pack();
+	 PolygonPack *hoge;
+	 SPANPACK *hoge2;
+	hoge->info.size =0;
+	hoge->tri[0].ver1.x = 34.345901;
+	hoge->tri[0].ver1.y = -26.347542;
+	hoge->tri[0].ver1.z = -1.079739;
+	hoge->tri[0].ver1.tex_x = 0.000000;
+	hoge->tri[0].ver1.tex_y = 1.000000;
+
+	hoge->tri[0].ver2.x = -9.054828;
+	hoge->tri[0].ver2.y = -36.410835;
+	hoge->tri[0].ver2.z = 21.616213;
+	hoge->tri[0].ver2.tex_x = 0.000000;
+	hoge->tri[0].ver2.tex_y = 0.000000;
+	
+	hoge->tri[0].ver3.x = -33.877331;
+	hoge->tri[0].ver3.y = -19.684675;
+	hoge->tri[0].ver3.z = -18.434740;
+	hoge->tri[0].ver3.tex_x = 1.000000;
+	hoge->tri[0].ver3.tex_y = 0.000000;
+	akira->create_span((void*)hoge,(void*)hoge2);
+	return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Renderer/DataPack/Test/SpanPack/polygonpack.cpp	Thu Feb 07 19:17:06 2008 +0900
@@ -0,0 +1,139 @@
+#include <iostream>
+#include "polygonpack.h"
+using namespace std;
+
+static float calc(float f1, float f2,int i, float base){
+	float ans;
+	ans = f1/f2*i + base;
+	return ans;
+}
+
+
+static vertex *vMid1(Vertex *vMid1,Vertex *vMin, Vertex *vMid, Vertex *vMax) {
+	float d,d1;
+	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);
+	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);
+	return vMid1;
+
+}
+
+
+int Polygon_Pack::create_span(void *wbuf,void *rbuf) {
+	POLYGONPACK *polygon = (POLYGONPACK*)wbuf;
+	SPANPACK *span = (SPANPACK*)rbuf;
+	Vertex *vMin, *vMid, *vMax, *vMid10;
+	Vertex ver;
+	vMid10 = &ver;
+	if(polygon->tri[0].ver1.y <= polygon->tri[0].ver2.y) {
+		if(polygon->tri[0].ver2.y <= polygon->tri[0].ver3.y) {
+			vMin = &polygon->tri[0].ver1;
+			vMid = &polygon->tri[0].ver2;
+			vMax = &polygon->tri[0].ver3;
+		} else if(polygon->tri[0].ver3.y <= polygon->tri[0].ver1.y) {
+			vMin = &polygon->tri[0].ver3;
+			vMid = &polygon->tri[0].ver1;
+			vMax = &polygon->tri[0].ver2;
+		} else {
+			vMin = &polygon->tri[0].ver1;
+			vMid = &polygon->tri[0].ver3;
+			vMax = &polygon->tri[0].ver2;
+		}
+	} else {
+		if(polygon->tri[0].ver1.y <= polygon->tri[0].ver3.y) {
+			vMin = &polygon->tri[0].ver2;
+			vMid = &polygon->tri[0].ver1;
+			vMax = &polygon->tri[0].ver3;
+		} else if(polygon->tri[0].ver3.y <= polygon->tri[0].ver2.y) {
+			vMin = &polygon->tri[0].ver3;
+			vMid = &polygon->tri[0].ver2;
+			vMax = &polygon->tri[0].ver1;
+		} else {
+			vMin = &polygon->tri[0].ver2;
+			vMid = &polygon->tri[0].ver3;
+			vMax = &polygon->tri[0].ver1;
+		}
+	}
+
+	cout << vMid->y << endl;
+
+	vMid1(vMid10,vMin,vMid,vMax);
+
+	half_triangle(polygon->tri[0].tex_addr,polygon->tri[0].tex_width,polygon->tri[0].tex_height,vMin,vMid,vMid10);
+	half_triangle(polygon->tri[0].tex_addr,polygon->tri[0].tex_width,polygon->tri[0].tex_height,vMax,vMid,vMid10);
+	return 0;	
+}
+
+
+void Polygon_Pack::half_triangle(long *tex_addr,long tex_width,long tex_height,Vertex *vMin, Vertex *vMid, Vertex *vMid1) {
+	float tmp_z,tmp_tex1, tmp_tex2 ,tmp_tey1,tmp_tey2;
+	float tmp_xpos,tmp_end,tmp_zpos;
+	int i,j;
+	float div_y;
+	float start_z,end_z;
+	float start_tex_x,end_tex_x,start_tex_y,end_tex_y;
+	int x,y,length;
+	int k =0;
+	int l = 1;
+	int start_y = (int)vMid->y;
+	int end_y   = (int)vMin->y; 
+	
+	if (start_y<end_y) { 
+		int i; i=end_y; end_y=start_y; start_y = i;   //y$B$NF~$lBX$((B 
+		k = 1;
+		l = -1;
+	}
+
+	div_y = start_y - end_y;  // > 0
+
+	for(i = k; i < div_y+1; i++) {
+		//$B$3$3$G(Bspan$B$N:8C<$H1&C<$N(Bx,z$B$r5a$a$F$k(B
+		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);
+		//$B$3$3$+$i(Bspan$B$N:8C<$H1&C<$KBP1~$9$k%F%/%9%A%c$r7W;;$9$k(B
+		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); 
+		if(tmp_xpos > tmp_end) {
+			x = (int)tmp_end;
+			y = (int)vMin->y + i*l;
+			length = (int)(tmp_xpos)-(int)(tmp_end)+1;
+			start_z = tmp_zpos;
+			end_z = tmp_z;
+			start_tex_x = tmp_tex2;
+			end_tex_x = tmp_tex1;
+			start_tex_y = tmp_tey2;
+			end_tex_y = tmp_tey1;
+		} else {
+			x = (int)tmp_xpos;
+			y = (int)vMin->y + i*l;
+			length = (int)(tmp_end)-(int)(tmp_xpos)+1;
+			start_z = tmp_z;
+			end_z = tmp_zpos;
+			start_tex_x = tmp_tex1;
+			end_tex_x = tmp_tex2;
+			start_tex_y = tmp_tey1;
+			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:%f\n",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);
+	}
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Renderer/DataPack/Test/SpanPack/polygonpack.h	Thu Feb 07 19:17:06 2008 +0900
@@ -0,0 +1,57 @@
+#ifndef INCLUDE_POLYGON_PACK
+#define INCLUDE_POLYGON_PACK
+
+
+typedef struct vertex {
+	float x;
+	float y;
+	float z;
+	float tex_x;
+	float tex_y;
+}Vertex, *Vertex_ptr;
+
+typedef struct Triangle {
+	long *tex_addr, tex_width, tex_height;
+	Vertex ver1;
+	Vertex ver2;
+	Vertex ver3;
+	//float x1, y1, z1, tex_x1, tex_y1;
+	//float x2, y2, z2, tex_x2, tex_y2;
+	//float x3, y3, z3, tex_x3, tex_y3;
+} TRIANGLEPACK, *TRIANGLEPACK_PTR;
+
+typedef struct PolygonPack {
+	struct PORIGON_INFO {
+		int size;
+		int light_pos[3];
+		int light_rgb[3];
+	}info;
+	TRIANGLEPACK tri[16];
+} POLYGONPACK,*POLYGONPACK_PTR;
+
+typedef struct Span {
+	long tex_addr, tex_width, tex_height;
+	int x, y, length_x;
+	float start_z, end_z;
+	float tex_x1, tex_x2, tex_y1, tex_y2;
+} SPAN, *SPNA_PTR;
+
+typedef struct SpanPack {
+	struct PORIGON_INFO {
+		int size;
+		int light_pos[3];
+		int light_rgb[3];
+	} info;
+	SPAN span[16];
+} SPANPACK, *SPANPACK_PTR;
+
+
+
+class Polygon_Pack {
+	public:
+		int create_span(void *wbuf, void *rbuf);
+		void half_triangle(long *tex_addr,long tex_width,long tex_height,Vertex *vMin, Vertex *vMid, Vertex *vMid1);
+};
+
+#endif
+