InputLightType::enumt readShader(AbcM::IMaterialSchema& matSchema, std::vector<matShader>& shaders)
{
   InputLightType::enumt ltype = InputLightType::NUM_INPUT_LIGHT_TYPES;

   std::vector<std::string> targetNames;

   matSchema.getTargetNames(targetNames);

   for(int j=0; j<targetNames.size(); j++){
      //ESS_LOG_WARNING("targetName: "<<targetNames[j]);

      std::vector<std::string> shaderTypeNames;
      matSchema.getShaderTypesForTarget(targetNames[j], shaderTypeNames);

      for(int k=0; k<shaderTypeNames.size(); k++){
         //ESS_LOG_WARNING("shaderTypeNames: "<<shaderTypeNames[k]);
         std::string shaderName;
         matSchema.getShader(targetNames[j], shaderTypeNames[k], shaderName);

         if(shaderName.find("rect") != std::string::npos || shaderName.find("area") != std::string::npos){
            ltype = InputLightType::AREA_LIGHT;
         }
         else if(shaderName.find("ambient") != std::string::npos){
            ltype = InputLightType::AMBIENT_LIGHT;
         }

         //std::stringstream nameStream;
         //nameStream<<targetNames[j]<<"."<<shaderTypeNames[k]<<"."<<shaderName;

         shaders.push_back( matShader(targetNames[j], shaderTypeNames[k], shaderName) );

         //ESS_LOG_WARNING("shaderName: "<<shaderName);

         Abc::ICompoundProperty propk = matSchema.getShaderParameters(targetNames[j], shaderTypeNames[k]);

         //ESS_LOG_WARNING("propertyName: "<<propk.getName());

         shaders.back().props.push_back(AbcProp(std::string("targetName"), targetNames[j], 1000000000));
         shaders.back().props.push_back(AbcProp(std::string("shaderType"), shaderTypeNames[j], 1000000000));
         
         readInputProperties(propk, shaders.back().props);
      }
   }

   return ltype;
}
Example #2
0
void Lux::Graphics::RenderingSystem::RenderPass()
{
	if (!m_LightEntry || !m_MainCamera || !m_MainCameraTransform)
		return;

	// Resize Window if needed
	if (m_RenderWindow->IsWindowResized())
	{
		float aspect = m_RenderWindow->GetWidth() / (float)m_RenderWindow->GetHeight();
		m_MainCamera->GetRawPtr()->ChangeAspect(aspect);
	}
	
	m_MainCameraTransform->GetRawPtr()->ApplyTransform();
	EntityMap::iterator it;
	for (it = m_EntityMap.begin(); it != m_EntityMap.end(); ++it)
	{
		if (!it->second.m_Transform)
			continue;

		if (!it->second.m_MeshRenderer)
			continue;

		Core::Mesh* mesh = it->second.m_MeshRenderer->GetRawPtr()->GetMesh().get();
		
		if (!mesh)
			continue;

		// Make sure we multiply the transforms properly, taking into account parents
		mat4x4 finalTransform;
		Core::Transform* transformPtr = it->second.m_Transform->GetRawPtr();
		bool hasParent = true;
		do 
		{
			hasParent = transformPtr->GetParentTransform().IsValid();
			transformPtr->ApplyTransform();
			finalTransform *= transformPtr->GetMatrix();
			transformPtr = transformPtr->GetParentTransform().GetRawPtr();

		} while (hasParent);

		// Set the default uniform buffer
		Core::ShaderVariable worldMatVal(Core::VALUE_MAT4X4, glm::value_ptr(finalTransform), sizeof(mat4));
		Core::ShaderVariable viewMatVal(Core::VALUE_MAT4X4, glm::value_ptr(m_MainCameraTransform->GetRawPtr()->GetInverseTranslationMatrix()), sizeof(mat4));
		Core::ShaderVariable projMatVal(Core::VALUE_MAT4X4, glm::value_ptr(m_MainCamera->GetRawPtr()->GetProjectionMatrix()), sizeof(mat4));
		m_ObjUniformBuffer.SetVariable(0, viewMatVal);
		m_ObjUniformBuffer.SetVariable(1, projMatVal);
		m_ObjUniformBuffer.SetVariable(2, worldMatVal);

		// Light Buffer
		LightShaderResource lightShaderRes;
		lightShaderRes.m_Position = m_LightEntry->m_Transform->GetRawPtr()->GetPosition();
		lightShaderRes.m_Color = m_LightEntry->m_Light->GetRawPtr()->GetColor();
		lightShaderRes.m_Direction = m_LightEntry->m_Light->GetRawPtr()->GetDirection();
		lightShaderRes.m_Intensity = m_LightEntry->m_Light->GetRawPtr()->GetIntensity();
		//lightShaderRes.m_Type = (int)m_LightEntry->m_Light->GetRawPtr()->GetType();
		Core::ShaderVariable lightShaderVar(Core::VALUE_STRUCT, &lightShaderRes, sizeof(LightShaderResource));
		Core::ShaderVariable eyePos(Core::VALUE_VEC3, glm::value_ptr(m_MainCameraTransform->GetRawPtr()->GetPosition()), sizeof(vec3));

		m_LightUniformBuffer.SetVariable(0, lightShaderVar);
		m_LightUniformBuffer.SetVariable(1, eyePos);
		Core::Shader* shader = mesh->GetShader().get();
		shader->Activate();

		// Material Buffer
		Core::Material* matRes = mesh->GetMaterialProperties().get();
		MaterialShaderResource matShaderRes(*matRes);
		Core::ShaderVariable matShader(Core::VALUE_STRUCT, &matShaderRes, sizeof(MaterialShaderResource));
		m_MatUniformBuffer.SetVariable(0, matShader);

		if (!it->second.m_Init)
		{
			shader->InitializeUniformBuffer("ObjectBuffer", m_ObjUniformBuffer, VERTEX_PROGRAM);
			shader->InitializeUniformBuffer("LightBuffer", m_LightUniformBuffer, FRAGMENT_PROGRAM);
			shader->InitializeUniformBuffer("MaterialBuffer", m_MatUniformBuffer, FRAGMENT_PROGRAM);
			it->second.m_Init = true;
		}
		
		// Bind Samplers and Textures
		Core::Texture2D* diffuseTex = mesh->GetTexture(Core::DIFFUSE_MAP_IDX).get();
		LuxAssert(diffuseTex);

		Core::TextureSampler* texSampler = diffuseTex->GetSampler().get();
		LuxAssert(texSampler);

		texSampler->Activate(Core::DIFFUSE_MAP_IDX, FRAGMENT_PROGRAM);
		diffuseTex->Bind(Core::DIFFUSE_MAP_IDX, "DiffuseTexture", shader, FRAGMENT_PROGRAM);

		shader->Update();

		mesh->PreRender();
		m_RenderWindow->Render(mesh);
		mesh->PostRender();

		diffuseTex->Unbind();
		texSampler->Deactivate();
		shader->Deactivate();
	}
}