# HG changeset patch # User tkaito # Date 1288886739 -32400 # Node ID 34a9ba655fbebdf8cba9df98b4da3c62ef569804 # Parent 46c54dd20d1cae98a0e28f5e86350ff0094fcd64 spe/CreatePolygonFromSceneGraph add. not done. diff -r 46c54dd20d1c -r 34a9ba655fbe Renderer/Engine/spe/CreatePolygonFromSceneGraph.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Renderer/Engine/spe/CreatePolygonFromSceneGraph.cc Fri Nov 05 01:05:39 2010 +0900 @@ -0,0 +1,162 @@ +/** + * SceneGraph が増えてくると動かなくなるかもしれない。 + * 一応 mainMem とかで動くようになるとは思うけど。 + * だめだったら、そこら辺が怪しいと思うべき + */ + +#include "CreatePolygonFromSceneGraph.h" +#include "polygon_pack.h" +#include "scene_graph_pack.h" + +SchedDefineTask(CreatePolygonFromSceneGraph); + +#define SG_PACK_LOAD 10 +#define SG_NODE_LOAD 11 +#define PP_LOAD 12 +#define PP_STORE 13 + +/** + * ベクトルに行列を乗算する + * @param[out] v vector (float[4]) + * @param[in] m matrix (float[16]) + */ +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) +{ + float xyz1[4], xyz2[4], xyz3[4]; + float normal1[4],normal2[4],normal3[4]; + + //coord_xyz, coord_tex, normal, matrix, real_matrix を受け取る + float *coord_xyz = (float)smanager->get_inData(0); + float *coord_tex = (float)smanager->get_inData(1); + float *normal = (float)smanager->get_inData(2); + float *matrix = (float)smanager->get_inData(3); + float *real_matrix = (float)smanager->get_inData(4); + TrianglePackPtr triangle = (TrianglePackPtr)smanager->get_inData(5); + + for (int i = 0; i < sg->size; i += 3) { + + xyz1[0] = coord_xyz[(i+0)*3]; + xyz1[1] = coord_xyz[(i+0)*3+1]; + xyz1[2] = coord_xyz[(i+0)*3+2]*-1.0f; + xyz1[3] = 1.0f; + + xyz2[0] = coord_xyz[(i+1)*3]; + xyz2[1] = coord_xyz[(i+1)*3+1]; + xyz2[2] = coord_xyz[(i+1)*3+2]*-1.0f; + xyz2[3] = 1.0f; + + xyz3[0] = coord_xyz[(i+2)*3]; + xyz3[1] = coord_xyz[(i+2)*3+1]; + xyz3[2] = coord_xyz[(i+2)*3+2]*-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]; + + triangle->ver1.x = xyz1[0]; + triangle->ver1.y = xyz1[1]; + triangle->ver1.z = xyz1[2]; + triangle->ver1.tex_x = coord_tex[(i+0)*3]; + triangle->ver1.tex_y = coord_tex[(i+0)*3+1]; + + triangle->ver2.x = xyz2[0]; + triangle->ver2.y = xyz2[1]; + triangle->ver2.z = xyz2[2]; + triangle->ver2.tex_x = coord_tex[(i+1)*3]; + triangle->ver2.tex_y = coord_tex[(i+1)*3+1]; + + triangle->ver3.x = xyz3[0]; + triangle->ver3.y = xyz3[1]; + triangle->ver3.z = xyz3[2]; + triangle->ver3.tex_x = coord_tex[(i+2)*3]; + triangle->ver3.tex_y = coord_tex[(i+2)*3+1]; + + normal1[0] = sg->normal[(i+0)*3]; + normal1[1] = sg->normal[(i+0)*3+1]; + normal1[2] = sg->normal[(i+0)*3+2]*-1.0f; + //normal1[3] = 1.0f; + normal1[3] = 0.0f; + + normal2[0] = sg->normal[(i+1)*3]; + normal2[1] = sg->normal[(i+1)*3+1]; + normal2[2] = sg->normal[(i+1)*3+2]*-1.0f; + //normal2[3] = 1.0f; + normal2[3] = 0.0f; + + normal3[0] = sg->normal[(i+2)*3]; + normal3[1] = sg->normal[(i+2)*3+1]; + normal3[2] = normal[(i+2)*3+2]*-1.0f; + //normal3[3] = 1.0f; + normal3[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]; + + triangle->normal1.x = normal1[0]; + triangle->normal1.y = normal1[1]; + triangle->normal1.z = normal1[2]; + + triangle->normal2.x = normal2[0]; + triangle->normal2.y = normal2[1]; + triangle->normal2.z = normal2[2]; + + triangle->normal3.x = normal3[0]; + triangle->normal3.y = normal3[1]; + triangle->normal3.z = normal3[2]; + + triangle->tex_info.addr = sg->texture_info.pixels; + triangle->tex_info.width = sg->texture_info.t_w; + triangle->tex_info.height = sg->texture_info.t_h; + triangle->tex_info.scale_max = sg->texture_info.scale_max; + } + return 0; +} diff -r 46c54dd20d1c -r 34a9ba655fbe Renderer/Engine/spe/CreatePolygonFromSceneGraph.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Renderer/Engine/spe/CreatePolygonFromSceneGraph.h Fri Nov 05 01:05:39 2010 +0900 @@ -0,0 +1,7 @@ +#ifndef INCLUDED_CREATE_POLYGON +#define INCLUDED_CREATE_POLYGON + +#include "SchedTask.h" + + +#endif diff -r 46c54dd20d1c -r 34a9ba655fbe Renderer/Engine/task/CreatePolygonFromSceneGraph.cc --- a/Renderer/Engine/task/CreatePolygonFromSceneGraph.cc Sun Oct 31 18:02:06 2010 +0900 +++ b/Renderer/Engine/task/CreatePolygonFromSceneGraph.cc Fri Nov 05 01:05:39 2010 +0900 @@ -120,7 +120,6 @@ pp->init(); } - TrianglePack *triangle = &pp->tri[pp->info.size++]; xyz1[0] = sg->coord_xyz[(i+0)*3]; xyz1[1] = sg->coord_xyz[(i+0)*3+1]; @@ -149,6 +148,8 @@ xyz3[0] /= xyz3[2]; xyz3[1] /= xyz3[2]; + TrianglePack *triangle = &pp->tri[pp->info.size++]; + triangle->ver1.x = xyz1[0]; triangle->ver1.y = xyz1[1]; triangle->ver1.z = xyz1[2]; diff -r 46c54dd20d1c -r 34a9ba655fbe Renderer/Engine/viewer.cc --- a/Renderer/Engine/viewer.cc Sun Oct 31 18:02:06 2010 +0900 +++ b/Renderer/Engine/viewer.cc Fri Nov 05 01:05:39 2010 +0900 @@ -634,6 +634,11 @@ MatrixListInfo *matrix_info = (MatrixListInfo*)manager->allocate(sizeof(MatrixListInfo)); collect_matrix(sg, matrix_info, manager); + /* + * SceneGraph を辿って coord_xyz, coord_tex, normal, matrix, real_matrix 及び、 + * PolygonPack の TrianglePack (空) を送る。pp->info.size の計算もここで。 + * + */ //HTaskPtr phase_wait = manager->create_task(Dummy); @@ -706,7 +711,6 @@ HTaskPtr game_task_array = sgroot->gtask_array->get_task_array(); task_create_pp->wait_for(game_task_array); } - task_next->wait_for(task_create_pp); #endif