void World::Initialize(GLFWwindow* window) { //-Resources- ResourceManager* resources = ResourceManager::GetInstance(); //Load Shaders resources->LoadShader("default.vert", "", "default.frag"); resources->LoadShader("simple.vert", "", "simple.frag"); resources->LoadShader("terrain.vert", "", "terrain.frag"); resources->LoadShader("depth.vert", "", "depth.frag"); //Load Textures resources->LoadTextureTransparent("cursor.png"); resources->LoadTexture("grass.png"); //Create Camera mCamera = new Camera(); // Rendering Stuff mFbo = new FrameBufferObject(1024); mPlanet = new Planet(); glfwSetMouseButtonCallback(window, World::MouseCallback); }
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmd, int nCmd) { u32 r = Log2(48); Window* window = Window::Create("BFAATW!", 480, 320, false); if ( ! window ) return 42; Renderer* renderer = Renderer::Create(window); if ( ! renderer ) { delete window; return 42; } ResourceManager* resources = new ResourceManager(renderer); Style* style = resources->LoadStyle("basic.style"); renderer->SetStyle(style); Mesh* plane = CreatePlane(resources, "ground"); Texture* ground = resources->LoadTexture("hill_mound_b.dds"); Matrix planeWorld(Matrix::Identity); Matrix tmp; MatrixScaling(tmp, Vector(10.0f, 1.0f, 10.0f)); MatrixMultiply(planeWorld, tmp); MatrixTranslation(tmp, Vector(0.0f, -3.0f, 0.0f)); MatrixMultiply(planeWorld, tmp); Mesh* cube = CreateCube(resources, "cube"); Texture* diffuse = resources->LoadTexture("Catwalk_03_Diffuse_512.dds"); Matrix cubeWorld(Matrix::Identity); Matrix view, projection; Camera::Perspective(MATH_PI_3, 480.0f/320.0f, 0.1f, 100.0f, projection); RenderTarget* shadowMap = resources->CreateRenderTarget("shadowmap", 1024, 1024, RT_SHADOWMAP); Vector lightPosition(3.0f, 5.0f, 2.0f); Matrix lightView, lightProjection; Camera::Orthographic(-3.0f, 3.0f, -3.0f, 3.0f, 0.1f, 100.0f, lightProjection); Camera::LookAt(lightPosition, Vector::Zero, Vector::UnitY, lightView); Timer timer(60); timer.Start(); Texture* depth = shadowMap->GetTexture(0); style->SetParameter("shadow", &depth); style->SetParameter("lightPosition", &lightPosition); while ( window->Update() && ! window->IsKeyDown(KEY_ESCAPE) ) { while ( timer.Update() ) { if ( window->IsMouseButtonDown(MOUSE_RIGHT) ) { // Set camera position u32 wx, wy; window->GetSize(wx, wy); s32 mx, my; window->GetMousePosition(mx, my); Vector eye; float theta = -float(my) / float(wy) * MATH_2_PI; float rho = float(mx) / float(wx) * MATH_2_PI * 2.0f; theta = Clamp(theta, -4.5f, -2.0f); eye.x = 5.0f * cosf(theta) * cosf(rho); eye.y = 5.0f * sinf(theta); eye.z = 5.0f * cosf(theta) * sinf(rho); Camera::LookAt(eye, Vector::Zero, Vector::UnitY, view); } MatrixRotation(tmp, Vector::UnitY, MATH_PI / 120.0f); MatrixMultiply(planeWorld, tmp); //cubeWorld = Matrix::Identity * Matrix::Scaling(Vector::One * (cosf(timer.GetTime() * 13.0f)+1.2f)); } { // render to shadow map renderer->SetRenderTarget(shadowMap); renderer->SetViewport(0, 0, 1024, 1024); renderer->Clear(); int b = false; style->SetParameter("processShadow", &b); Matrix viewProjection = lightView; MatrixMultiply(viewProjection, lightProjection); style->SetParameter("viewProjection", &viewProjection); style->SetParameter("diffuse", (const Texture**) &diffuse); style->SetParameter("world", &cubeWorld); renderer->Render(cube); style->SetParameter("diffuse", (const Texture**) &ground); style->SetParameter("world", &planeWorld); renderer->Render(plane); } { // render to screen renderer->SetRenderTarget(0); renderer->SetViewport(0, 0, 480, 320); renderer->Clear(); int b = true; style->SetParameter("processShadow", &b); Matrix viewProjection = view; MatrixMultiply(viewProjection, projection); style->SetParameter("viewProjection", &viewProjection); style->SetParameter("diffuse", (const Texture**) &diffuse); style->SetParameter("world", &cubeWorld); renderer->Render(cube); style->SetParameter("diffuse", (const Texture**) &ground); style->SetParameter("world", &planeWorld); renderer->Render(plane); } window->SwapBuffers(); } delete resources; delete renderer; delete window; return 0; }