mirror of
https://github.com/minetest/irrlicht.git
synced 2025-07-06 02:00:25 +02:00
CD3D9HLSLMaterialRenderer now implementing IMaterialRendererServices itself
Basically now the same as GLSL material renderer already worked. Before it was using IMaterialRendererServices from CD3D9Driver, but there had been several problems with that: - The d3d9 driver called functions through the CD3D9MaterialRenderer interface, but CD3D9HLSLMaterialRenderer is not (or maybe no longer?) derived from that class. Reason it still worked was accidental luck - the same functions had been in the same order and due to casts the compiler wasn't noticing it was calling the functions of an unrelated class. - It was making calls to set shader constants depend on the currently set material in the driver. Which was not necessary and just prevents we can use the IMaterialRendererServices interface without setting the material first (how I found the bug). Still some problems left for now: - There's 2 ways to call shader constants. One seems to be only used by hi-level shaders which links constants to the shader. The the other only by low-level shaders which uses global (shader independent) registers. So maybe this should be 2 interfaces? But not certain, glsl material renderer seems to prevent setting the global registers, but maybe those could be used additionally? I've still allowed it for now in HLSL, just in case it had it's uses. - setBasicRenderStates probably should not be in IMaterialRendererServices. I'm not seeing any case where this isn't just passed on to the driver. And all classes using it have access to the driver unless I missed one. So probably can just avoid that additional indirection and kick that out of the IMaterialRendererServices interface. git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6464 dfc29bdd-3216-0410-991c-e03cc46cb475
This commit is contained in:
@ -3100,31 +3100,6 @@ const core::matrix4& CD3D9Driver::getTransform(E_TRANSFORMATION_STATE state) con
|
||||
}
|
||||
|
||||
|
||||
//! Get a vertex shader constant index.
|
||||
s32 CD3D9Driver::getVertexShaderConstantID(const c8* name)
|
||||
{
|
||||
if (Material.MaterialType >= 0 && Material.MaterialType < (s32)MaterialRenderers.size())
|
||||
{
|
||||
CD3D9MaterialRenderer* r = (CD3D9MaterialRenderer*)MaterialRenderers[Material.MaterialType].Renderer;
|
||||
return r->getVariableID(true, name);
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
//! Get a pixel shader constant index.
|
||||
s32 CD3D9Driver::getPixelShaderConstantID(const c8* name)
|
||||
{
|
||||
if (Material.MaterialType >= 0 && Material.MaterialType < (s32)MaterialRenderers.size())
|
||||
{
|
||||
CD3D9MaterialRenderer* r = (CD3D9MaterialRenderer*)MaterialRenderers[Material.MaterialType].Renderer;
|
||||
return r->getVariableID(false, name);
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
//! Sets a vertex shader constant.
|
||||
void CD3D9Driver::setVertexShaderConstant(const f32* data, s32 startRegister, s32 constantAmount)
|
||||
{
|
||||
@ -3132,7 +3107,6 @@ void CD3D9Driver::setVertexShaderConstant(const f32* data, s32 startRegister, s3
|
||||
pID3DDevice->SetVertexShaderConstantF(startRegister, data, constantAmount);
|
||||
}
|
||||
|
||||
|
||||
//! Sets a pixel shader constant.
|
||||
void CD3D9Driver::setPixelShaderConstant(const f32* data, s32 startRegister, s32 constantAmount)
|
||||
{
|
||||
@ -3140,86 +3114,55 @@ void CD3D9Driver::setPixelShaderConstant(const f32* data, s32 startRegister, s32
|
||||
pID3DDevice->SetPixelShaderConstantF(startRegister, data, constantAmount);
|
||||
}
|
||||
|
||||
s32 CD3D9Driver::getVertexShaderConstantID(const c8* name)
|
||||
{
|
||||
os::Printer::log("Error: Please call services->getVertexShaderConstantID(), not VideoDriver->getVertexShaderConstantID().");
|
||||
return -1;
|
||||
}
|
||||
|
||||
s32 CD3D9Driver::getPixelShaderConstantID(const c8* name)
|
||||
{
|
||||
os::Printer::log("Error: Please call services->getPixelShaderConstantID(), not VideoDriver->getPixelShaderConstantID().");
|
||||
return -1;
|
||||
}
|
||||
|
||||
//! Sets a constant for the vertex shader based on an index.
|
||||
bool CD3D9Driver::setVertexShaderConstant(s32 index, const f32* floats, int count)
|
||||
{
|
||||
if (Material.MaterialType >= 0 && Material.MaterialType < (s32)MaterialRenderers.size())
|
||||
{
|
||||
CD3D9MaterialRenderer* r = (CD3D9MaterialRenderer*)MaterialRenderers[Material.MaterialType].Renderer;
|
||||
return r->setVariable(true, index, floats, count);
|
||||
}
|
||||
|
||||
os::Printer::log("Error: Please call services->setVertexShaderConstant(), not VideoDriver->setVertexShaderConstant().");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//! Int interface for the above.
|
||||
bool CD3D9Driver::setVertexShaderConstant(s32 index, const s32* ints, int count)
|
||||
{
|
||||
if (Material.MaterialType >= 0 && Material.MaterialType < (s32)MaterialRenderers.size())
|
||||
{
|
||||
CD3D9MaterialRenderer* r = (CD3D9MaterialRenderer*)MaterialRenderers[Material.MaterialType].Renderer;
|
||||
return r->setVariable(true, index, ints, count);
|
||||
}
|
||||
|
||||
os::Printer::log("Error: Please call services->setVertexShaderConstant(), not VideoDriver->setVertexShaderConstant().");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//! Uint interface for the above.
|
||||
bool CD3D9Driver::setVertexShaderConstant(s32 index, const u32* ints, int count)
|
||||
{
|
||||
if (Material.MaterialType >= 0 && Material.MaterialType < (s32)MaterialRenderers.size())
|
||||
{
|
||||
CD3D9MaterialRenderer* r = (CD3D9MaterialRenderer*)MaterialRenderers[Material.MaterialType].Renderer;
|
||||
return r->setVariable(true, index, ints, count);
|
||||
}
|
||||
|
||||
os::Printer::log("Error: Please call services->setVertexShaderConstant(), not VideoDriver->setVertexShaderConstant().");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//! Sets a constant for the pixel shader based on an index.
|
||||
bool CD3D9Driver::setPixelShaderConstant(s32 index, const f32* floats, int count)
|
||||
{
|
||||
if (Material.MaterialType >= 0 && Material.MaterialType < (s32)MaterialRenderers.size())
|
||||
{
|
||||
CD3D9MaterialRenderer* r = (CD3D9MaterialRenderer*)MaterialRenderers[Material.MaterialType].Renderer;
|
||||
return r->setVariable(false, index, floats, count);
|
||||
}
|
||||
|
||||
os::Printer::log("Error: Please call services->setPixelShaderConstant(), not VideoDriver->setPixelShaderConstant().");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//! Int interface for the above.
|
||||
bool CD3D9Driver::setPixelShaderConstant(s32 index, const s32* ints, int count)
|
||||
{
|
||||
if (Material.MaterialType >= 0 && Material.MaterialType < (s32)MaterialRenderers.size())
|
||||
{
|
||||
CD3D9MaterialRenderer* r = (CD3D9MaterialRenderer*)MaterialRenderers[Material.MaterialType].Renderer;
|
||||
return r->setVariable(false, index, ints, count);
|
||||
}
|
||||
|
||||
os::Printer::log("Error: Please call services->setPixelShaderConstant(), not VideoDriver->setPixelShaderConstant().");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//! Uint interface for the above.
|
||||
bool CD3D9Driver::setPixelShaderConstant(s32 index, const u32* ints, int count)
|
||||
{
|
||||
if (Material.MaterialType >= 0 && Material.MaterialType < (s32)MaterialRenderers.size())
|
||||
{
|
||||
CD3D9MaterialRenderer* r = (CD3D9MaterialRenderer*)MaterialRenderers[Material.MaterialType].Renderer;
|
||||
return r->setVariable(false, index, ints, count);
|
||||
}
|
||||
|
||||
os::Printer::log("Error: Please call services->setPixelShaderConstant(), not VideoDriver->setPixelShaderConstant().");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//! Adds a new material renderer to the VideoDriver, using pixel and/or
|
||||
//! vertex shaders to render geometry.
|
||||
s32 CD3D9Driver::addShaderMaterial(const c8* vertexShaderProgram,
|
||||
|
Reference in New Issue
Block a user