bool SDLGameWindow::VRun() { /*try and initialize window*/ if (!VInit()) { DebugPrintF(VTEXT("SDLGameWindow failed to initialize")); return false; } /*LOAD ONLY NECESSARY CONTENT FOR STARTUP*/ m_parent->VOnStartup(); m_timer.Start(); //run application loop m_running = true; while (m_running) { m_timer.Tick(); SDL_Event event; while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: VClose(); break; case SDL_KEYDOWN: ((SDLKeyboardState*)Game::GetKeyboard())->KeyDown(event.key.keysym.scancode); break; case SDL_KEYUP: ((SDLKeyboardState*)Game::GetKeyboard())->KeyUp(event.key.keysym.scancode); break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: ((SDLMouseState*)Game::GetMouse())->MouseEvent(event.button); break; case SDL_MOUSEWHEEL: ((SDLMouseState*)Game::GetMouse())->MouseWheelEvent(event.wheel); break; case SDL_MOUSEMOTION: ((SDLMouseState*)Game::GetMouse())->MouseMove(event.motion.x, event.motion.y); break; } } /*CLEAR BUFFERS*/ if(m_renderer) m_renderer->VClearBuffer(ClearArgs::COLOR_DEPTH_STENCIL_BUFFER); /*update*/ m_parent->VOnUpdate(m_timer.DeltaTime()); /*render*/ m_parent->VOnRender(m_timer.DeltaTime()); /*update keyboard state for next frame*/ ((SDLKeyboardState*)Game::GetKeyboard())->UpdatePrev(); /*update mouse state for next frame*/ ((SDLMouseState*)Game::GetMouse())->UpdatePrev(); /*swap buffers*/ VSwapBuffers(); m_timer.CalculateFPS(); } m_parent->VOnShutdown(); return true; }
int main() { LOG_DEBUG("Starting Game"); auto DeviceOGL = ACTK::Renderer::RenderDeviceManager::GetInstance().CreateDevice(ACTK::Renderer::API::OpenGL3x); if(DeviceOGL == nullptr) { return 0; } auto WindowOGL = DeviceOGL->VCreateWindow(800, 600, "HelloWorld", ACTK::Renderer::WindowType::Windowed); if(WindowOGL == nullptr) { return 0; } auto ShaderProgram = DeviceOGL->VCreateShaderProgram(LoadShader(IDS_VERTEXSHADER), LoadShader(IDS_FRAGMENTSHADER)); /////////////////////////////////////////////////////////////////// // ClearState and Color ACTK::Renderer::ClearState cornflowerBlue; cornflowerBlue.Color = ACTK::Renderer::Color(0.392f, 0.584f, 0.929f, 1.0f); /////////////////////////////////////////////////////////////////// // Vertex Array // Dreieck-Koordinaten, die ohne Kamera in dem Fenster zu sehen sein müssten float* vertices = new float[9]; // vertex array vertices[0] =-0.3f; vertices[1] = 0.5f; vertices[2] =-1.0f; vertices[3] =-0.8f; vertices[4] =-0.5f; vertices[5] =-1.0f; vertices[6] = 0.2f; vertices[7] =-0.5f; vertices[8]= -1.0f; // TODO: Buffer erstellen und mit Dreieckinformationen füllen /////////////////////////////////////////////////////////////////// // Uniforms float white[] = {1.0f, 1.0f, 1.0f}; ShaderProgram->VSetUniformVector("u_color", white, 3); /////////////////////////////////////////////////////////////////// // RenderState // TODO: RenderState // So ungefähr soll es aussehen // ACTK::RenderState renderState; // renderState.FacetCulling.Enabled = false; // renderState.DepthTest.Enabled = false; /////////////////////////////////////////////////////////////////// // Gameloop auto ContextOGL = WindowOGL->VGetContext(); MSG msg = { 0 }; LOG_DEBUG("Running Game"); while(!WindowOGL->VShouldClose()) { if(PeekMessage( &msg, NULL, 0, 0, PM_REMOVE )) { TranslateMessage( &msg ); DispatchMessage( &msg ); } else { ContextOGL->VClear(cornflowerBlue); // TODO: Dreieck zeichnen mit dem Context // So ungefähr muss der Aufruf aussehen. Ändere dafür das Interface entsprechend und implementiere die Funktion in der DLL //ContextOGL->draw( PrimitiveType, Offset, Count, VertexArray, ShaderProgram, RenderState ); // PrimitiveType = Was soll gezeichnet werden? Dreieck, Linie, Punkte // Offset = Ab welchem Index Dreieck in dem VertexArray // Count = Wie viele Koordinaten nach dem Offset die gezeichnet werden müssen // VertexArray = Dreieckskoordinaten // Shader Program = Das ShaderProgramm (Vertex und Pixelshader) mit dem die Dreiecke gezeichnet werden sollen // RenderState = Die RenderState Einstellungen die für das Zeichnen dieses Dreiecks vorgenommen werden sollen // Das machen wir schrittweise: (Dreiecke mit GlBegin() und GLEnd() zeichnen; // 1. Schritt: ContextOGL->draw( VertexArray, ShaderProgram ); // alle dreiecke zeichnen // 2. Schritt: ContextOGL->draw( Offset, Count, VertexArray, ShaderProgram ); // nickt alle dreiecke zeichnen // 3. Schritt: ContextOGL->draw( PrimitiveType, Offset, Count, VertexArray, ShaderProgram ); // Dreieck als Linie oder Punkte zeichnen // 5. Schritt: ContextOGL->draw( PrimitiveType, Offset, Count, VertexArray, ShaderProgram, RenderState ); // RenderState einstellen // 6. Schritt: Das selbe mit Vertex Buffern ContextOGL->VDraw(ACTK::Renderer::PrimitiveType::LineLoop, vertices, ShaderProgram, 1); ContextOGL->VSwapBuffers(); } } LOG_DEBUG("Quitting Game"); return (int) msg.wParam; }