Rev Author Line No. Line
1 ovan 1 #include "GameCore.h"
2 #include "GameEngine.h"
3 #include "light.h"
4  
5 #include "../sleek/loader/texture_loader.h"
6  
7 using namespace sleek;
8 using namespace device;
9 #define number 100
10 namespace interne
11 {
12     void associate(gui::frame *i) noexcept;
13  
14     GameEngine::GameEngine(GameCore *mom) noexcept
15         : screen(mom->getDevice()), core(mom)
16     {
17         smgr = new sleek::scene3d::engine(screen, mom->getDriver());
18         rot = -10000;
19  
20         {
21             // load some texture
5 ovan 22             crate = mom->getLoader()->loadTexture("texture/item/crate.png");
23             bundul = mom->getLoader()->loadTexture("texture/item/add.bmp");
1 ovan 24             bundul->flipVertical();
25  
26             // create hardware link
27             crate->createIdentifier(mom->getContext());
28             bundul->setIdentifier(mom->getContext()->createTexture(bundul.get(), false));
29  
30             // update hardware link (send data to gpy)
31             crate->getIdentifier()->update();
32             bundul->getIdentifier()->update();
33         }
34  
35         mat = new driver::material();
36         mat->setMode(driver::rmd_polygon);
37         mat->setShadeModel(driver::rsd_flat);
38         mat->setFaceCulling(driver::rfc_off);
39         mat->setMaterialRender(driver::rmt_solid | driver::rmt_lighting);
40         mat->setTexture(0, crate->getIdentifier().get());
41         mat->setTexture(1, bundul->getIdentifier().get());
42         mat->setPointSize(2.f);
43  
44         // shader creation sample
45         {
46             auto shade = core->getContext()->createShader();
47  
48             // only need fragment shader
49             shade->attacheShader(driver::shd_frag);
50  
51             // used to get information from material (like texture binding) by calback
52             shade->setLinkToMaterial(mat);
53  
54             shade->setFragmentShader(
55                 "uniform sampler2D T0;\n"
56                 "uniform sampler2D T1;\n"
57                 "uniform float alpha;\n"
58                 "uniform float density;\n"
59                 "void main (void)\n"
60                 "{\n"
61                 "     vec4 texel0, texel1;\n"
62                 "     //----------------------------------------\n"
63                 "     texel0 = texture2D(T0, gl_TexCoord[0].st)*density;\n"
64                 "     texel1 = texture2D(T1, gl_TexCoord[1].st)*(1.0 - density);\n"
65                 "     //----------------------------------------\n"
66                 "     gl_FragColor = (texel0+texel1);\n"
67                 "     gl_FragColor *= gl_Color;\n"
68                 "     gl_FragColor.a = alpha;\n"
69                 "}\n",
70                 "main"
71             );
72             shade->setCallback([](driver::shader *i) noexcept
73             {
74                 i->setTexture("T0", i->getLinkFromMaterial()->getTexture(0), 0);
75                 i->setTexture("T1", i->getLinkFromMaterial()->getTexture(1), 1);
76                 i->setVariable("alpha", 0.75f);
77                 i->setVariable("density", 0.25f);
78             });
79             shade->compileShader();
80  
81             // link
82             mat->setShader(shade);
83         }
84  
85         driver::Geometry geom;
86         tmp = geom.createCube(math::vector3df(15), math::pixel(0,0,255,255));
87  
88         scene3d::Node *grid = new scene3d::real::Grid(smgr);
89         smgr->addSceneNode(grid);
90  
91         for(int x = -100; x<150; x += 50)
92         {
93             for(int y = -300; y<350; y += 50)
94             {
95                 for(int z = -100;z<150; z += 50)
96                 {
97                     scene3d::Node *cube = new scene3d::real::Natif(smgr);
98                         cube->setPosition(math::vector3df(x,y,z));
99                         cube->setMaterial(mat);
100                         cube->setMesh(tmp);
101                     smgr->addSceneNode(cube);
102                 }
103             }
104         }
105         static_crate = smgr->getNumberNode();
106  
107         smgr->getCamera()->setRotation(math::vector3df(0, 1, 0));
108         smgr->getCamera()->setTarget(math::vector3df(0, 0, 0));
109  
110         light_test();
111     }
112  
113     GameEngine::~GameEngine() noexcept
114     {
115         smgr->clear();
116     }
117  
118     bool GameEngine::manage(sleek::device::input *a) noexcept
119     {
120         if(a->type == EVENT_KEY_UP)
121         {
122             //! engine test
123             if(a->key[KEY_ESCAPE]) screen->setFullScreen(!screen->getInfo().fullscreen);
124 //            if(a->key[KEY_F1]) texture::WriteTextureToBmp(screen->createScreenshot(),"texture/screenshot.bmp");
125             //! thread support, disable and enable
126 //            if(a->key[KEY_KEY_A]) smgr->enableThread(engine::etf_all);
127 //            if(a->key[KEY_KEY_Z]) smgr->disableThread(engine::etf_all);
128             //! wireframe view, disable and enable
6 ovan 129 //            if(a->key[KEY_KEY_W]) glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
130 //            if(a->key[KEY_KEY_X]) glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
1 ovan 131             //! vertex buffer object, disable and enable
132             if(a->key[KEY_KEY_Q])
133             {
134                 core->getContext()->createVBO(tmp, driver::VBO_VERTEX_BUFFER);
135                 tmp->getIdentifier(driver::VBO_VERTEX_BUFFER)->update();
136                 core->getContext()->createVBO(tmp, driver::VBO_INDEX_BUFFER);
137                 tmp->getIdentifier(driver::VBO_INDEX_BUFFER)->update();
138             }
139             if(a->key[KEY_KEY_S])
140             {
141                 for(int i = 0; i<driver::VBO_COUNT; ++i)
142                     tmp->setIdentifier(driver::VBO_BUFFER_TYPE(i), nullptr);
143             }
144             //! visible physique draw, enable or disable
145 //            if(a->key[KEY_KEY_D]) smgr->enableDebugDraw(!smgr->isDebugDraw());
146             //! push or delete "crate" from world
147             if(a->key[KEY_SPACE]) push_crate(1);
148             if(a->key[KEY_RETURN]) delete_crate(1);
149             return true;
150         }
151     }
152  
153     void GameEngine::push_crate(int n) noexcept
154     {
155         for(int i = 0; i<n; ++i)
156         {
157             float scale = 0.05f;
158             scene3d::Node *tmp = new scene3d::billboard::Billboard(smgr, bundul.get());
159                 tmp->setPosition(math::vector3df(rand()%300-150,rand()%150+50, 0));
160                 tmp->setScale(math::vector3df(scale));
161                 tmp->setId(3);
162             smgr->addSceneNode(tmp);
163         }
164     }
165  
166     void GameEngine::delete_crate(int n) noexcept
167     {
168         for(int i = 0; i<smgr->getNumberNode(); ++i)
169         {
170             if(smgr->getNode(i)->getId() == 3)
171                 smgr->removeNode(smgr->getNode(i));
172         }
173     }
174  
175     void GameEngine::render() noexcept
176     {
177         tm.update();
178         rot = tm.getTimeMsec()/50.0f;
179         smgr->getCamera()->setPosition(math::vector3df(sin(rot/100)*200, 250, cos(rot/100)*200));
180         smgr->getCamera()->updateProjection();
181         smgr->render();
182     }
183 }