void World::Render() { ResourceManager* resourceManager = ResourceManager::GetInstance(); glm::mat4 depthProj = glm::ortho<float>(-5, 5, -5, 5, -100, 100); glm::mat4 depthView = glm::lookAt(mCamera->GetPosition() - glm::normalize(glm::vec3(1.0f, -3.0f, 2.0f)) * 10.0f, mCamera->GetPosition(), glm::vec3(0, 1, 0)); Shader* depthShader = resourceManager->GetShader("depth"); Shader* defaultShader = resourceManager->GetShader("default"); // Depth map rendering mFbo->Bind(); depthShader->Bind(); RenderObjects(depthShader, depthProj, depthView, false); mFbo->Unbind(); // World rendering defaultShader->Bind(); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, mFbo->textureID); glUniform1i(defaultShader->GetUniformLocation("shadowMap"), 1); GLuint depthMVPLocation = defaultShader->GetUniformLocation("depthMVP"); glUniformMatrix4fv(depthMVPLocation, 1, GL_FALSE, &(depthProj * depthView)[0][0]); RenderObjects(defaultShader, mProjection, mCamera->GetView(), true); }
void DebugVectorRenderer::Render() { if (primitiveCount > 0) { if (meshesInitialized == false) { this->CreateMeshes(); } Engine* engine = Engine::GetInstance(); Camera* camera = this->activeCamera; Mat4x4f viewProjection = camera->GetProjectionMatrix() * camera->GetViewMatrix(); ResourceManager* rm = engine->GetResourceManager(); Shader* shader = rm->GetShader("res/shaders/debug_vector.shader.json"); int colorUniformLocation = -1; for (unsigned int i = 0; i < shader->materialUniformCount; ++i) { if (shader->materialUniforms[i].type == ShaderUniformType::Vec4) { colorUniformLocation = shader->materialUniforms[i].location; } } glDisable(GL_DEPTH_TEST); glDisable(GL_BLEND); // Use shader glUseProgram(shader->driverId); for (unsigned int i = 0; i < primitiveCount; ++i) { Primitive* primitive = primitives + i; Mat4x4f mvp = viewProjection * primitive->transform; unsigned int meshId = this->meshIds[static_cast<unsigned int>(primitive->type)]; const Mesh& mesh = rm->GetMesh(meshId); // Set color uniform glUniform4fv(colorUniformLocation, 1, primitive->color.ValuePointer()); // Bind vertex array object glBindVertexArray(mesh.vertexArrayObject); // Set transform matrix uniform glUniformMatrix4fv(shader->uniformMatMVP, 1, GL_FALSE, mvp.ValuePointer()); // Draw glDrawElements(mesh.primitiveMode, mesh.indexCount, mesh.indexElementType, nullptr); } // Clear primitive count primitiveCount = 0; } }
void ParticleGenerator::Update(Transform eTransform, float dt, float tt) { ResourceManager* rManager = ResourceManager::Instance(); ID3D11DeviceContext* deviceContext = rManager->GetDeviceContext(); UINT stride = sizeof(Particle); UINT offset = 0; generatorVS = dynamic_cast<SimpleVertexShader*>(rManager->GetShader("ParticleGeneratorVS")); generatorGS = dynamic_cast<SimpleGeometryShader*>(rManager->GetShader("ParticleGeneratorGS")); DirectX::XMMATRIX translationMat = DirectX::XMMatrixTranslation(position.x, position.y, position.z); DirectX::XMMATRIX rotationMat = DirectX::XMMatrixRotationRollPitchYaw(eTransform.GetRotation().x * 2, eTransform.GetRotation().y * 2, eTransform.GetRotation().z * 2); DirectX::XMFLOAT4X4 transformMat; DirectX::XMStoreFloat4x4(&transformMat, DirectX::XMMatrixTranspose(translationMat * rotationMat)); DirectX::XMFLOAT3 finalPos = DirectX::XMFLOAT3(eTransform.GetTranslation().x + transformMat._14, eTransform.GetTranslation().y + transformMat._24, eTransform.GetTranslation().z + transformMat._34); // Set constant variables generatorGS->SetFloat("dt", dt); generatorGS->SetFloat("tt", tt); generatorGS->SetFloat3("generatorPos", finalPos); generatorGS->SetFloat("spawnRate", spawnRate); generatorGS->SetFloat("lifeTime", lifeTime); generatorGS->SetSamplerState("randomSampler", rManager->GetSamplerState("trilinear")); generatorGS->SetShaderResourceView("randomTexture", rManager->GetTexture("randomTexture")); // Activate shaders generatorVS->SetShader(true); generatorGS->SetShader(true); deviceContext->PSSetShader(0, 0, 0); // Unbind vertex buffers (incase) ID3D11Buffer* unset = 0; UINT unsetStride = 0; deviceContext->IASetVertexBuffers(0, 1, &unset, &stride, &offset); deviceContext->IASetVertexBuffers(0, 1, &readBuff, &stride, &offset); deviceContext->SOSetTargets(1, &writeBuff, &offset); deviceContext->DrawAuto(); // Kill everything SimpleGeometryShader::UnbindStreamOutStage(deviceContext); deviceContext->GSSetShader(0, 0, 0); SwapBuffers(); }
ParticleGenerator::ParticleGenerator(Particle p, DirectX::XMFLOAT3 pos, float lt, float sr, float numRoots) { init = false; lifeTime = lt; spawnRate = sr; position = pos; // Get necessary resources ResourceManager* rManager = ResourceManager::Instance(); ID3D11Device* device = rManager->GetDevice(); ID3D11DeviceContext* deviceContext = rManager->GetDeviceContext(); generatorVS = dynamic_cast<SimpleVertexShader*>(rManager->GetShader("ParticleGeneratorVS")); generatorGS = dynamic_cast<SimpleGeometryShader*>(rManager->GetShader("ParticleGeneratorGS")); // Create Stream Output variables generatorGS->CreateCompatibleStreamOutBuffer(&readBuff, 1000000); generatorGS->CreateCompatibleStreamOutBuffer(&writeBuff, 1000000); // Create initial ROOT vertex buffer UINT stride = sizeof(Particle); UINT offset = 0; Particle vertices[] = { p }; D3D11_BUFFER_DESC vbd; vbd.Usage = D3D11_USAGE_IMMUTABLE; vbd.ByteWidth = sizeof(Particle); vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER; vbd.CPUAccessFlags = 0; vbd.MiscFlags = 0; vbd.StructureByteStride = 0; D3D11_SUBRESOURCE_DATA initialVertexData; initialVertexData.pSysMem = vertices; device->CreateBuffer(&vbd, &initialVertexData, &particleBuff); // Set constant variables generatorGS->SetFloat("dt", 0.0f); generatorGS->SetFloat("tt", 0.0f); generatorGS->SetFloat("lifeTime", lifeTime); generatorGS->SetFloat("spawnRate", spawnRate); generatorGS->SetFloat3("generatorPos", position); generatorGS->SetSamplerState("randomSampler", rManager->GetSamplerState("trilinear")); generatorGS->SetShaderResourceView("randomTexture", rManager->GetTexture("randomTexture")); // Activate shaders generatorVS->SetShader(true); generatorGS->SetShader(true); deviceContext->PSSetShader(0, 0, 0); deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST); // Unbind vertex buffers (incase) ID3D11Buffer* unset = 0; deviceContext->IASetVertexBuffers(0, 1, &unset, &stride, &offset); deviceContext->IASetVertexBuffers(0, 1, &particleBuff, &stride, &offset); deviceContext->SOSetTargets(1, &writeBuff, &offset); deviceContext->Draw(1, 0); SimpleGeometryShader::UnbindStreamOutStage(deviceContext); deviceContext->GSSetShader(0, 0, 0); SwapBuffers(); }
void Scene::AttachComponent(string & compID, GameObject * go, XMLElement* attributesElement) { string tID = compID; auto iter = componentIDValues.find(tID); if (iter == componentIDValues.end()) tID = ""; switch (componentIDValues[tID]) { case COMPONENT_NOTFOUND: cout << "Component " << compID << " does not exist" << endl; return; case CAMERA_BEHAVIOUR: { float fTemp; attributesElement->QueryFloatAttribute("speed", &fTemp); go->AttachComponent(new CameraBehaviour(camera, fTemp)); } break; case TERRAIN: { string texture = TEXTURE_PATH + attributesElement->Attribute("texture"); float scaleX = attributesElement->FloatAttribute("scalex"); float scaleY = attributesElement->FloatAttribute("scaley"); float scaleZ = attributesElement->FloatAttribute("scalez"); go->AttachComponent(new TerrainComp(texture, vec3(scaleX, scaleY, scaleZ))); } break; case SKYBOX: { string name = attributesElement->Attribute("texture1"); string name2 = attributesElement->Attribute("texture2"); bool iTD = false; attributesElement->QueryBoolAttribute("isTimeDay", &iTD); ResourceManager *rm = resourceManager; if (iTD) go->AttachComponent(new Skybox(rm->GetTexture(name), rm->GetModel("skyModel"), rm->GetShader("SkyBox"), rm->GetTexture(name2), iTD)); if (!iTD) go->AttachComponent(new Skybox(rm->GetTexture(name), rm->GetModel("skyModel"), rm->GetShader("SkyBox"), rm->GetTexture(name), iTD)); } break; case TIMEDAY: { string tF = attributesElement->Attribute("font"); go->AttachComponent(new TimeDay(resourceManager->GetFont(tF))); } break; case MOVEGOBEHAVIOUR: go->AttachComponent(new MoveGameObjectBehaviour()); break; case LIGHT: { string colorString = attributesElement->Attribute("color"); vector<string> splits = split(colorString, ','); float r = atof(splits[0].c_str()); float g = atof(splits[1].c_str()); float b = atof(splits[2].c_str()); float a = atof(splits[3].c_str()); vec4 color(r, g, b, a); go->AttachComponent(new Light(color)); } break; case WATERCOMP: { go->AttachComponent(new WaterComp()); } break; } }