Exemple #1
0
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();
}
Exemple #5
0
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;
	}
}