Advertisement
Caiwan

engine.cpp

Mar 20th, 2012
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.40 KB | None | 0 0
  1. #include "engine.h"
  2.  
  3. // Joined engine code
  4. #include "components.h"
  5. #include "textureLoader.h"
  6.  
  7. ////////////////////////////////////////////////////////////////////////////////
  8. // CORE
  9. ////////////////////////////////////////////////////////////////////////////////
  10.  
  11. using namespace NGcommon;
  12.  
  13. FWutils::package* NGcommon::MainPackage;
  14. NGcomp::timer* NGcommon::mainTimer;
  15. NGcomp::tracker* NGcommon::valTracker;
  16.  
  17. namespace{
  18.     array_t<unsigned char>  bBuffer1, bBuffer2; // reserved for file buffers
  19.    
  20.     typedef array_t<NGcommon::item*> renderStorage_t;
  21.     typedef renderStorage_t* renderStack_t;
  22.  
  23.     renderStack_t cameraStack;
  24.     renderStack_t lightStack;
  25.     //renderStack_t frameBufferStack;
  26.     //renderStack_t shaderStack;
  27.     renderStack_t renderingStack;
  28.    
  29.     int sumItemCounter;
  30.  
  31.     // FUNCTION TABLE FOR RENDERING
  32.     //resloveFX_t function_table[256];
  33.    
  34.     //inline void setFXtable(int id, f_fetch *pFetch, f_render *pRender, f_delete *pDelete){
  35.     //  function_table[id].pDelete = pDelete;
  36.     //  function_table[id].pFetch = pFetch;
  37.     //  //function_table[id].pInit = pInit;
  38.     //  function_table[id].pRender = pRender;
  39.     //}
  40.  
  41.     //void buildFXtable(){
  42.     //  for (int i=0; i<256; i++){
  43.     //      setFXtable(i, NULL, NULL, NULL);
  44.     //  }
  45.     //  setFXtable((int)ABT_clear,      fetch_ClearColour,  render_ClearColour, denstroy_ClearColour);
  46.     //  setFXtable((int)ABT_skybox,     fetch_Skybox,       render_Skybox,      denstroy_Skybox);
  47.     //  setFXtable((int)ABT_camera,     fetch_Camera,       render_Camera,      denstroy_Camera);
  48.     //  setFXtable((int)ABT_light,      fetch_Light,        render_Light,       denstroy_Light);
  49.  
  50.     //  setFXtable((int)ABT_sprite,     fetch_Sprite,       render_Sprite,      denstroy_Sprite);
  51.  
  52.     //  setFXtable((int)ABT_model_3ds,  fetch_Model3DS,     render_Model,       denstroy_Model3DS);
  53.  
  54.     //  NGloader::initTextureLoader();
  55.     //}
  56.  
  57.     renderStack_t* _rendering_queue[] = {
  58.         &cameraStack,
  59.         &lightStack,
  60.         &renderingStack,
  61.         NULL    // MUST end w/ NULL !!!
  62.     };
  63.  
  64.     /// SHADOWS
  65.     //FWrender::texture *depthMapTexture = NULL;
  66.     bool using_depthmap = false;
  67.     FWrender::fbo *depthMap = NULL;
  68.     FWmodel::sprite *depthSprite = NULL;
  69.    
  70.     /// FULL SCREEN COLOR MAP for postfx
  71.     bool using_colormap = false;
  72.     FWrender::fbo *frameColorMap = NULL;
  73.     FWmodel::sprite *frameColorSprite = NULL;
  74.  
  75.     // init fx
  76.     inline void _setupDepthMap(){
  77.         int h = FWrender::getHeight();
  78.         int w = FWrender::getWidth();
  79.         float sx = (float)h/2048.0;
  80.         float sy = (float)w/2048.0;
  81.         depthMap = new FWrender::fbo(0,1,0);    // teszu~
  82.  
  83.         depthSprite = new FWmodel::sprite();
  84.         depthSprite->setPosMode(0);
  85.         depthSprite->setSize(w, h);
  86.         depthSprite->setTexCoord(sx, 0.0, 0.0, sy);
  87.         depthSprite->setTex(depthMap->getDepthTexture());
  88.     }
  89.    
  90.     inline void _setupColorMap(){
  91.         int h = FWrender::getHeight();
  92.         int w = FWrender::getWidth();
  93.         float sx = (float)h/2048.0;
  94.         float sy = (float)w/2048.0;
  95.        
  96.         frameColorMap = new FWrender::fbo(2,1,0);
  97.         //frameColorMap = new FWrender::fbo(1,1,0);
  98.  
  99.         frameColorSprite = new FWmodel::sprite();
  100.         frameColorSprite->setPosMode(0);
  101.         frameColorSprite->setSize(w, h);
  102.         frameColorSprite->setTexCoord(sx, 0.0, 0.0, sy);
  103.         frameColorSprite->setTex(frameColorMap->getColorTexture(0));
  104.     }
  105.    
  106.     //////////////////////////////////////////
  107.     NGcommon::drawShader *testshader = NULL;
  108.     FWrender::texture rnd_normal;
  109.    
  110.     int __seed = 0x9001, __step = 0x1000, __start = 128;
  111.     int __pseudorandom(){
  112.         __start *= __seed;
  113.         __start += __step;
  114.         __start = __start % 256;
  115.         return __start;
  116.     }
  117.  
  118. #define RANDOM_NORMAL_MAP_SIZE 16
  119.  
  120.     void __setupshader(){
  121.         //FWtexture::bitmap *bmp = new FWtexture::bitmap(RANDOM_NORMAL_MAP_SIZE,RANDOM_NORMAL_MAP_SIZE,3);
  122.         FWtexture::bitmap *bmp = new FWtexture::bitmap();
  123.         //unsigned char *ptr = bmp->getP();
  124.         //for (int i=0; i<RANDOM_NORMAL_MAP_SIZE*RANDOM_NORMAL_MAP_SIZE; i++) { ptr[i] = (unsigned char)__pseudorandom(); }
  125.  
  126.         NGcommon::MainPackage->getFile("textures/noise.png", bBuffer1);
  127.         bmp->loadMemImage(bBuffer1.data, bBuffer1.size);
  128.  
  129.         bBuffer1.clear();
  130.  
  131.         bmp->genOGLTexture(&rnd_normal);
  132.  
  133.         testshader = new NGcommon::drawShader("basic_ssao.vert", "ssao.frag");
  134.         testshader->fetch();
  135.  
  136.         delete bmp;
  137.     }
  138.     //////////////////////////////////////////
  139.     void loaderScreen(float p){
  140.         FWrender::clearScene(p*p,p*p,p,1);
  141.         FWrender::flush();
  142.     }
  143. }
  144.  
  145. void NGcore::loadPackage(char *filename){
  146.     try {
  147.         MainPackage = new FWutils::package(filename);
  148.     } catch (int e){
  149.         MessageBox (HWND_DESKTOP, FWerror::translateMessage(e), "Engine halted", MB_OK | MB_ICONEXCLAMATION);
  150.         FWcore::releaseFw(e);
  151.     }
  152.    
  153. }
  154.  
  155. void NGcore::init(){
  156.     FWcore::initFw();
  157.  
  158.     loaderScreen(0.0);
  159.  
  160.     sumItemCounter = 0;
  161.  
  162.     // setup rendering stacks
  163.     renderStack_t **activeStackPointer = _rendering_queue;
  164.  
  165.     while (activeStackPointer[0]){
  166.         activeStackPointer[0][0] = new renderStorage_t;
  167.         activeStackPointer++;
  168.     }
  169.  
  170.     NGloader::initTextureLoader();
  171.  
  172.     //buildFXtable();
  173.    
  174.     try {
  175.         init_ClearColour();
  176.  
  177.     } catch (int e){
  178.         MessageBox (HWND_DESKTOP, FWerror::translateMessage(e), "Engine halted", MB_OK | MB_ICONEXCLAMATION);
  179.         FWcore::releaseFw(e);
  180.     }
  181.  
  182. }
  183.  
  184. void NGcore::fetchPrecalc(){
  185.     try {
  186.         //////////// LOADER /////////////
  187.        
  188.         loaderScreen(0.0);
  189.  
  190.         // Fetch fixed functions
  191.         fetch_ClearColour();
  192.        
  193.         _setupDepthMap();
  194.         _setupColorMap();
  195.  
  196.         __setupshader();
  197.  
  198.         // Fetch rendering stack
  199.         renderStack_t **activeStackPointer = _rendering_queue;
  200.        
  201.         while (activeStackPointer[0]){
  202.             renderStack_t activeStack = activeStackPointer[0][0];
  203.             int s = activeStack->size;
  204.             for (int i=0; i<s; i++){
  205.                
  206.                 NGcommon::item* actual = activeStack->data[i];
  207.                 if (!actual) throw (FW_ERROR_UNKNOWN);
  208.                 int tyd = 0; int id = 0;
  209.                 actual->get(id, tyd);
  210.                
  211.                 actual->_fetch();
  212.                 actual->fetch();
  213.                
  214.                 loaderScreen((float)(i)/(float)(s));
  215.             }
  216.  
  217.             activeStackPointer++;
  218.         }
  219.     } catch (int e){
  220.         MessageBox (HWND_DESKTOP, FWerror::translateMessage(e), "Engine halted", MB_OK | MB_ICONEXCLAMATION);
  221.         FWcore::releaseFw(e);
  222.     }
  223. }
  224.  
  225. void NGcore::play(){
  226.     render_ClearColour();
  227.  
  228.     mainTimer->play();
  229.     try {
  230.         bool exit = false;
  231.         do{
  232.             valTracker->update();
  233.  
  234.             render_ClearColour();
  235.             //depthMap->bind();
  236.             //http://stackoverflow.com/questions/2171085/opengl-blending-with-previous-contents-of-framebuffer
  237.  
  238.             frameColorMap->bind();
  239.             {
  240.                 render_ClearColour();
  241.                
  242.                 renderStack_t **activeStackPointer = _rendering_queue;
  243.  
  244.                 while (activeStackPointer[0]){
  245.                     renderStack_t activeStack = activeStackPointer[0][0];
  246.  
  247.                     // SELECT {RENDER, PROCESS} of the following layers
  248.  
  249.                     for (int i=0; i<activeStack->size; i++){
  250.                         NGcommon::item* actual = activeStack->data[i];
  251.                         if (!actual) throw (FW_ERROR_UNKNOWN);
  252.                         int tyd = 0; int id = 0;
  253.                         actual->get(id, tyd);
  254.                        
  255.                         // select RENDER OR CALC
  256.                         // RENDER
  257.                         //if (function_table[tyd].pRender) function_table[tyd].pRender((void*) actual);
  258.                         actual->draw();
  259.                     }
  260.                     activeStackPointer++;
  261.                 }
  262.  
  263.                 // FLUSH PASS  
  264.             }
  265.  
  266. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  267. //POSTFX
  268. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  269. //SKIP_RENDER:
  270.            
  271.            
  272.             //depthMap->unbind();
  273.             frameColorMap->unbind();
  274.            
  275.             render_ClearColour();
  276.            
  277.             testshader -> bind();
  278.            
  279.             frameColorSprite->setTex(0, frameColorMap->getColorTexture(0));
  280.             frameColorSprite->setTex(1, frameColorMap->getColorTexture(1));
  281.             frameColorSprite->setTex(2, frameColorMap->getDepthTexture());
  282.             frameColorSprite->setTex(3, &rnd_normal);
  283.  
  284.             testshader->getShaderP()->set("tex0", 0);
  285.             testshader->getShaderP()->set("normal", 1);
  286.             testshader->getShaderP()->set("depth", 2);
  287.             testshader->getShaderP()->set("rnm", 3);
  288.  
  289.             frameColorSprite->draw();
  290.             //depthSprite->draw();
  291.             testshader -> unbind();
  292.  
  293. ////////////////////////////////////////////////////////////////////////////////////////////////////////////           
  294.             // END OF RENDER
  295.             FWrender::flush();
  296.             exit = FWcore::peekWndMessage() || mainTimer->getEnd();
  297.             //exit = 1; // TGL DBG
  298.        
  299.         } while (!exit);
  300.     } catch (int e){
  301.         MessageBox (HWND_DESKTOP, FWerror::translateMessage(e), "Engine halted", MB_OK | MB_ICONEXCLAMATION);
  302.         FWcore::releaseFw(e);
  303.     }
  304. }
  305.  
  306. void NGcore::release(){
  307.     if (MainPackage) delete MainPackage;
  308.     try {
  309.         //denstroy_ClearColour();
  310.        
  311.         renderStack_t **activeStackPointer = _rendering_queue;
  312.  
  313.         while (activeStackPointer[0]){
  314.             renderStack_t activeStack = activeStackPointer[0][0];
  315.  
  316.             for (int i=0; i<activeStack->size; i++){
  317.                 NGcommon::item* actual = activeStack->data[i];
  318.                 if (!actual) throw (FW_ERROR_UNKNOWN);
  319.                 int tyd = 0; int id = 0;
  320.                 actual->get(id, tyd);
  321.  
  322.                 //if (function_table[tyd].pDelete)
  323.                 //  function_table[tyd].pDelete((void*) actual);
  324.                 //else
  325.                
  326.                 delete actual;
  327.  
  328.                 activeStack->data[i] = NULL;
  329.             }
  330.             activeStackPointer++;
  331.         }
  332.  
  333.         _MEMORY_SET_ROW_ renderingStack->clear();
  334.  
  335.         delete renderingStack;
  336.  
  337.         NGcomp::releasePlayer();
  338.        
  339.         _MEMORY_SET_ROW_ bBuffer1.clear();
  340.         //_MEMORY_SET_ROW_ bBuffer2.clear();
  341.        
  342.         // delete buffer objects
  343.         delete depthMap;
  344.         delete depthSprite;
  345.         delete frameColorMap;
  346.         delete frameColorSprite;
  347.  
  348.         FWcore::releaseFw(0);
  349.     } catch (int e){
  350.         MessageBox (HWND_DESKTOP, FWerror::translateMessage(e), "Engine halted", MB_OK | MB_ICONEXCLAMATION);
  351.         FWcore::releaseFw(e);
  352.     }
  353. }
  354.  
  355. ////////////////////////////////////////////////////////////////////////////////
  356. // COMPONENTS
  357. ////////////////////////////////////////////////////////////////////////////////
  358. namespace {
  359.     array_t<unsigned char>  bMusic;
  360. }
  361. void NGcomp::setPlayer(char* filename, double bpm, int rpb){
  362.     try {
  363.         if (!MainPackage) throw(NG_ERROR_PACAGE_NOPK);;
  364.         char tmp[256];
  365.         sprintf(tmp,"sfx/%s",filename);
  366.         MainPackage->getFile(tmp,bMusic);
  367.         mainTimer = new NGcomp::timer(bpm, rpb, bMusic.data, bMusic.size);
  368.         //_MEMORY_SET_ROW_ bBuffer1.clear();    // FAIL
  369.         valTracker = new NGcomp::tracker(mainTimer);
  370.     } catch (int e){
  371.         MessageBox (HWND_DESKTOP, FWerror::translateMessage(e), "Engine halted", MB_OK | MB_ICONEXCLAMATION);
  372.         FWcore::releaseFw(e);
  373.     }
  374. }
  375. void NGcomp::setPlayer(double len, char* filename, double bpm, int rpb){
  376.     try {
  377.         if (!MainPackage) throw (NG_ERROR_PACAGE_NOPK);
  378.         char tmp[256];
  379.         sprintf(tmp,"sfx/%s",filename);
  380.         MainPackage->getFile(tmp,bMusic);
  381.         mainTimer = new NGcomp::timer(len, bpm, rpb, bMusic.data, bMusic.size);
  382.         //_MEMORY_SET_ROW_ bBuffer1.clear();    // FAIL
  383.         valTracker = new NGcomp::tracker(mainTimer);
  384.     } catch (int e){
  385.         MessageBox (HWND_DESKTOP, FWerror::translateMessage(e), "Engine halted", MB_OK | MB_ICONEXCLAMATION);
  386.         FWcore::releaseFw(e);
  387.     }
  388. }
  389.  
  390. void NGcomp::releasePlayer(){
  391.     _MEMORY_SET_ROW_ bMusic.clear();
  392.    
  393.     if (valTracker) delete valTracker;
  394.     if (mainTimer) delete mainTimer;
  395. }
  396.  
  397. void NGcomp::pushStack(void* d){
  398.     item * dd = static_cast<item*> (d);
  399.    
  400.     // select render stack
  401.     int tyd = 0, id = 0; dd->get(id, tyd);
  402.     array_t<NGcommon::item*>* activeStack;
  403.  
  404.     switch(tyd) {
  405.         case (int)ABT_camera:
  406.             activeStack = cameraStack;
  407.             break;
  408.         case (int)ABT_light:
  409.             activeStack = lightStack;
  410.             break;
  411.         //case (int)ABT_shader:
  412.         //  activeStack = shaderStack;
  413.         //  break;
  414.         default:
  415.             activeStack = renderingStack;
  416.             break;
  417.     }
  418.    
  419.     // copy ptr to stack
  420.     _MEMORY_SET_ROW_ activeStack->insert(1);
  421.     int index = activeStack->size-1;
  422.    
  423.     activeStack->data[index] = dd; //(NGcommon::item*) d;
  424.  
  425.     sumItemCounter++;
  426. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement