Mercurial > hg > Game > Cerium
changeset 862:1cc2b1ae4f05 draft
add file
author | yutaka@localhost.localdomain |
---|---|
date | Fri, 18 Jun 2010 16:09:51 +0900 |
parents | fda7b71c3cc6 |
children | 912586d3c6c3 |
files | Renderer/Engine/spe/CreatePolygon.cc Renderer/Engine/task/CreatePolygon.cc Renderer/Engine/task/CreatePolygon.h |
diffstat | 3 files changed, 309 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Renderer/Engine/spe/CreatePolygon.cc Fri Jun 18 16:09:51 2010 +0900 @@ -0,0 +1,150 @@ +#include "CreatePolygon.h" + +SchedDefineTask(CreatePolygon); + +static void +ApplyMatrix(float *v, float *m) +{ + float t[4]; + + t[0] = v[0]; + t[1] = v[1]; + t[2] = v[2]; + t[3] = v[3]; + + for (int i = 0; i < 4; i++) { + v[i] = t[0]*m[i] + t[1]*m[i+4] + t[2]*m[i+8] + t[3]*m[i+12]; + } +} + +static void +ApplyNormalMatrix(float *v, float *m) +{ + float t[4]; + + t[0] = v[0]; + t[1] = v[1]; + t[2] = v[2]; + + for (int i = 0; i < 3; i++) { + v[i] = t[0]*m[i] + t[1]*m[i+4] + t[2]*m[i+8]; + } +} + + +static int +run(SchedTask *smanager, void *rbuf, void *wbuf) +{ + + TrianglePack *sg_tri = (TrianglePack*)smanager->get_input(0); + texture_list *sg_texture_info = (texture_list*)smanager->get_input(1); + float *sg_matrix = (float*)smanager->get_input(2); + TrianglePack *pp_tri = (TrianglePack*)smanager->get_output(0); + int *tri_num = (int*)smanager->get_param(0); + + float *matrix = sg_matrix; + float *real_matrix = sg_matrix + 16; + + float xyz1[4], xyz2[4], xyz3[4]; + float normal1[4],normal2[4],normal3[4]; + + for (int i = 0; i < *tri_num; i++) { + + TrianglePack *pp_cur_tri = &pp_tri[i]; + TrianglePack *sg_cur_tri = &sg_tri[i]; + + xyz1[0] = sg_cur_tri->ver1.x; + xyz1[1] = sg_cur_tri->ver1.y; + xyz1[2] = sg_cur_tri->ver1.z*-1.0f; + xyz1[3] = 1.0f; + + xyz2[0] = sg_cur_tri->ver2.x; + xyz2[1] = sg_cur_tri->ver2.y; + xyz2[2] = sg_cur_tri->ver2.z*-1.0f; + xyz2[3] = 1.0f; + + xyz3[0] = sg_cur_tri->ver3.x; + xyz3[1] = sg_cur_tri->ver3.y; + xyz3[2] = sg_cur_tri->ver3.z*-1.0f; + xyz3[3] = 1.0f; + + // matrix = 回転行列*透視変換行列 + ApplyMatrix(xyz1, matrix); + ApplyMatrix(xyz2, matrix); + ApplyMatrix(xyz3, matrix); + + xyz1[0] /= xyz1[2]; + xyz1[1] /= xyz1[2]; + xyz2[0] /= xyz2[2]; + xyz2[1] /= xyz2[2]; + xyz3[0] /= xyz3[2]; + xyz3[1] /= xyz3[2]; + + pp_cur_tri->ver1.x = xyz1[0]; + pp_cur_tri->ver1.y = xyz1[1]; + pp_cur_tri->ver1.z = xyz1[2]; + pp_cur_tri->ver1.tex_x = sg_cur_tri->ver1.tex_x; + pp_cur_tri->ver1.tex_y = sg_cur_tri->ver1.tex_y; + + pp_cur_tri->ver2.x = xyz2[0]; + pp_cur_tri->ver2.y = xyz2[1]; + pp_cur_tri->ver2.z = xyz2[2]; + pp_cur_tri->ver2.tex_x = sg_cur_tri->ver2.tex_x; + pp_cur_tri->ver2.tex_y = sg_cur_tri->ver2.tex_y; + + pp_cur_tri->ver3.x = xyz3[0]; + pp_cur_tri->ver3.y = xyz3[1]; + pp_cur_tri->ver3.z = xyz3[2]; + pp_cur_tri->ver3.tex_x = sg_cur_tri->ver3.tex_x; + pp_cur_tri->ver3.tex_y = sg_cur_tri->ver3.tex_y; + + normal1[0] = sg_cur_tri->normal1.x; + normal1[1] = sg_cur_tri->normal1.y; + normal1[2] = sg_cur_tri->normal1.z*-1.0f; + normal1[3] = 0.0f; + + normal1[0] = sg_cur_tri->normal2.x; + normal1[1] = sg_cur_tri->normal2.y; + normal1[2] = sg_cur_tri->normal2.z*-1.0f; + normal1[3] = 0.0f; + + normal1[0] = sg_cur_tri->normal3.x; + normal1[1] = sg_cur_tri->normal3.y; + normal1[2] = sg_cur_tri->normal3.z*-1.0f; + normal1[3] = 0.0f; + + ApplyNormalMatrix(normal1,real_matrix); + ApplyNormalMatrix(normal2,real_matrix); + ApplyNormalMatrix(normal3,real_matrix); + + normal1[0] /= normal1[2]; + normal1[1] /= normal1[2]; + + normal2[0] /= normal2[2]; + normal2[1] /= normal2[2]; + + normal3[0] /= normal3[2]; + normal3[1] /= normal3[2]; + + pp_cur_tri->normal1.x = normal1[0]; + pp_cur_tri->normal1.y = normal1[1]; + pp_cur_tri->normal1.z = normal1[2]; + + pp_cur_tri->normal2.x = normal2[0]; + pp_cur_tri->normal2.y = normal2[1]; + pp_cur_tri->normal2.z = normal2[2]; + + pp_cur_tri->normal3.x = normal3[0]; + pp_cur_tri->normal3.y = normal3[1]; + pp_cur_tri->normal3.z = normal3[2]; + + pp_cur_tri->tex_info.addr = sg_texture_info->pixels; + pp_cur_tri->tex_info.width = sg_texture_info->t_w; + pp_cur_tri->tex_info.height = sg_texture_info->t_h; + pp_cur_tri->tex_info.scale_max = sg_texture_info->scale_max; + + } + + return 0; + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Renderer/Engine/task/CreatePolygon.cc Fri Jun 18 16:09:51 2010 +0900 @@ -0,0 +1,150 @@ +#include "CreatePolygon.h" + +SchedDefineTask(CreatePolygon); + +static void +ApplyMatrix(float *v, float *m) +{ + float t[4]; + + t[0] = v[0]; + t[1] = v[1]; + t[2] = v[2]; + t[3] = v[3]; + + for (int i = 0; i < 4; i++) { + v[i] = t[0]*m[i] + t[1]*m[i+4] + t[2]*m[i+8] + t[3]*m[i+12]; + } +} + +static void +ApplyNormalMatrix(float *v, float *m) +{ + float t[4]; + + t[0] = v[0]; + t[1] = v[1]; + t[2] = v[2]; + + for (int i = 0; i < 3; i++) { + v[i] = t[0]*m[i] + t[1]*m[i+4] + t[2]*m[i+8]; + } +} + + +static int +run(SchedTask *smanager, void *rbuf, void *wbuf) +{ + + TrianglePack *sg_tri = (TrianglePack*)smanager->get_input(0); + texture_list *sg_texture_info = (texture_list*)smanager->get_input(1); + float *sg_matrix = (float*)smanager->get_input(2); + TrianglePack *pp_tri = (TrianglePack*)smanager->get_output(0); + int *tri_num = (int*)smanager->get_param(0); + + float *matrix = sg_matrix; + float *real_matrix = sg_matrix + 16; + + float xyz1[4], xyz2[4], xyz3[4]; + float normal1[4],normal2[4],normal3[4]; + + for (int i = 0; i < *tri_num; i++) { + + TrianglePack *pp_cur_tri = &pp_tri[i]; + TrianglePack *sg_cur_tri = &sg_tri[i]; + + xyz1[0] = sg_cur_tri->ver1.x; + xyz1[1] = sg_cur_tri->ver1.y; + xyz1[2] = sg_cur_tri->ver1.z*-1.0f; + xyz1[3] = 1.0f; + + xyz2[0] = sg_cur_tri->ver2.x; + xyz2[1] = sg_cur_tri->ver2.y; + xyz2[2] = sg_cur_tri->ver2.z*-1.0f; + xyz2[3] = 1.0f; + + xyz3[0] = sg_cur_tri->ver3.x; + xyz3[1] = sg_cur_tri->ver3.y; + xyz3[2] = sg_cur_tri->ver3.z*-1.0f; + xyz3[3] = 1.0f; + + // matrix = 回転行列*透視変換行列 + ApplyMatrix(xyz1, matrix); + ApplyMatrix(xyz2, matrix); + ApplyMatrix(xyz3, matrix); + + xyz1[0] /= xyz1[2]; + xyz1[1] /= xyz1[2]; + xyz2[0] /= xyz2[2]; + xyz2[1] /= xyz2[2]; + xyz3[0] /= xyz3[2]; + xyz3[1] /= xyz3[2]; + + pp_cur_tri->ver1.x = xyz1[0]; + pp_cur_tri->ver1.y = xyz1[1]; + pp_cur_tri->ver1.z = xyz1[2]; + pp_cur_tri->ver1.tex_x = sg_cur_tri->ver1.tex_x; + pp_cur_tri->ver1.tex_y = sg_cur_tri->ver1.tex_y; + + pp_cur_tri->ver2.x = xyz2[0]; + pp_cur_tri->ver2.y = xyz2[1]; + pp_cur_tri->ver2.z = xyz2[2]; + pp_cur_tri->ver2.tex_x = sg_cur_tri->ver2.tex_x; + pp_cur_tri->ver2.tex_y = sg_cur_tri->ver2.tex_y; + + pp_cur_tri->ver3.x = xyz3[0]; + pp_cur_tri->ver3.y = xyz3[1]; + pp_cur_tri->ver3.z = xyz3[2]; + pp_cur_tri->ver3.tex_x = sg_cur_tri->ver3.tex_x; + pp_cur_tri->ver3.tex_y = sg_cur_tri->ver3.tex_y; + + normal1[0] = sg_cur_tri->normal1.x; + normal1[1] = sg_cur_tri->normal1.y; + normal1[2] = sg_cur_tri->normal1.z*-1.0f; + normal1[3] = 0.0f; + + normal1[0] = sg_cur_tri->normal2.x; + normal1[1] = sg_cur_tri->normal2.y; + normal1[2] = sg_cur_tri->normal2.z*-1.0f; + normal1[3] = 0.0f; + + normal1[0] = sg_cur_tri->normal3.x; + normal1[1] = sg_cur_tri->normal3.y; + normal1[2] = sg_cur_tri->normal3.z*-1.0f; + normal1[3] = 0.0f; + + ApplyNormalMatrix(normal1,real_matrix); + ApplyNormalMatrix(normal2,real_matrix); + ApplyNormalMatrix(normal3,real_matrix); + + normal1[0] /= normal1[2]; + normal1[1] /= normal1[2]; + + normal2[0] /= normal2[2]; + normal2[1] /= normal2[2]; + + normal3[0] /= normal3[2]; + normal3[1] /= normal3[2]; + + pp_cur_tri->normal1.x = normal1[0]; + pp_cur_tri->normal1.y = normal1[1]; + pp_cur_tri->normal1.z = normal1[2]; + + pp_cur_tri->normal2.x = normal2[0]; + pp_cur_tri->normal2.y = normal2[1]; + pp_cur_tri->normal2.z = normal2[2]; + + pp_cur_tri->normal3.x = normal3[0]; + pp_cur_tri->normal3.y = normal3[1]; + pp_cur_tri->normal3.z = normal3[2]; + + pp_cur_tri->tex_info.addr = sg_texture_info->pixels; + pp_cur_tri->tex_info.width = sg_texture_info->t_w; + pp_cur_tri->tex_info.height = sg_texture_info->t_h; + pp_cur_tri->tex_info.scale_max = sg_texture_info->scale_max; + + } + + return 0; + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Renderer/Engine/task/CreatePolygon.h Fri Jun 18 16:09:51 2010 +0900 @@ -0,0 +1,9 @@ +#ifndef INCLUDED_CREATE_SPAN +#define INCLUDED_CREATE_SPAN + +#include "SchedTask.h" +#include "polygon_pack.h" +#include "SpanPack.h" +#include "texture.h" + +#endif