Advertisement
Caiwan

main.cpp

Apr 30th, 2012
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.63 KB | None | 0 0
  1. /*
  2.     Ez a program belepesi pontja.
  3. */
  4. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  5. {
  6.     // Itt inicializaljuk a keretrndszert.
  7.     // Az init() feldobja az init ablakot, a beallitasoknak megfeleloen letrehoz egy ogl ablakot, beallitja a
  8.     // rendering contextust, illetve konfigolja a renderert is.
  9.     // A loadPackage() kijeloli, es betolti a csomagfilet, amibol minden filet fog osszeszedni automatikausan.
  10.     // Ez azert elonyos mert egyetlen "W.A.D." fileunk van, es nem tobb mint kilencezer. A csomagfile egy egyszeru
  11.     // zip (ejtsd: cip) file, amit egy zlib alapu 3rd party library kezel.
  12.     init();
  13.     loadPackage("testdata.zip");
  14.  
  15.     /******************************************
  16.      * DEMO INIT
  17.     ******************************************/
  18.     // Ebben a reszben inicializaljuk azokat az elemeket, amiket renderelni akarunk.
  19.     // Minden NGcommon::item osztalybol szarmazo osztaly peldanya egy olyan elemkent kerul ki, amit kivulrol
  20.     // egy un. value trackerbol lehet kapcsolgatni, hogy az adott elemet kirajzola-e vagy sem.
  21.     // TODO: noexport ficsor, mindent kezzel lehessen beallitani
  22.    
  23.     // Eloszor a frame buffer objekteket hozzuk letre. Ez arra jo, hogy az adott scene ne a kepernyo framebufferebe
  24.     // keruljon, hanem egy sajat, egyenileg kijelolt bufferbe. Tovabba egy idoben tobb kimenetre is lehet renderelni.
  25.     // Ezekre a post-effekt szamitasoknal illetve arnyek lekepezesekor van szukseg.
  26.     light_deptmap = new FWrender::fbo(0, 1, 0);
  27.     postfx_map = new FWrender::fbo(3, 1, 0);
  28.  
  29.     //Postfx
  30.     float w = FWrender::getWidth(), h = FWrender::getHeight();
  31.     float sx = h/2048, sy = w/2048;
  32.     postfx_sprite = new FWmodel::sprite();
  33.     postfx_sprite->setPosMode(1);
  34.     postfx_sprite->setSize(w, h);
  35.     postfx_sprite->setTexCoord(sx, 0.0, 0.0, sy);
  36.     postfx_sprite->setTex(0, postfx_map->getColorTexture(0));
  37.     postfx_sprite->setTex(1, postfx_map->getColorTexture(1));
  38.     postfx_sprite->setTex(2, postfx_map->getColorTexture(2));
  39.     postfx_sprite->setTex(3, postfx_map->getDepthTexture());
  40.  
  41.     postfx_shader = new drawShader("passthrough.vert", "postfx.frag");
  42.  
  43.     // Itt egy kamerat hozunk letre, amit kidrotozunk a value trackerre. Kesobbiekben legalabb 2-3 kamerat illik hasznalni
  44.     // hogy a kameravaltasok is elkeszithetok legyenek.
  45.     cam0 = new camera("cam0");
  46.     //cam1 = new camera("cam1");
  47.  
  48.     // Itt letrehozzuk a shadereket. Egy vertex - fragment paros ad ki egy shadert (csak egyik nem lehetseges). Ez arra kepes,
  49.     // hogy kezzel felul lehessen biralni a renderer fixed pipeline egy-egy szakaszat (vertex transzformacio, es raszterizalas)
  50.     // es ezzel latvanyosabb effekteket lehessen letrehozni, illetve poszt-effekteket implementalni.
  51.     phongshader   = new drawShader("basic.vert", "phong2.frag");
  52.     minimalshader = new drawShader("passthrough.vert", "passthrough.frag");
  53.  
  54.     // Itt egy skyboxot hozunk letre. A skybox gyakorlatilag egy doboz a vilag korul, a kamera kozeppontjaba transzformalva,
  55.     // depth- teszt es maszkolas nelkul. Egy skyboxra hat darab textura huzhato fel, minden egyes lapra.
  56.     //sky0 = new skybox("sky0","sky_01_top.jpg\0sky_01_bottom.jpg\0sky_01_left.jpg\0sky_01_right.jpg\0sky_01_front.jpg\0sky_01_back.jpg\0");
  57.     sky0 = new skybox("sky0","yklewu.png\0yklewu.png\0yklewu.png\0yklewu.png\0yklewu.png\0yklewu.png\0");
  58.  
  59.     // Ez lesz a feny.
  60.     light0 = new light("light0");
  61.    
  62.     // Betoltunk ket modellt filebol (kesobb lehetoseg lesz majd valahogy model, illetve textura generalasra is)
  63.     // Mivel nincsenek sajat modelek, ezert kiserletezesre egyelore kenytelen vagyok stock modelt hasznalni a MLP:FiM
  64.     // (ejtsd: nem akarod tudni mi) sorozatbol. De remelhetoleg lesz sajat model is egyszer, meg szeptember elott.
  65.     // Forras: http://fav.me/215266264
  66.     model0 = new model3ds("poni", "celestia.3ds");
  67.     padlo = new model3ds("fold", "kockaslap.3ds");
  68.  
  69.     // Ez pedig egy sprite lesz. A sprite egy melysegtol fuggetlenul elhelyezheto 2d-s lap egy texturaval.
  70.     ujkacsa = new sprite("ujduck", "brandneu.png");
  71.     //ujkacsa = new sprite("ujduck", "testGeneratedTexture");
  72.  
  73.     /******************************************
  74.     * Setup texture generator
  75.     ******************************************/
  76.     // Kiserleti jelleggel lehetoseg van textura generalasra, azonban az ezt megkonnyito eszkozok meg nem allnak
  77.     // rendelkezezesre. A lenyege, hogy egy listahoz hozza lehet adni, hogy melyik request nevnel hivjon meg egy
  78.     // fuggvenyt, es ne filebol keresse. A textura generator magasabb prioritasu a csomagkezelonel, igy lehetseges
  79.     // egyes fileokat overrideolni. (pl. noise.bmp, checker.png)
  80.     NGloader::textureLoader_pushProcTextureCallback("testGeneratedTexture", _testproc);
  81.  
  82.     /******************************************/
  83.     // Itt jon a player beallitasa, es a precalc. Az idozites a 3rd party zenelejatszora van bizva, igy remelhetoleg
  84.     // nem jon elo az a hiba, hogy elcsuszik a szinkron (vagy ami megtortent a compon, hogy elobb lepett ki az exe,
  85.     // mielott kellett volna) A value vagy sync trackerben (ami az Excess csapat GNU Rocket nevu toolja) az adat
  86.     // sorokra van osztva, es ezen sorok idejet hozza lehet igazitani a zene utemehez (mivel egy tendes trackerrol van szo)
  87.  
  88.     // Ezutan egy egyszeru for-ciklus vegigszalad a render elemek listajan, es betolt mindent, amit elore beallitottunk
  89.     // fent. Ekkor szalad vegig az ominozus betoltocsik is.
  90.     setPlayer("epsilon.mp3", 140, 8);
  91.     fetchPrecalc();
  92.  
  93.     /******************************************
  94.     * SETUP VALUE TRACKER
  95.     ******************************************/
  96.     // Ezen a reszen allitjuk be, hogy a value trackerbe milyen ertekeket lassunk, illetve miket allitunk be globalisan kezzel.
  97.     // Ez szigoruan a precalc utan tortenik, mivel a precalc elott meg nincs kesz a kontextus a value trackerrel, es
  98.     // access voilationt eredmenyez.
  99.  
  100.     // A modelnezeti matrix harom egysegvektorbol es egy origo pontbol all. Ebbe a koordinata rendszerbe kell transzformalni a
  101.     // vilagot, hogy a kamera szemszogebol lehessen latni. Ez lenyegesen le van egyszerusitve.
  102.     // Az 'eye' a szemkoordinata, ez lesz az origo
  103.     // A 'center' egy referencia pont, amivel a kamera iranyat lehet meghatoarozni.
  104.     // Ezen kivul van meg egy 'up' vektor, ami a fel mutato vektort adja meg. Ez a vektor szigoruan meroleges a eye-center
  105.     // egysegvektorara. Ha ez a vektor nem lenne, akkor nem lehetne a kamerat sem forgatni. Ez utobbit automatikusan felirja
  106.     // az api belso fuggvenye, amit mar tetszolegesen elforgathatunk.
  107.     cam0->exportCenter();
  108.     cam0->exportEye();
  109.     cam0->exportRotation();
  110.  
  111.     // Ez az a hatterszin, amire torli a kepernyot minden frame elott. Ez automatikusan letezik, es exportalhato.
  112.     NGcomp::exportClearColor();
  113.    
  114.     // A feny koordinatajat exportalja. Jelenleg omni (pont) fenyunk van.
  115.     light0->exportPosition();
  116.  
  117.     // Beallitja a sprite meretet, poziciojat exportalja.
  118.     // A sprite rajzolo rendelkezik egy olyan feature-rel, amivel megadhato, hogy a koordinata rendszert a kepernyon hova tolja
  119.     // illetve a spriteon belul a pozicio hol legyen.
  120.     ujkacsa->setSize(.5,.5);
  121.     //ujkacsa->setPosition(0,0);
  122.     ujkacsa->exportPosition();
  123.     ujkacsa->setAlignMode(POS_ALIGN_CENTER_BIT | POS_ALIGN_MIDDLE_BIT | ORIGN_ALIGN_CENTER_BIT | ORIGN_ALIGN_MIDDLE_BIT);
  124.  
  125.     // mainloop + release
  126.     // Itt jon maga a demo. A Playernek kijelol egy callback fuggvenyt, hogy azt hivja meg minden frame kirajzolasakor a mainloopba
  127.     // maga a mainloop ciklus el van rejtve, mivel par plusz dolgot is csinal, amit folosleges lekodolni ujra es ujra.
  128.     setPlayerCallback(play_callback);
  129.     // Itt indul a mainloop maga, es egeszen a kilepesig fut
  130.     play();
  131.  
  132.     // Itt mindent megolunk, amit fent letrehoztunk, es benne van a gabage collektorunkba
  133.     release();
  134.  
  135.     // Ide jonnek azon dolgok felszabaditasa, amik nincsenek benne a garbage kollektorba.
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement