diff Renderer/Engine/SgChange.cc @ 656:d0b8860c17f8

remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
author hiroki@henri.cr.ie.u-ryukyu.ac.jp
date Wed, 25 Nov 2009 21:56:14 +0900
parents
children 9d1bcc07734b b7376415fa5f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Renderer/Engine/SgChange.cc	Wed Nov 25 21:56:14 2009 +0900
@@ -0,0 +1,166 @@
+#include <SDL.h>
+#include "SgChange.h"
+#include "viewer_types.h"
+#include "SceneGraph.h"
+#include "SceneGraphRoot.h"
+#include "scene_graph_pack.h"
+#include "sys.h"
+#include "Func.h"
+#include "error.h"
+#include "TaskManager.h"
+#include <wchar.h>
+#include "Pad.h"
+#include "Application.h"
+#include "lindaapi.h"
+
+static void post2runLoop(SchedTask *s,void *viewer,void *s1);
+
+/* measure for FPS (Frame Per Second) */
+int start_time;
+int this_time;
+int frames;
+
+/* Data Pack sent to Other CPUs (ex. SPE) */
+SceneGraphPack *sgpack;
+PolygonPack *ppack;
+SpanPackPtr spackList;
+SpanPackPtr *spackList_ptr;
+
+int spackList_length;
+int spackList_length_align;
+
+/**
+ *
+ */
+
+SgChange::SgChange(int b, int w, int h, int _num)
+{
+    bpp = b;
+    width = w;
+    height = h;
+    spe_num = _num;
+}
+
+int
+SgChange::get_ticks(void)
+{
+    int time;
+    time = SDL_GetTicks();
+    return time;
+}
+
+bool
+SgChange::quit_check(void)
+{
+    SDL_Event event;
+
+    while(SDL_PollEvent(&event)) {
+        if (event.type==SDL_QUIT) {
+            return true;
+        }
+    }
+
+    Uint8 *keys=SDL_GetKeyState(NULL);
+
+    if (keys[SDLK_q] == SDL_PRESSED) {
+        return true;
+    }
+
+    return false;
+}
+
+void
+SgChange::quit(void)
+{
+    SDL_Quit();
+}
+
+void
+SgChange::swap_buffers(void)
+{
+    SDL_GL_SwapBuffers();
+}
+
+
+void
+SgChange::run_init(TaskManager *manager, Application *app)
+{
+    this->manager = manager;
+
+    start_time = get_ticks();
+    this_time  = 0;
+    frames     = 0;
+
+    // ココ!
+    sgroot_A = new SceneGraphRoot(this->width, this->height);
+    sgroot_A->tmanager = manager;
+    sgroot_B = new SceneGraphRoot(this->width, this->height);
+    sgroot_B->tmanager = manager;
+
+    MainLoop *mainloop = app->init_only_sg(this, this->width, this->height);
+
+    mainloop->mainLoop();
+}
+
+void
+SgChange::mainLoop()
+{
+    HTaskPtr task_next = manager->create_task(Dummy);
+
+    task_next->set_post(&post2runLoop, (void *)this, 0); // set_post(function(this->run_loop()), NULL)
+    task_next->spawn();
+}
+
+static void
+post2runLoop(SchedTask *s, void *viewer_, void *arg)
+{
+    SgChange *viewer = (SgChange*)viewer_;
+    HTaskPtr task_next = viewer->manager->create_task(Dummy);
+    viewer->run_loop(task_next);
+
+    psx_sync_n();
+}
+
+void
+SgChange::exchange_sgroot()
+{
+    SceneGraphRoot *tmp;
+    tmp = sgroot_A;
+    sgroot_A = sgroot_B;
+    sgroot_B = tmp;
+}
+
+void
+SgChange::run_loop(HTaskPtr task_next)
+{
+    bool quit_flg;
+    quit_flg = quit_check();
+    if (quit_flg == true) {
+        this_time = get_ticks();
+        run_finish();
+        return;
+    }
+
+    sgroot_A->allExecute(width, height);
+    exchange_sgroot();
+
+    //printf("Sgroot = %x\n", sgroot_A);
+
+    task_next->set_post(&post2runLoop, (void *)this, 0);
+    task_next->spawn();
+}
+
+
+void
+SgChange::run_finish(void)
+{
+    if (this_time != start_time) {
+        printf("%f FPS\n", (((float)frames)/(this_time-start_time))*1000.0);
+    }
+
+    delete sgroot_A;
+    delete sgroot_B;
+    quit();
+}
+
+/* end */