mirror of
https://port.numenaute.org/aleajactaest/khanat-opennel-code.git
synced 2024-11-26 17:16:20 +00:00
Use new program interface for water vertex program
This commit is contained in:
parent
dd490a0cc4
commit
32288eabe8
3 changed files with 101 additions and 23 deletions
|
@ -49,6 +49,29 @@ const NLMISC::CClassId WaveMakerModelClassId = NLMISC::CClassId(0x16da3356, 0x7
|
|||
const uint WATER_VERTEX_HARD_SIZE = sizeof(float[3]);
|
||||
const uint WATER_VERTEX_SOFT_SIZE = sizeof(float[5]);
|
||||
|
||||
// VP Water No Wave
|
||||
class CVertexProgramWaterVPNoWave : public CVertexProgram
|
||||
{
|
||||
public:
|
||||
struct CIdx
|
||||
{
|
||||
uint BumpMap0Scale;
|
||||
uint BumpMap0Offset;
|
||||
uint BumpMap1Scale;
|
||||
uint BumpMap1Offset;
|
||||
uint ObserverHeight;
|
||||
uint ScaleReflectedRay;
|
||||
uint DiffuseMapVector0;
|
||||
uint DiffuseMapVector1;
|
||||
};
|
||||
CVertexProgramWaterVPNoWave(bool diffuse);
|
||||
virtual ~CVertexProgramWaterVPNoWave() { }
|
||||
virtual void buildInfo();
|
||||
inline const CIdx &idx() const { return m_Idx; }
|
||||
private:
|
||||
CIdx m_Idx;
|
||||
bool m_Diffuse;
|
||||
};
|
||||
|
||||
/**
|
||||
* A water shape.
|
||||
|
@ -256,8 +279,8 @@ private:
|
|||
static NLMISC::CSmartPtr<CVertexProgram> _VertexProgramNoBump;
|
||||
static NLMISC::CSmartPtr<CVertexProgram> _VertexProgramNoBumpDiffuse;
|
||||
//
|
||||
static NLMISC::CSmartPtr<CVertexProgram> _VertexProgramNoWave;
|
||||
static NLMISC::CSmartPtr<CVertexProgram> _VertexProgramNoWaveDiffuse;
|
||||
static NLMISC::CSmartPtr<CVertexProgramWaterVPNoWave> _VertexProgramNoWave;
|
||||
static NLMISC::CSmartPtr<CVertexProgramWaterVPNoWave> _VertexProgramNoWaveDiffuse;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -903,15 +903,12 @@ void CWaterModel::setupMaterialNVertexShader(IDriver *drv, CWaterShape *shape, c
|
|||
_WaterMat.setZWrite(true);
|
||||
_WaterMat.setShader(CMaterial::Water);
|
||||
}
|
||||
const uint cstOffset = 5; // 4 places for the matrix
|
||||
NLMISC::CVectorH cst[13];
|
||||
//=========================//
|
||||
// setup Water material //
|
||||
//=========================//
|
||||
shape->initVertexProgram();
|
||||
CVertexProgram *program = shape->_ColorMap ? CWaterShape::_VertexProgramNoWaveDiffuse : CWaterShape::_VertexProgramNoWave;
|
||||
CVertexProgramWaterVPNoWave *program = shape->_ColorMap ? CWaterShape::_VertexProgramNoWaveDiffuse : CWaterShape::_VertexProgramNoWave;
|
||||
drv->activeVertexProgram(program);
|
||||
// TODO_VP_MATERIAL
|
||||
CWaterModel::_WaterMat.setTexture(0, shape->_BumpMap[0]);
|
||||
CWaterModel::_WaterMat.setTexture(1, shape->_BumpMap[1]);
|
||||
CWaterModel::_WaterMat.setTexture(3, shape->_ColorMap);
|
||||
|
@ -957,23 +954,21 @@ void CWaterModel::setupMaterialNVertexShader(IDriver *drv, CWaterShape *shape, c
|
|||
{
|
||||
// setup 2x3 matrix for lookup in diffuse map
|
||||
updateDiffuseMapMatrix();
|
||||
cst[11].set(_ColorMapMatColumn0.x, _ColorMapMatColumn1.x, 0, _ColorMapMatColumn0.x * obsPos.x + _ColorMapMatColumn1.x * obsPos.y + _ColorMapMatPos.x);
|
||||
cst[12].set(_ColorMapMatColumn0.y, _ColorMapMatColumn1.y, 0, _ColorMapMatColumn0.y * obsPos.x + _ColorMapMatColumn1.y * obsPos.y + _ColorMapMatPos.y);
|
||||
drv->setUniform4f(IDriver::VertexProgram, program->idx().DiffuseMapVector0, _ColorMapMatColumn0.x, _ColorMapMatColumn1.x, 0, _ColorMapMatColumn0.x * obsPos.x + _ColorMapMatColumn1.x * obsPos.y + _ColorMapMatPos.x);
|
||||
drv->setUniform4f(IDriver::VertexProgram, program->idx().DiffuseMapVector1, _ColorMapMatColumn0.y, _ColorMapMatColumn1.y, 0, _ColorMapMatColumn0.y * obsPos.x + _ColorMapMatColumn1.y * obsPos.y + _ColorMapMatPos.y);
|
||||
}
|
||||
/// set matrix
|
||||
drv->setConstantMatrix(0, IDriver::ModelViewProjection, IDriver::Identity);
|
||||
/// temp
|
||||
// drv->setUniformMatrix(IDriver::VertexProgram, program->indices().ModelViewProjection, IDriver::ModelViewProjection, IDriver::Identity); // now set by setUniformDriver in setupMaterial
|
||||
// drv->setUniformFog(IDriver::VertexProgram, program->indices().Fog); // now set by setUniformDriver in setupMaterial
|
||||
// retrieve current time
|
||||
double date = scene->getCurrentTime();
|
||||
// set bumpmaps pos
|
||||
cst[6].set(fmodf(obsPos.x * shape->_HeightMapScale[0].x, 1.f) + (float) fmod(date * shape->_HeightMapSpeed[0].x, 1), fmodf(shape->_HeightMapScale[0].y * obsPos.y, 1.f) + (float) fmod(date * shape->_HeightMapSpeed[0].y, 1), 0.f, 1.f); // bump map 0 offset
|
||||
cst[5].set(shape->_HeightMapScale[0].x, shape->_HeightMapScale[0].y, 0, 0); // bump map 0 scale
|
||||
cst[8].set(fmodf(shape->_HeightMapScale[1].x * obsPos.x, 1.f) + (float) fmod(date * shape->_HeightMapSpeed[1].x, 1), fmodf(shape->_HeightMapScale[1].y * obsPos.y, 1.f) + (float) fmod(date * shape->_HeightMapSpeed[1].y, 1), 0.f, 1.f); // bump map 1 offset
|
||||
cst[7].set(shape->_HeightMapScale[1].x, shape->_HeightMapScale[1].y, 0, 0); // bump map 1 scale
|
||||
cst[9].set(0, 0, obsPos.z - zHeight, 1.f);
|
||||
cst[10].set(0.5f, 0.5f, 0.f, 1.f); // used to scale reflected ray into the envmap
|
||||
/// set all our constants in one call
|
||||
drv->setConstant(cstOffset, sizeof(cst) / sizeof(cst[0]) - cstOffset, (float *) &cst[cstOffset]);
|
||||
drv->setConstantFog(4);
|
||||
drv->setUniform4f(IDriver::VertexProgram, program->idx().BumpMap0Offset, fmodf(obsPos.x * shape->_HeightMapScale[0].x, 1.f) + (float) fmod(date * shape->_HeightMapSpeed[0].x, 1), fmodf(shape->_HeightMapScale[0].y * obsPos.y, 1.f) + (float) fmod(date * shape->_HeightMapSpeed[0].y, 1), 0.f, 1.f); // bump map 0 offset
|
||||
drv->setUniform4f(IDriver::VertexProgram, program->idx().BumpMap0Scale, shape->_HeightMapScale[0].x, shape->_HeightMapScale[0].y, 0, 0); // bump map 0 scale
|
||||
drv->setUniform4f(IDriver::VertexProgram, program->idx().BumpMap1Offset, fmodf(shape->_HeightMapScale[1].x * obsPos.x, 1.f) + (float) fmod(date * shape->_HeightMapSpeed[1].x, 1), fmodf(shape->_HeightMapScale[1].y * obsPos.y, 1.f) + (float) fmod(date * shape->_HeightMapSpeed[1].y, 1), 0.f, 1.f); // bump map 1 offset
|
||||
drv->setUniform4f(IDriver::VertexProgram, program->idx().BumpMap1Scale, shape->_HeightMapScale[1].x, shape->_HeightMapScale[1].y, 0, 0); // bump map 1 scale
|
||||
drv->setUniform4f(IDriver::VertexProgram, program->idx().ObserverHeight, 0, 0, obsPos.z - zHeight, 1.f);
|
||||
drv->setUniform4f(IDriver::VertexProgram, program->idx().ScaleReflectedRay, 0.5f, 0.5f, 0.f, 1.f); // used to scale reflected ray into the envmap
|
||||
}
|
||||
|
||||
//================================================
|
||||
|
|
|
@ -81,7 +81,67 @@ DP4 o[TEX3].x, v[0], c[11]; #compute uv for diffuse texture \n\
|
|||
DP4 o[TEX3].y, v[0], c[12]; \n\
|
||||
END";
|
||||
|
||||
CVertexProgramWaterVPNoWave::CVertexProgramWaterVPNoWave(bool diffuse)
|
||||
{
|
||||
m_Diffuse = diffuse;
|
||||
// nelvp
|
||||
{
|
||||
CSource *source = new CSource();
|
||||
source->Profile = nelvp;
|
||||
source->DisplayName = "WaterVPNoWave/nelvp";
|
||||
source->Features.DriverFlags =
|
||||
CGPUProgramFeatures::ModelViewProjection
|
||||
| CGPUProgramFeatures::Fog;
|
||||
source->ParamIndices["modelViewProjection"] = 0;
|
||||
source->ParamIndices["fog"] = 4;
|
||||
source->ParamIndices["bumpMap0Scale"] = 5;
|
||||
source->ParamIndices["bumpMap0Offset"] = 6;
|
||||
source->ParamIndices["bumpMap1Scale"] = 7;
|
||||
source->ParamIndices["bumpMap1Offset"] = 8;
|
||||
source->ParamIndices["observerHeight"] = 9;
|
||||
source->ParamIndices["scaleReflectedRay"] = 10;
|
||||
if (diffuse)
|
||||
{
|
||||
source->DisplayName += "/diffuse";
|
||||
source->ParamIndices["diffuseMapVector0"] = 11;
|
||||
source->ParamIndices["diffuseMapVector1"] = 12;
|
||||
source->setSourcePtr(WaterVPNoWaveDiffuse);
|
||||
}
|
||||
else
|
||||
{
|
||||
source->setSourcePtr(WaterVPNoWave);
|
||||
}
|
||||
addSource(source);
|
||||
}
|
||||
// glsl330v
|
||||
{
|
||||
// TODO_VP_GLSL
|
||||
// CSource *source = new CSource();
|
||||
// source->Profile = glsl330v;
|
||||
// source->DisplayName = "WaterVPNoWave/glsl330v";
|
||||
// if (diffuse) source->DisplayName += "/diffuse";
|
||||
// source->Features.DriverFlags =
|
||||
// CGPUProgramFeatures::ModelViewProjection
|
||||
// | CGPUProgramFeatures::Fog;
|
||||
// source->setSource...
|
||||
// addSource(source);
|
||||
}
|
||||
}
|
||||
|
||||
void CVertexProgramWaterVPNoWave::buildInfo()
|
||||
{
|
||||
m_Idx.BumpMap0Scale = getUniformIndex("bumpMap0Scale");
|
||||
m_Idx.BumpMap0Offset = getUniformIndex("bumpMap0Offset");
|
||||
m_Idx.BumpMap1Scale = getUniformIndex("bumpMap1Scale");
|
||||
m_Idx.BumpMap1Offset = getUniformIndex("bumpMap1Offset");
|
||||
m_Idx.ObserverHeight = getUniformIndex("observerHeight");
|
||||
m_Idx.ScaleReflectedRay = getUniformIndex("scaleReflectedRay");
|
||||
if (m_Diffuse)
|
||||
{
|
||||
m_Idx.DiffuseMapVector0 = getUniformIndex("diffuseMapVector0");
|
||||
m_Idx.DiffuseMapVector1 = getUniformIndex("diffuseMapVector1");
|
||||
}
|
||||
}
|
||||
|
||||
////////////////
|
||||
// WAVY WATER //
|
||||
|
@ -195,8 +255,8 @@ NLMISC::CSmartPtr<CVertexProgram> CWaterShape::_VertexProgramBump2Diffuse;
|
|||
NLMISC::CSmartPtr<CVertexProgram> CWaterShape::_VertexProgramNoBump;
|
||||
NLMISC::CSmartPtr<CVertexProgram> CWaterShape::_VertexProgramNoBumpDiffuse;
|
||||
// water with no waves
|
||||
NLMISC::CSmartPtr<CVertexProgram> CWaterShape::_VertexProgramNoWave;
|
||||
NLMISC::CSmartPtr<CVertexProgram> CWaterShape::_VertexProgramNoWaveDiffuse;
|
||||
NLMISC::CSmartPtr<CVertexProgramWaterVPNoWave> CWaterShape::_VertexProgramNoWave;
|
||||
NLMISC::CSmartPtr<CVertexProgramWaterVPNoWave> CWaterShape::_VertexProgramNoWaveDiffuse;
|
||||
|
||||
|
||||
/** Build a vertex program for water depending on requirements
|
||||
|
@ -331,8 +391,8 @@ void CWaterShape::initVertexProgram()
|
|||
_VertexProgramNoBump = BuildWaterVP(false, false, false);
|
||||
_VertexProgramNoBumpDiffuse = BuildWaterVP(true, false, false);
|
||||
// no waves
|
||||
_VertexProgramNoWave = new CVertexProgram(WaterVPNoWave); // TODO_VP_GLSL
|
||||
_VertexProgramNoWaveDiffuse = new CVertexProgram(WaterVPNoWaveDiffuse); // TODO_VP_GLSL
|
||||
_VertexProgramNoWave = new CVertexProgramWaterVPNoWave(false);
|
||||
_VertexProgramNoWaveDiffuse = new CVertexProgramWaterVPNoWave(true); // TODO_VP_GLSL
|
||||
created = true;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue