Commit 5cfeba46 authored by nadro's avatar nadro

- Fixed compilation issues with CG support enabled.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@4560 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 40df626e
......@@ -154,8 +154,8 @@ void CCgUniformSampler2D::update(const void* data, const SMaterial& material) co
{
}
CCgMaterialRenderer::CCgMaterialRenderer(IShaderConstantSetCallBack* callback, IMaterialRenderer* baseMaterial, s32 userData) :
CallBack(callback), BaseMaterial(baseMaterial), UserData(userData),
CCgMaterialRenderer::CCgMaterialRenderer(IShaderConstantSetCallBack* callback, s32 userData) :
CallBack(callback), UserData(userData),
VertexProgram(0), FragmentProgram(0), GeometryProgram(0), VertexProfile(CG_PROFILE_UNKNOWN), FragmentProfile(CG_PROFILE_UNKNOWN), GeometryProfile(CG_PROFILE_UNKNOWN),
Material(IdentityMaterial), Error(CG_NO_ERROR)
{
......@@ -163,9 +163,6 @@ CCgMaterialRenderer::CCgMaterialRenderer(IShaderConstantSetCallBack* callback, I
setDebugName("CCgMaterialRenderer");
#endif
if(BaseMaterial)
BaseMaterial->grab();
if(CallBack)
CallBack->grab();
}
......@@ -175,20 +172,12 @@ CCgMaterialRenderer::~CCgMaterialRenderer()
if(CallBack)
CallBack->drop();
if(BaseMaterial)
BaseMaterial->drop();
for(unsigned int i = 0; i < UniformInfo.size(); ++i)
delete UniformInfo[i];
UniformInfo.clear();
}
bool CCgMaterialRenderer::isTransparent() const
{
return BaseMaterial ? BaseMaterial->isTransparent() : false;
}
s32 CCgMaterialRenderer::getVertexShaderConstantID(const c8* name)
{
return getPixelShaderConstantID(name);
......
......@@ -130,10 +130,10 @@ public:
class CCgMaterialRenderer : public IMaterialRenderer, public IMaterialRendererServices
{
public:
CCgMaterialRenderer(IShaderConstantSetCallBack* callback = 0, IMaterialRenderer* baseMaterial = 0, s32 userData = 0);
CCgMaterialRenderer(IShaderConstantSetCallBack* callback = 0, s32 userData = 0);
virtual ~CCgMaterialRenderer();
virtual bool isTransparent() const _IRR_OVERRIDE_;
virtual bool isTransparent() const = 0;
virtual s32 getVertexShaderConstantID(const c8* name) _IRR_OVERRIDE_;
virtual s32 getPixelShaderConstantID(const c8* name) _IRR_OVERRIDE_;
......@@ -148,7 +148,6 @@ protected:
void getUniformList();
IShaderConstantSetCallBack* CallBack;
IMaterialRenderer* BaseMaterial;
s32 UserData;
core::array<CCgUniform*> UniformInfo;
......
......@@ -38,18 +38,24 @@ CD3D9CgMaterialRenderer::CD3D9CgMaterialRenderer(CD3D9Driver* driver, s32& mater
const c8* geometryProgram, const c8* geometryEntry, E_GEOMETRY_SHADER_TYPE geometryProfile,
scene::E_PRIMITIVE_TYPE inType, scene::E_PRIMITIVE_TYPE outType, u32 vertices,
IShaderConstantSetCallBack* callback, IMaterialRenderer* baseMaterial, s32 userData) :
Driver(driver), CCgMaterialRenderer(callback, baseMaterial, userData)
BaseMaterial(baseMaterial), Driver(driver), CCgMaterialRenderer(callback, userData)
{
#ifdef _DEBUG
setDebugName("CD3D9CgMaterialRenderer");
#endif
if(BaseMaterial)
BaseMaterial->grab();
init(materialType, vertexProgram, vertexEntry, vertexProfile, fragmentProgram, fragmentEntry, fragmentProfile,
geometryProgram, geometryEntry, geometryProfile, inType, outType, vertices);
}
CD3D9CgMaterialRenderer::~CD3D9CgMaterialRenderer()
{
if(BaseMaterial)
BaseMaterial->drop();
if (VertexProgram)
{
cgD3D9UnloadProgram(VertexProgram);
......@@ -60,11 +66,11 @@ CD3D9CgMaterialRenderer::~CD3D9CgMaterialRenderer()
cgD3D9UnloadProgram(FragmentProgram);
cgDestroyProgram(FragmentProgram);
}
/*if (GeometryProgram)
{
cgD3D9UnloadProgram(GeometryProgram);
cgDestroyProgram(GeometryProgram);
}*/
}
bool CD3D9CgMaterialRenderer::isTransparent() const
{
return BaseMaterial ? BaseMaterial->isTransparent() : false;
}
void CD3D9CgMaterialRenderer::OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, bool resetAllRenderstates, IMaterialRendererServices* services)
......
......@@ -53,6 +53,8 @@ public:
virtual ~CD3D9CgMaterialRenderer();
virtual bool isTransparent() const _IRR_OVERRIDE_;
virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, bool resetAllRenderstates, IMaterialRendererServices* services) _IRR_OVERRIDE_;
virtual bool OnRender(IMaterialRendererServices* services, E_VERTEX_TYPE vtxtype) _IRR_OVERRIDE_;
virtual void OnUnsetMaterial() _IRR_OVERRIDE_;
......@@ -72,6 +74,8 @@ protected:
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
u32 vertices = 0);
IMaterialRenderer* BaseMaterial;
CD3D9Driver* Driver;
};
......
......@@ -8,6 +8,7 @@
#include "COpenGLCgMaterialRenderer.h"
#include "COpenGLDriver.h"
#include "COpenGLTexture.h"
#include "COpenGLMaterialRenderer.h"
namespace irr
{
......@@ -38,19 +39,31 @@ COpenGLCgMaterialRenderer::COpenGLCgMaterialRenderer(COpenGLDriver* driver, s32&
const c8* fragmentProgram, const c8* fragmentEntry, E_PIXEL_SHADER_TYPE fragmentProfile,
const c8* geometryProgram, const c8* geometryEntry, E_GEOMETRY_SHADER_TYPE geometryProfile,
scene::E_PRIMITIVE_TYPE inType, scene::E_PRIMITIVE_TYPE outType, u32 vertices,
IShaderConstantSetCallBack* callback, IMaterialRenderer* baseMaterial, s32 userData) :
Driver(driver), CCgMaterialRenderer(callback, baseMaterial, userData)
IShaderConstantSetCallBack* callback, E_MATERIAL_TYPE baseMaterial, s32 userData) :
BaseMaterial(0), Driver(driver), CCgMaterialRenderer(callback, userData)
{
#ifdef _DEBUG
setDebugName("COpenGLCgMaterialRenderer");
#endif
if (baseMaterial == EMT_ONETEXTURE_BLEND || baseMaterial == EMT_TRANSPARENT_ADD_COLOR || baseMaterial == EMT_TRANSPARENT_VERTEX_ALPHA ||
baseMaterial == EMT_TRANSPARENT_ALPHA_CHANNEL || baseMaterial == EMT_TRANSPARENT_ALPHA_CHANNEL_REF)
{
BaseMaterial = static_cast<COpenGLMaterialRenderer*>(Driver->getMaterialRenderer(baseMaterial));
}
if (BaseMaterial)
BaseMaterial->grab();
init(materialType, vertexProgram, vertexEntry, vertexProfile, fragmentProgram, fragmentEntry, fragmentProfile,
geometryProgram, geometryEntry, geometryProfile, inType, outType, vertices);
}
COpenGLCgMaterialRenderer::~COpenGLCgMaterialRenderer()
{
if(BaseMaterial)
BaseMaterial->drop();
if (VertexProgram)
{
cgGLUnloadProgram(VertexProgram);
......@@ -68,6 +81,11 @@ COpenGLCgMaterialRenderer::~COpenGLCgMaterialRenderer()
}
}
bool COpenGLCgMaterialRenderer::isTransparent() const
{
return BaseMaterial ? BaseMaterial->isTransparent() : false;
}
void COpenGLCgMaterialRenderer::OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, bool resetAllRenderstates, IMaterialRendererServices* services)
{
if (Driver->getFixedPipelineState() == COpenGLDriver::EOFPS_ENABLE)
......
......@@ -42,6 +42,7 @@ namespace video
{
class COpenGLDriver;
class COpenGLMaterialRenderer;
class IShaderConstantSetCallBack;
class COpenGLCgUniformSampler2D : public CCgUniform
......@@ -65,10 +66,12 @@ public:
scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES,
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
u32 vertices = 0, IShaderConstantSetCallBack* callback = 0,
IMaterialRenderer* baseMaterial = 0, s32 userData = 0);
E_MATERIAL_TYPE baseMaterial = EMT_SOLID, s32 userData = 0);
virtual ~COpenGLCgMaterialRenderer();
virtual bool isTransparent() const _IRR_OVERRIDE_;
virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, bool resetAllRenderstates, IMaterialRendererServices* services) _IRR_OVERRIDE_;
virtual bool OnRender(IMaterialRendererServices* services, E_VERTEX_TYPE vtxtype) _IRR_OVERRIDE_;
virtual void OnUnsetMaterial() _IRR_OVERRIDE_;
......@@ -88,6 +91,8 @@ protected:
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
u32 vertices = 0);
COpenGLMaterialRenderer* BaseMaterial;
COpenGLDriver* Driver;
};
......
......@@ -4231,7 +4231,7 @@ s32 COpenGLDriver::addHighLevelShaderMaterial(
pixelShaderProgram, pixelShaderEntryPointName, psCompileTarget,
geometryShaderProgram, geometryShaderEntryPointName, gsCompileTarget,
inType, outType, verticesOut,
callback,getMaterialRenderer(baseMaterial), userData);
callback,baseMaterial, userData);
r->drop();
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment