diff Renderer/Engine/viewer.cc @ 792:f2497e0ecd7c

add light switch
author yutaka@localhost.localdomain
date Sun, 02 May 2010 04:17:34 +0900
parents 4455e7b0caf3
children c260205d3185
line wrap: on
line diff
--- a/Renderer/Engine/viewer.cc	Thu Apr 29 23:12:48 2010 +0900
+++ b/Renderer/Engine/viewer.cc	Sun May 02 04:17:34 2010 +0900
@@ -104,32 +104,52 @@
 
     sgroot = new SceneGraphRoot(this->width, this->height);
     sgroot->tmanager = manager;
-    
-    int size = sizeof(float)*4*4; //xyz+alfa(4) * light_num(4)
+
+
+    int light_num = 4;
+    int size = sizeof(float)*4*light_num; //xyz+alfa(4) * light_num(4)
     int light_size = size / sizeof(float);
 
     light_xyz_stock = (float *)manager->allocate(size);
     light_xyz = (float *)manager->allocate(size);
 
+
     for (int i = 0; i < light_size ; i++) {
       light_xyz[i] = 0.0f;
     }
 
-    HTaskPtr data_load;
-    data_load = manager->create_task(DataLoad);
-    data_load->set_param(0,(memaddr)size);
-    data_load->set_param(1,(memaddr)Light);
-    data_load->set_cpu((CPU_TYPE)((int)SPE_0));
-    data_load->spawn();
-    
-    for(int i = 1; i < spe_num; i++) {
-	data_load = manager->create_task(DataLoad);
+    for(int i = 0; i < spe_num; i++) {
+	HTaskPtr data_load = manager->create_task(DataLoad);
 	data_load->set_param(0,(memaddr)size);
 	data_load->set_param(1,(memaddr)Light);
 	data_load->set_cpu((CPU_TYPE)((int)SPE_0 + i));
 	data_load->spawn();
     }
 
+    size = light_num * sizeof(int);
+    light_switch = (int*)manager->allocate(size);
+    for (int i = 0; i < light_num; i++) {
+        light_switch[i] = 0;
+    }
+
+    for(int i = 0; i < spe_num; i++) {
+	HTaskPtr data_load = manager->create_task(DataLoad);
+	data_load->set_param(0,(memaddr)size);
+	data_load->set_param(1,(memaddr)LightSwitch);
+	data_load->set_cpu((CPU_TYPE)((int)SPE_0 + i));
+	data_load->spawn();
+    }
+
+    size = 16; // LightSysSwitch は 4byte. 残り 12byte は DMA転送の為のパディング
+
+    for(int i = 0; i < spe_num; i++) {
+	HTaskPtr data_load = manager->create_task(DataLoad);
+	data_load->set_param(0,(memaddr)size);
+	data_load->set_param(1,(memaddr)LightSysSwitch);
+	data_load->set_cpu((CPU_TYPE)((int)SPE_0 + i));
+	data_load->spawn();
+    }
+    
     MainLoop *mainloop = app->init(this, this->width, this->height);
     mainloop->mainLoop();
 }
@@ -181,6 +201,7 @@
 	task_tex->spawn();	
     }
 
+
     return task_next;
 }
 
@@ -302,6 +323,7 @@
     sgroot->updateControllerState();
     sgroot->allExecute(width, height);
     light_xyz_stock = sgroot->getLightVector();
+    light_switch_stock = sgroot->getLightSwitch();
     //sgroot->checkRemove();
 
     // ここから下は Rendering という関数にする
@@ -462,6 +484,25 @@
     task_create_pp->spawn();
 }
 
+HTaskPtr
+Viewer::update_task_create(void *data, int size, 
+			   int load_id, int spe_id, HTaskPtr wait)
+{
+
+	HTaskPtr data_update = manager->create_task(DataUpdate);
+	data_update->add_inData(data,size);
+	data_update->set_param(0,size);
+	data_update->set_param(1,load_id);
+	data_update->set_cpu((CPU_TYPE)(spe_id));
+	if (wait != NULL) {
+	  wait->wait_for(data_update);
+	}
+	data_update->spawn();
+
+	return data_update;
+
+}
+
 void
 Viewer::common_draw(HTaskPtr task_next)
 {
@@ -470,34 +511,44 @@
     //task_next = manager->create_task(Dummy);
     //task_next->set_post(post2runLoop, (void*)this);
 
-   //Light info update
+    //Light info update
                                                                    
     HTaskPtr data_update;
     HTaskPtr data_update_wait;
-    int size = sizeof(float)*4*4; //xyz+alfa(4) * light_num(4) 
+    int light_num = 4;
+    int size = sizeof(float)*4*light_num; //xyz+alpha(4) * light_num(4) 
     int light_size = size / sizeof(float);
 
     for (int i = 0; i < light_size; i++) {
-      light_xyz[i] = light_xyz_stock[i]; 
+        light_xyz[i] = light_xyz_stock[i]; 
     }
-    
+
+    for (int i = 0; i < light_num; i++) {
+        light_switch[i] = light_switch_stock[i];
+    }
+ 
     data_update_wait = manager->create_task(DataUpdate);
     data_update_wait->add_inData(light_xyz,size);
     data_update_wait->set_param(0,size);
     data_update_wait->set_param(1,Light);
     data_update_wait->set_cpu((CPU_TYPE)((int)SPE_0));
-
+      
     for (int i = 1; i < spe_num; i++) {
-	data_update = manager->create_task(DataUpdate);
-	data_update->add_inData(light_xyz,sizeof(float)*size);
-	data_update->set_param(0,size);
-	data_update->set_param(1,Light);
-	data_update->set_cpu((CPU_TYPE)((int)SPE_0 + i));
-	data_update_wait->wait_for(data_update);
-	data_update->spawn();
+      update_task_create(light_xyz,size,Light,(int)SPE_0+i,data_update_wait);
+    }
+
+    size = light_num * sizeof(int);
+
+    for (int i = 0; i < spe_num; i++) {
+      update_task_create(light_xyz,size,LightSwitch,(int)SPE_0+i,data_update_wait);
+    }
+
+    size = 16; // LightSysSwitch は 4byte. 残り 12byte は DMA転送の為のパディング
+
+    for (int i = 0; i < spe_num; i++) {
+      update_task_create(light_xyz,size,LightSysSwitch,(int)SPE_0+i,data_update_wait);
     }
     
-    data_update_wait->spawn();
 
     ppack->clear();
     for (int i = 0; i < spackList_length; i++) {
@@ -550,7 +601,9 @@
                 endx = this->width;
             }
         }
-    }   
+    } 
+
+    data_update_wait->spawn();  
 
 }