Mercurial > hg > Members > kono > Cerium
diff Renderer/Engine/viewer.cc @ 860:649e4cb84683
Still on the way
author | yutaka@localhost.localdomain |
---|---|
date | Fri, 18 Jun 2010 01:30:06 +0900 |
parents | f7276b509710 |
children | 000a8b63ad9a |
line wrap: on
line diff
--- a/Renderer/Engine/viewer.cc Thu Jun 17 04:46:25 2010 +0900 +++ b/Renderer/Engine/viewer.cc Fri Jun 18 01:30:06 2010 +0900 @@ -437,8 +437,99 @@ } void +Viewer::create_pp_task(SceneGraphPtr sg, PolygonPackPtr pp_cur, HTaskPtr create_pp_wait, + int &pp_index, int &sg_index, int tri_num) +{ + + HTaskPtr create_pp = manager->create_task(CreatePolygon); + create_pp->set_inData(0, &sg->tri_pack[sg_index], sizeof(TrianglePack)*tri_num); + create_pp->set_inData(1, sg->texture_info, sizeof(texture_list)); + create_pp->set_inData(2, sg->sg_matrix, sizeof(float)*32); //わーい、マジックナンバー + create_pp->set_outData(0, &pp_cur->tri[pp_index], sizeof(TrianglePack)*tri_num); + create_pp->set_param(0, (memaddr)tri_num); + //create_pp->set_cpu(SPE_ANY); + create_pp_wait->wait_for(create_pp); + create_pp->spawn(); + + pp_index += tri_num; + sg_index += tri_num; +} + + +void Viewer::common_rendering(HTaskPtr task_next, SceneGraphRoot *sgroot) { + +#if SPE_CREATE_POLYGON + + SceneGraphPtr sg = sgroot->getDrawSceneGraph(); + PolygonPackPtr pp_cur = ppack; + HTaskPtr create_pp_wait = manager->create_task(Dummy); + int pp_index = 0; + + while (sg) { + + if (sg->flag_drawable) { + + int sum_size = sg->size; + int tri_cur_num = MAX_SIZE_TRIANGLE; + int sg_index = 0; + + while (sum_size) { + + tri_cur_num -= sg->size/3; + + if (tri_cur_num < 0) { + + tri_cur_num = MAX_SIZE_TRIANGLE; + create_pp_task(sg, pp_cur, create_pp_wait, + pp_index, sg_index, tri_cur_num); + + PolygonPackPtr next = (PolygonPackPtr)manager->allocate(sizeof(PolygonPack)); + + pp_cur->next = next; + pp_cur = next; + pp_index = 0; + + } else { + + create_pp_task(sg, pp_cur, create_pp_wait, + pp_index, sg_index, tri_cur_num); + + } + + sum_size -= tri_cur_num*3; + + } + + + } + + + + if (sg->children != NULL) { + sg = sg->children; + } else if (sg->brother != NULL) { + sg = sg->brother; + } else { + while (sg) { + if (sg->brother != NULL) { + sg = sg->brother; + break; + } else { + if (sg->parent == NULL) { + sg = NULL; + break; + } else { + sg = sg->parent; + } + } + } + } + } + +#else + HTaskPtr task_create_pp = manager->create_task(CreatePolygonFromSceneGraph); // SceneGraph(木構造) -> PolygonPack @@ -487,8 +578,10 @@ task_create_sp->spawn(); } + task_create_pp->spawn(); - task_create_pp->spawn(); +#endif + } HTaskPtr @@ -568,7 +661,7 @@ int rangey = (starty + split_screen_h - 1 > this->height) ? this->height - starty + 1 : split_screen_h; -#if 1 +#if 0 if(spack->info.size > 0) {