예제 #1
0
Texture* GraphicsEngine::GaussianBlur(Texture* input, float radius, bool halfRes)
{
	FBO* blurFBO = GetFBO(BLUR);

	if (halfRes)
		blurFBO = GetFBO(HALF);

	blurFBO->BindForWriting();
	blurFBO->SetDrawBuffer(0);

	GetShader("Gaussian")->Use();
	GetShader("Gaussian")->SetUniform2f("blurSize", 1.0f / Screen.width * (1 + halfRes), 1.0f / Screen.height * (1 + halfRes));
	GetShader("Gaussian")->SetUniform1f("radius", radius);

	//Horizontal Blur
	GetShader("Gaussian")->SetUniform1i("verticalBlur", false);
	input->Bind();
	FBO::Render();

	blurFBO->SetDrawBuffer(1);

	//Vertical Blur
	GetShader("Gaussian")->SetUniform1i("verticalBlur", true);
	blurFBO->GetTexture()->Bind();
	FBO::Render();

	return blurFBO->GetActiveTexture();
}
void LindenmayerTreeNode::Render(OGLRenderer& r, bool render_children) {
	if (r.GetCurrentShader() != shader) r.SetCurrentShader(shader);
	r.UpdateShaderMatrices();
	Matrix4 transform = GetWorldTransform() * Matrix4::Scale(GetModelScale());
	glUniformMatrix4fv(glGetUniformLocation(GetShader()->GetProgram(), "modelMatrix"), 1, false, (float*)&transform);
	glUniformMatrix4fv(glGetUniformLocation(GetShader()->GetProgram(), "textureMatrix"), 1, false, (float*)&GetTextureMatrix());
	glUniform4fv(glGetUniformLocation(GetShader()->GetProgram(), "nodeColour"), 1, (float*)&GetColour());

	/*Draw the branches first to reduce expensive BindTexture calls*/
	glActiveTexture(GL_TEXTURE0);
	glBindTexture(GL_TEXTURE_2D, textures[0].id);
	for (auto it = children.begin(); it != children.end(); ++it) {
		mem_usage += sizeof(LBranchNode);
		(*it)->Render(r, false);
	}
	/*Then draw the "leaves", turning off alpha blending to do so*/
	glBindTexture(GL_TEXTURE_2D, textures[1].id);
	glDisable(GL_BLEND);
	for (auto it = children.begin(); it != children.end(); ++it) {
		for (auto it2 = (*it)->GetChildIteratorStart(); it2 != (*it)->GetChildIteratorEnd(); ++it2) {
			mem_usage += sizeof(LLeafNode) + sizeof(ParticleEmitter);
			(*it2)->Render(r, false);
		}
	}
	glEnable(GL_BLEND);
}
예제 #3
0
void IRenderSystem::Draw()
{
	// Set clear color
	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
	
	// Calculate matrices
	m_ProjectionMatrix = glm::perspective(m_Camera->GetFOV(), float(GetGame()->GetWindowWidth()) / float(GetGame()->GetWindowHeight()), GetCamera()->GetNearZ(), GetCamera()->GetFarZ());
	m_ViewMatrix = glm::lookAt(m_Camera->GetPos(), m_Camera->GetPos() + m_Camera->GetDirection(), m_Camera->GetUp());
	m_ViewRotMatrix = glm::mat3(m_ViewMatrix);

	if (GetShader("gbuffer") != 0)
	{
		// Geometry Pass
		SetShader(GetShader("gbuffer"));
		m_GBuffer.BindForWriting();
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
		GetGame()->GetSceneManager()->Draw(false);
		m_GBuffer.Unbind();

		// Light Pass
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
		RenderPostEffects();
	}

	// Skybox
	//RenderSkybox();

	// Present the frame
	glfwSwapBuffers();
}
 Shader* ShaderManager::GetShader(const string& aVertexShader, const string& aFragmentShader)
 {
     if(aVertexShader == aFragmentShader)
     {
         GetShader(aVertexShader);
     }
     return GetShader(string(aVertexShader + aFragmentShader));
 }
예제 #5
0
void GraphicsEngine::FinalPass(Texture * texture)
{
	FBO::Unbind();
	GetShader("FBO")->Use();
	GetShader("FBO")->SetUniform1f("overlay", Engine.GetTransition());

	texture->Bind();
	FBO::Render();

	GetShader("FBO")->SetUniform1f("overlay", 1);
}
예제 #6
0
GLSLProgram* ShaderManager::UseShader(const char* vertName, const char* fragName)
{
	GLSLProgram* prog = GetShader(vertName, fragName);
	assert(prog != NULL);
	prog->use();
	return prog;
}
void CShaderManager::Render( )
{
	if( m_pD3DDevice == NULL || m_pObject == NULL )
		return;

	LPD3DXEFFECT fxShader = GetShader( m_pObject->m_hShader );

	if( fxShader == NULL )
	{
		m_pObject->Render();
		return;
	}

	UINT uiNumPasses = 0;

	fxShader->Begin( &uiNumPasses, 0 );

	for( UINT iPass = 0; iPass < uiNumPasses; ++iPass )
	{
		fxShader->BeginPass( iPass );

		m_pObject->Render();

		fxShader->EndPass();
	}

	fxShader->End();
}
예제 #8
0
GLSLProgram* ShaderManager::UseShader(const char* vertName, const char* fragName, std::string vertString, std::string fragString)
{
	GLSLProgram* prog = GetShader(vertName, fragName,vertString, fragString);
	assert(prog != NULL);
	prog->use();
	return prog;
}
예제 #9
0
CUIDragItem* CUICellItem::CreateDragItem()
{
	CUIDragItem* tmp;
	tmp = xr_new<CUIDragItem>(this);
	Frect r;
	GetAbsoluteRect(r);
	if( m_UIStaticItem.GetFixedLTWhileHeading() )
	{
		float w, h;
		w				= r.width();
		h				= r.height();
		if (Heading())
		{   // исправление пропорций
			w = w / m_cell_size.x * m_cell_size.y;
			h = h / m_cell_size.y * m_cell_size.x;
		}

		Fvector2 cp = GetUICursor()->GetCursorPosition();
		// поворот на 90 градусов, и центрирование по курсору мыша						
		r.x1			= (cp.x - h / 2.0f);
		r.y1			= (cp.y - w / 2.0f);
		r.x2			= r.x1 + h;
		r.y2			= r.y1 + w;
	} 
	tmp->Init(GetShader(),r,GetUIStaticItem().GetOriginalRect());
	return tmp;
}
void CShaderManager::UnloadShader( HSHADER hShader )
{
	LPD3DXEFFECT fxShader = GetShader( hShader );
	if( fxShader == NULL ) return;

	fxShader->Release();
	m_vEffects[ hShader ] = NULL;
}
예제 #11
0
파일: Assets.cpp 프로젝트: jpike/noah_ark
    /// Populates this collection of assets with more specific types
    /// of data as specified in the generic collection of assets.
    /// @param[in]  assets - The generic asset data to populate from.
    /// @return True if all assets are successfully populated; false otherwise.
    bool Assets::Populate(const std::vector<Asset>& assets)
    {
        for (const auto& asset : assets)
        {
            switch (asset.Type)
            {
                case RESOURCES::AssetType::FONT:
                {
                    std::shared_ptr<GRAPHICS::GUI::Font> font = GetFont(asset.Id, asset.BinaryData);
                    if (!font)
                    {
                        return false;
                    }
                    break;
                }
                case RESOURCES::AssetType::MUSIC:
                {
                    std::shared_ptr<sf::Music> music = GetMusic(asset.Id, asset.BinaryData);
                    if (!music)
                    {
                        return false;
                    }
                    break;
                }
                case RESOURCES::AssetType::SHADER:
                {
                    std::shared_ptr<sf::Shader> shader = GetShader(asset.Id, asset.BinaryData);
                    if (!shader)
                    {
                        return false;
                    }
                    break;
                }
                case RESOURCES::AssetType::SOUND_EFFECT:
                {
                    std::shared_ptr<sf::SoundBuffer> sound = GetSound(asset.Id, asset.BinaryData);
                    if (!sound)
                    {
                        return false;
                    }
                    break;
                }
                case RESOURCES::AssetType::TEXTURE:
                {
                    std::shared_ptr<GRAPHICS::Texture> texture = GetTexture(asset.Id, asset.BinaryData);
                    if (!texture)
                    {
                        return false;
                    }
                    break;
                }
            }
        }

        return true;
    }
void VisualRaymarchComponent::DrawWithShadows(D3D& d3d)
{
	SetShader(G_ShaderManager().GetShader("Raymarch"));

	// CAMERA BUFFER
	ConstantBuffers::RayMarchCameraBuffer cameraBuffer;
	cameraBuffer.eyePos = GetParent().GetParent().GetActiveCamera()->GetParent().GetPos();
	cameraBuffer.nearPlane = 1.0f;
	cameraBuffer.farPlane = 1000.0f;
	glm::mat4 inverse = GetParent().GetParent().GetActiveCamera()->GetViewMatrix();
	cameraBuffer.viewInverse =/* glm::transpose( */
		inverse  ;
	cameraBuffer.viewportH = d3d.GetScreenHeight();
	cameraBuffer.viewportW = d3d.GetScreenWidth();
    cameraBuffer.raymarchId = m_raymarchId;

	GetShader().PSSetConstBufferData(d3d, std::string("RaymarchCameraBuffer"), (void*)&cameraBuffer,
		sizeof(cameraBuffer), 0);


	// LIGHT BUFFER
	const std::vector<Component*>& lights = GetParent().GetParent().GetLights();
	LightComponent* light = static_cast<LightComponent*>(lights[0]);

	ConstantBuffers::RayMarchLightBuffer lightBuffer;
	lightBuffer.lightColor = light->GetDiffuse();
	lightBuffer.lightPosition = light->GetParent().GetPos();

	GetShader().PSSetConstBufferData(d3d, std::string("RaymarchLightBuffer"), (void*)&lightBuffer,
		sizeof(lightBuffer), 1);


	// BACKGROUND BUFFER
	ConstantBuffers::RayMarchBackgroundColorBuffer backgroundBuffer;
	backgroundBuffer.backgroundColor = glm::vec4(0.1f, 0.1f, 0.1f, 1.0f);

	GetShader().PSSetConstBufferData(d3d, std::string("RaymarchBackgroundColorBuffer"),
		(void*)&backgroundBuffer, sizeof(backgroundBuffer), 2);


    // Render with shader.
    GetShader().RenderShader(d3d, m_mesh.GetIndexCount());
}
예제 #13
0
ReferenceTarget* mrShaderButtonHandler::GetInstance(HWND hwnd, POINT p, SClass_ID type) {

	if(type == TEXMAP_CLASS_ID) {
		Texmap* shader = GetShader();
		return shader;
	}
	else {
		return NULL;
	}
}
예제 #14
0
파일: Shader.cpp 프로젝트: wolves3d/idea
//! ѕерезагружает все шейдеры
//!
bool CRendererD3D::ReloadShaders()
{
	g_pResManager->RegCreator( NEW CShaderCreator );

	TResource * pShaderConfig = NULL;
	g_pResManager->Request( "Shaders.xml", &pShaderConfig );

	
	m_ppShaders[ UI_SHADER ] = GetShader( "UI" );

	return true;

}
예제 #15
0
Texture * GraphicsEngine::Combine(Texture * input1, Texture * input2)
{
	GetFBO(BLUR)->BindForWriting();
	GetFBO(BLUR)->SetDrawBuffer(2);

	GetShader("Combine")->Use();

	input1->Bind();
	input2->Bind(1);

	FBO::Render();

	return GetFBO(BLUR)->GetActiveTexture();
}
예제 #16
0
    static osg::Shader* AddShader( const shaders::shader_t& t, std::string mat_name, const uint16_t version, const std::string comp_str, const std::string& preprocessorDefinitions ) 
    {
        auto shader_text = GetShader(t,mat_name);

        if(shader_text)
        {
            std::string prog = "#version " + boost::lexical_cast<string>(version) +  comp_str + "\n " 
                + preprocessorDefinitions                                                     + "\n " 
                + osg_modification(version,Utils::format(*shader_text));
            return new osg::Shader( static_cast<osg::Shader::Type>(t), prog );

        }
        return new osg::Shader();
    }
예제 #17
0
파일: Sphere.cpp 프로젝트: lgesing/ATCG1
bool
CSphere::Intersect(const CRay& clRay, RealType t0, RealType t1, TTracingContext& tContext ) const
{
	/*
		Implement ray-sphere intersection.
		You must set the following member of the TTracingContext struct:
		t          - ray parameter of intersection point
		v3Normal   - Normal of surface at intersection point
		v3HitPoint - Coordinate of intersection point
		v2TexCoord - 2D-Texture coordinate of intersection point (use polar coordinates (method Cartesian2Polar), not needed currently)
		pclShader  - Material of sphere
	*/

    VectorType3 vecDiff(m_v3Center - clRay.GetOrigin());


    RealType t_ca = vecDiff | clRay.GetDir();

    if (t_ca < 0)
        return false;

    RealType d2 = (vecDiff | vecDiff) - t_ca * t_ca;
    RealType r2 = m_rRadius * m_rRadius ;

    if (d2 > r2) {
        return false;
    }

    RealType desc = sqrt(r2 - d2);

    RealType t = (t_ca - desc) ;

    if (t < 0.0) {
        t = (t_ca + desc);
    }

    if (t > tContext.t) {
        return false;
    }
    tContext.t = t;

    tContext.v3HitPoint = clRay.Evaluate(tContext.t);
    tContext.v3Normal = (tContext.v3HitPoint - m_v3Center).normalize();

    tContext.pclShader = GetShader();

    return true;

}
예제 #18
0
HRESULT GLSkyNode::VPreRender(Scene* pScene)
{
	//the position should always be 0, so offset by the opposit of the camera position
	//doing this in the prerender stage make sure the position is correct BEFORE applying the transforms
	this->SetPosition(pScene->GetCamera()->GetPosition());
	pScene->PushAndSetMatrix(this->GetToWorld());

	GLUFProgramPtr prog = static_pointer_cast<GLProgramResourceExtraData>(GetShader()->GetExtra())->GetProgram();
	//if (m_pShader)
	//{
	//this is always safe to do
	GLUFSHADERMANAGER.UseProgram(prog);
	//}


	//apply the uniforms
	glm::mat4 model = pScene->GetTopMatrix() * glm::scale(glm::mat4(), glm::vec3(40, 40, 40));
	glm::mat4 view = pScene->GetCamera()->GetView();
	glm::mat4 proj = pScene->GetCamera()->GetProjection();

	glm::mat4 model_view_proj = proj * view * model;


	GLUFVariableLocMap uniformLocations = GLUFSHADERMANAGER.GetShaderUniformLocations(prog);
	
	GLUFVariableLocMap::iterator it = uniformLocations.find("_mvp");
	if (it != uniformLocations.end())
		glUniformMatrix4fv(it->second, 1, GL_FALSE, &model_view_proj[0][0]);

	shared_ptr<GLTextureResourceExtraData> cubMap = static_pointer_cast<GLTextureResourceExtraData>(m_Cubemap->GetExtra());

	it = uniformLocations.find("m_tex0");
	if (it != uniformLocations.end())//make sure the there is a sampler, and we have a texture
	{
		glActiveTexture(GL_TEXTURE0);
		glBindTexture(GL_TEXTURE_CUBE_MAP, cubMap->GetTexture());
		glUniform1i(it->second, 0);
	}

	// disable depth test
	//glDisable(GL_DEPTH_TEST);
	glDepthMask(GL_FALSE);
	glDisable(GL_CULL_FACE);

	return S_OK;
}
예제 #19
0
void GradientParticleEmitter::UpdateShader(const GameTime &gameTime)
{
	glEnable(GL_TEXTURE_2D);

	Shader *shader = (Shader*)GetShader();

	Texture &shaderAlphaMap = (Texture&)GetAlphaMap();
	glActiveTexture(shaderAlphaMap.GetTextureSlot());
	shaderAlphaMap.Activate();

	glActiveTexture(gradientMap.GetTextureSlot());
	gradientMap.Activate();

	shader->SetUniform("AlphaMap", 0);
	shader->SetUniform("GradientMap", 1);
	shader->SetUniform("Time", gameTime.GetRunningTime());
};
예제 #20
0
void cShaderManager::CreateProgramWithFile( const std::string ShaderName )
{
	std::fstream File;
	File.open( ShaderName, std::ios::in );
	if( !File.is_open() )
	{
		std::cerr << "ERROR: Blad wczytywania shaderow z pliku: " << ShaderName << std::endl;
		return;
	}
	std::string buffor;
	std::string name;
	std::vector< std::string > Shaders;
	//std::vector< std::string > Fragment;
	while( !File.eof() )
	{
		File >> buffor;
		switch (buffor[0])
		{
			case 'v':
				File >> buffor;
				name = GetName( buffor );
				Shaders.push_back( name );
				CreateShader( name, SHADERTYPE::VertexShader, buffor );
				break;
			case 'f':
				File >> buffor;
				name = GetName( buffor );
				Shaders.push_back( name );
				CreateShader( name, SHADERTYPE::FragmentShader, buffor );
				break;
		default:
			break;
		}
	}
	File.close();
	std::string ProgramName =  GetName( ShaderName );
	CreateProgram( ProgramName );
	cProgramShader* Program = GetProgram( ProgramName );
	for( unsigned i = 0; i < Shaders.size(); i++ )
	{
		Program->AttachShader( GetShader( Shaders[i] ) );
	}
	Program->Link();

}
예제 #21
0
void GraphicsEngine::ForwardPass(bool pass)
{
	switch (pass)
	{
	case 0:
	{
		gBuffer->StartForwardPass();
		GetShader("Forward")->Use();

		break;
	}
	case 1:
	{
		glDisable(GL_DEPTH_TEST);

		break;
	}
	}
}
예제 #22
0
파일: Assets.cpp 프로젝트: jpike/noah_ark
    /// Loads assets in the specified asset package into this collection.
    /// @param[in]  asset_package - The package of assets to load.
    /// @return True if all assets in the package are loaded successfully; false otherwise.
    bool Assets::Load(const AssetPackageDefinition& asset_package)
    {
        // PROTECT AGAINST THIS CLASS BEING USED BY MULTIPLE THREADS.
        std::lock_guard<std::recursive_mutex> lock(AssetMutex);

        // LOAD EACH ASSET IN THE PACKAGE.
        for (const AssetDefinition& asset_definition : asset_package.Assets)
        {
            // LOAD THE ASSET BASED ON IT'S TYPE.
            bool asset_loaded = false;
            switch (asset_definition.Type)
            {
                case AssetType::FONT:
                    // LOAD THE FONT.
                    asset_loaded = static_cast<bool>(GetFont(asset_definition.Id));
                    break;
                case AssetType::MUSIC:
                    // LOAD THE MUSIC.
                    asset_loaded = static_cast<bool>(GetMusic(asset_definition.Id));
                    break;
                case AssetType::SHADER:
                    // LOAD THE SHADER.
                    asset_loaded = static_cast<bool>(GetShader(asset_definition.Id));
                    break;
                default:
                    // The asset can be loaded if it's type isn't known.
                    asset_loaded = false;
            }

            // ABORT IF THE ASSET FAILED TO BE LOADED.
            if (!asset_loaded)
            {
                return false;
            }
        }

        // INDICATE THAT ALL ASSETS WERE LOADED SUCCESSFULLY.
        return true;
    }
예제 #23
0
void mrShaderButtonHandler::Update() {

	DbgAssert(m_dialogHWnd != NULL);

	HWND ctrlHWnd = GetDlgItem(m_dialogHWnd, m_ctrlID);
	ICustButton* custButton = GetICustButton(ctrlHWnd);
	if(custButton != NULL) {

		MSTR text;
		Texmap* shader = GetShader();
		if(shader != NULL)
			text = shader->GetFullName();
		else
			text = GetNoneString();

		custButton->SetText(text.data());
		
		ReleaseICustButton(custButton);
	}
	else {
		DbgAssert(false);
	}
}
예제 #24
0
CUIDragItem* CUICellItem::CreateDragItem()
{
	CUIDragItem* tmp;
	tmp = xr_new<CUIDragItem>(this);
	Frect r;
	GetAbsoluteRect(r);

	if( m_UIStaticItem.GetFixedLTWhileHeading() )
	{
		float t1,t2;
		t1				= r.width();
		t2				= r.height()*UI().get_current_kx();

		Fvector2 cp = GetUICursor().GetCursorPosition();

		r.x1			= (cp.x-t2/2.0f);
		r.y1			= (cp.y-t1/2.0f);
		r.x2			= r.x1 + t2;
		r.y2			= r.y1 + t1;
	}
	tmp->Init(GetShader(), r, GetUIStaticItem().GetTextureRect());
	return tmp;
}
예제 #25
0
void plParticleMtl::ShadeWithBackground(ShadeContext &sc, Color background)
{
#if 1
    TimeValue t = sc.CurTime();
    Color color(0, 0, 0);
    float alpha = 0.0;

    // Evaluate Base layer
    Texmap *map = fBasicPB->GetTexmap(kTexmap);
    if (map && map->ClassID() == LAYER_TEX_CLASS_ID)
    {
        plLayerTex *layer = (plLayerTex*)map;
        AColor evalColor = layer->EvalColor(sc);

        color = evalColor;
        alpha = evalColor.a;
    }

#if 1
    AColor black;
    black.Black();
    AColor white;
    white.White();


    SIllumParams ip;
    if( fBasicPB->GetInt( kNormal ) == kEmissive )
    {
        // Emissive objects don't get shaded
        ip.diffIllum = fBasicPB->GetColor(kColorAmb, t) * color;
        ip.diffIllum.ClampMinMax();
        ip.specIllum = black;
    }
    else
    {
        //
        // Shading setup
        //

        // Setup the parameters for the shader
        ip.amb = black;
        ip.diff = fBasicPB->GetColor(kColor, t) * color;
        ip.spec = white;
        ip.diffIllum = black;
        ip.specIllum = black;
        ip.N = sc.Normal();
        ip.V = sc.V();


        //
        // Specularity
        //
        ip.sh_str = 0;
        ip.ph_exp = 0;
        ip.shine = 0;

        ip.softThresh = 0;



        // Do the shading
        Shader *myShader = GetShader(SHADER_BLINN);
        myShader->Illum(sc, ip);

        ip.diffIllum.ClampMinMax();
        ip.specIllum.ClampMinMax();
        ip.diffIllum = ip.amb * sc.ambientLight + ip.diff * ip.diffIllum;
    }

//  AColor returnColor = AColor(opac * ip.diffIllum + ip.specIllum, opac)
#endif

    // Get opacity and combine with alpha
    float opac = float(fBasicPB->GetInt(kOpacity, t)) / 100.0f;
    //float opac = 1.0f;
    alpha *= opac;

    // MAX will do the additive/alpha/no blending for us based on what Requirements()
    // we tell it. However, since MAX's formula is bgnd*sc.out.t + sc.out.c,
    // we have to multiply our output color by the alpha.
    // If we ever need a more complicated blending function, you can request the
    // background color via Requirements() (otherwise it's just black) and then do
    // the blending yourself; however, if the transparency isn't set, the shadows
    // will be opaque, so be careful.
    Color outC = ip.diffIllum + ip.specIllum;

    sc.out.c = ( outC * alpha );
    sc.out.t = Color( 1.f - alpha, 1.f - alpha, 1.f - alpha );

#endif
}
예제 #26
0
void plPassMtl::ShadeWithBackground(ShadeContext &sc, Color background, bool useVtxAlpha /* = true */)
{
#if 1

    // old
#if 0
    Color lightCol,rescol, diffIllum0;
    RGBA mval;
    Point3 N0,P;
    BOOL bumped = FALSE;
    int i;

    if (gbufID) 
        sc.SetGBufferID(gbufID);
    
    if (sc.mode == SCMODE_SHADOW) {
        float opac = 0.0;
        for (i=0; i < NumSubTexmaps(); i++)     {
            if (SubTexmapOn(i)) {
                hsMaxLayerBase *hsmLay = (hsMaxLayerBase *)GetSubTexmap(i);
                opac += hsmLay->GetOpacity(t);
            }
        }
        
        float f = 1.0f - opac;
        sc.out.t = Color(f,f,f);
        return;
    }
    
    N0 = sc.Normal();
    P = sc.P();
#endif

    TimeValue t = sc.CurTime();
    Color color(0, 0, 0);
    float alpha = 0.0;

    // Evaluate Base layer
    Texmap *map = fLayersPB->GetTexmap(kPassLayBase);
    if (map && ( map->ClassID() == LAYER_TEX_CLASS_ID 
                || map->ClassID() == STATIC_ENV_LAYER_CLASS_ID ) )
    {
        plLayerTex *layer = (plLayerTex*)map;
        AColor evalColor = layer->EvalColor(sc);

        color = evalColor;
        alpha = evalColor.a;
    }

    // Evaluate Top layer, if it's on
    if (fLayersPB->GetInt(kPassLayTopOn))
    {
        Texmap *map = fLayersPB->GetTexmap(kPassLayTop);
        if (map && ( map->ClassID() == LAYER_TEX_CLASS_ID 
                    || map->ClassID() == STATIC_ENV_LAYER_CLASS_ID 
                    || map->ClassID() == ANGLE_ATTEN_LAYER_CLASS_ID) )
        {
            plPlasmaMAXLayer *layer = (plPlasmaMAXLayer*)map;
            AColor evalColor = layer->EvalColor(sc);

            // Blend layers
            if( !layer->DiscardColor() )
            {
                int blendType = fLayersPB->GetInt(kPassLayBlend);
                switch (blendType)
                {
                case kBlendAdd:
                    color += evalColor * evalColor.a;
                    break;
                case kBlendAlpha:
                    color = (1.0f - evalColor.a) * color + evalColor.a * evalColor;
                    break;
                case kBlendMult:
                    color *= evalColor;
                    break;
                default:    // No blend...
                    color = evalColor;
                    break;
                }
            }
            if( !layer->DiscardAlpha() )
            {
                int alphaType = fLayersPB->GetInt(kPassLayOutputBlend);
                switch( alphaType )
                {
                case kAlphaMultiply:
                    alpha *= evalColor.a;
                    break;
                case kAlphaAdd:
                    alpha += evalColor.a;
                    break;
                case kAlphaDiscard:
                default:
                    break;
                }
            }
        }
    }

#if 1
    AColor black;
    black.Black();
    AColor white;
    white.White();


    SIllumParams ip;
    if (fBasicPB->GetInt(kPassBasEmissive))
    {
        // Emissive objects don't get shaded
        ip.diffIllum = fBasicPB->GetColor(kPassBasColorAmb, t) * color;
        ip.diffIllum.ClampMinMax();
        ip.specIllum = black;
    }
    else
    {
        //
        // Shading setup
        //

        // Setup the parameters for the shader
        ip.amb = fBasicPB->GetColor(kPassBasColorAmb, t);
        ip.diff = fBasicPB->GetColor(kPassBasColor, t) * color;
        ip.diffIllum = black;
        ip.specIllum = black;
        ip.N = sc.Normal();
        ip.V = sc.V();


        //
        // Specularity
        //
        if (fBasicPB->GetInt(kPassBasUseSpec, t))
        {
            ip.sh_str = 1.f;
            ip.spec = fBasicPB->GetColor( kPassBasSpecColor, t );
            ip.ph_exp = (float)pow(2.0f,float(fBasicPB->GetInt(kPassBasShine, t)) / 10.0f);
            ip.shine = float(fBasicPB->GetInt(kPassBasShine, t)) / 100.0f;
        }
        else
        {
            ip.spec = black;
            ip.sh_str = 0;
            ip.ph_exp = 0;
            ip.shine = 0;
        }
        ip.softThresh = 0;

        //

        // Do the shading
        Shader *myShader = GetShader(SHADER_BLINN);
        myShader->Illum(sc, ip);

        // Override shader parameters
        if (fAdvPB->GetInt(kPBAdvNoShade))
        {
            ip.diffIllum = black;
            ip.specIllum = black;
        }
        if (fAdvPB->GetInt(kPBAdvWhite))
        {
            ip.diffIllum = white;
            ip.specIllum = black;
        }

        ip.specIllum.ClampMinMax();
        ip.diffIllum = ip.amb * sc.ambientLight + ip.diff * ip.diffIllum;
        ip.diffIllum.ClampMinMax();
    }

//  AColor returnColor = AColor(opac * ip.diffIllum + ip.specIllum, opac)
#endif

    // Get opacity and combine with alpha
    float opac = float(fBasicPB->GetInt(kPassBasOpacity, t)) / 100.0f;
    alpha *= opac;

    float vtxAlpha = 1.0f;
    if (useVtxAlpha && GetOutputBlend() == plPassMtlBase::kBlendAlpha)
    {
        Point3 p;
        GetInterpVtxValue(MAP_ALPHA, sc, p);
        vtxAlpha = p.x;
    }
    alpha *= vtxAlpha;

    // MAX will do the additive/alpha/no blending for us based on what Requirements()
    // we tell it. However, since MAX's formula is bgnd*sc.out.t + sc.out.c,
    // we have to multiply our output color by the alpha.
    // If we ever need a more complicated blending function, you can request the
    // background color via Requirements() (otherwise it's just black) and then do
    // the blending yourself; however, if the transparency isn't set, the shadows
    // will be opaque, so be careful.
    Color outC = ip.diffIllum + ip.specIllum;

    sc.out.c = ( outC * alpha );
    sc.out.t = Color( 1.f - alpha, 1.f - alpha, 1.f - alpha );

#endif
}
예제 #27
0
	MaterialID TitleScreen::GetMaterial()
	{
		TextureParameter textureParameter(GetTexture());
		MaterialParameters materialParameters;
		materialParameters.diffuseMapParam = textureParameter;

		static MaterialID titleScreenMaterialID = SceneManager::GetInstance().GetMaterialManager()->CreateMaterial(materialParameters,GetShader());

		return titleScreenMaterialID;
	}
예제 #28
0
void mitk::ShaderRepository::ApplyProperties(mitk::DataNode* node, vtkActor *actor, mitk::BaseRenderer* renderer,itk::TimeStamp &MTime)
{
  bool setMTime = false;

  vtkProperty* property = actor->GetProperty();

  unsigned long ts = MTime.GetMTime();

  mitk::ShaderProperty *sep=(mitk::ShaderProperty *)node->GetProperty("shader",renderer);

  if(!sep)
  {
    property->ShadingOff();
    return;
  }

  std::string shader=sep->GetValueAsString();

  // Need update pipeline mode
  if(sep->GetMTime() > ts)
  {
    if(shader.compare("fixed")==0)
    {
      //MITK_INFO << "disabling shader";
      property->ShadingOff();
    }
    else
    {
      Shader *s=GetShader(shader.c_str());
      if(s)
      {
        //MITK_INFO << "enabling shader";
        property->ShadingOn();
        property->LoadMaterial(s->path.c_str());
      }
    }
    setMTime = true;
  }

   if(shader.compare("fixed")!=0)
  {
    Shader *s=GetShader(shader.c_str());

    if(!s)
      return;

    std::list<Shader::Uniform::Pointer>::const_iterator j = s->uniforms.begin();

    while( j != s->uniforms.end() )
    {
      std::string propertyName = "shader." + s->name + "." + (*j)->name;

    //  MITK_INFO << "querying property: " << propertyName;

    //  mitk::BaseProperty *p = node->GetProperty( propertyName.c_str(), renderer );

    //  if( p && p->GetMTime() > MTime.GetMTime() )
      {
        float fval[4];

       // MITK_INFO << "copying property " << propertyName << " ->->- " << (*j)->name << " type=" << (*j)->type ;


        switch( (*j)->type )
        {
          case Shader::Uniform::glsl_float:
            node->GetFloatProperty( propertyName.c_str(), fval[0], renderer );
            property->AddShaderVariable( (*j)->name.c_str(), 1 , fval );
            break;

          case Shader::Uniform::glsl_vec2:
            node->GetFloatProperty( (propertyName+".x").c_str(), fval[0], renderer );
            node->GetFloatProperty( (propertyName+".y").c_str(), fval[1], renderer );
            property->AddShaderVariable( (*j)->name.c_str(), 2 , fval );
            break;

          case Shader::Uniform::glsl_vec3:
            node->GetFloatProperty( (propertyName+".x").c_str(), fval[0], renderer );
            node->GetFloatProperty( (propertyName+".y").c_str(), fval[1], renderer );
            node->GetFloatProperty( (propertyName+".z").c_str(), fval[2], renderer );

            property->AddShaderVariable( (*j)->name.c_str(), 3 , fval );
            break;

         case Shader::Uniform::glsl_vec4:
            node->GetFloatProperty( (propertyName+".x").c_str(), fval[0], renderer );
            node->GetFloatProperty( (propertyName+".y").c_str(), fval[1], renderer );
            node->GetFloatProperty( (propertyName+".z").c_str(), fval[2], renderer );
            node->GetFloatProperty( (propertyName+".w").c_str(), fval[3], renderer );
            property->AddShaderVariable( (*j)->name.c_str(), 4 , fval );
            break;

         default:
          break;

        }

        //setMTime=true;
      }

      j++;
    }
  }

  if(setMTime)
    MTime.Modified();
}
예제 #29
0
		bool c_shader_instance::UsesGBuffer()
		{
			if(!GetShader() || !GetShader()->GetShaderDefinition<TagGroups::s_shader_postprocess_definition>())
				return false;
			return GetShader()->GetShaderDefinition<TagGroups::s_shader_postprocess_definition>()->runtime.flags.uses_gbuffer_bit;
		}
예제 #30
0
	void Material::ActivateForDraw()
	{
		GetShader()->Activate();
		ActivateTextures();
	}