Q3 shader fix by sio2
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1550 dfc29bdd-3216-0410-991c-e03cc46cb475master
parent
47b358bcd1
commit
b7d528d4a0
|
@ -42,12 +42,12 @@ CQuake3ShaderSceneNode::CQuake3ShaderSceneNode(
|
|||
this->Name = Shader->name;
|
||||
|
||||
// clone meshbuffer to modifiable buffer
|
||||
cloneBuffer( static_cast< scene::SMeshBufferLightMap *> ( buffer ) );
|
||||
cloneBuffer( static_cast< scene::SMeshBufferLightMap *>( buffer ) );
|
||||
|
||||
// load all Textures in all stages
|
||||
loadTextures ( fileSystem );
|
||||
loadTextures( fileSystem );
|
||||
|
||||
setAutomaticCulling ( scene::EAC_BOX );
|
||||
setAutomaticCulling( scene::EAC_BOX );
|
||||
}
|
||||
|
||||
|
||||
|
@ -63,7 +63,7 @@ CQuake3ShaderSceneNode::~CQuake3ShaderSceneNode()
|
|||
/*
|
||||
create single copies
|
||||
*/
|
||||
void CQuake3ShaderSceneNode::cloneBuffer ( scene::SMeshBufferLightMap * buffer )
|
||||
void CQuake3ShaderSceneNode::cloneBuffer( scene::SMeshBufferLightMap * buffer )
|
||||
{
|
||||
Original->Material = buffer->Material;
|
||||
MeshBuffer->Material = buffer->Material;
|
||||
|
@ -71,7 +71,7 @@ void CQuake3ShaderSceneNode::cloneBuffer ( scene::SMeshBufferLightMap * buffer )
|
|||
Original->Indices = buffer->Indices;
|
||||
MeshBuffer->Indices = buffer->Indices;
|
||||
|
||||
const u32 vsize = buffer->Vertices.size ();
|
||||
const u32 vsize = buffer->Vertices.size();
|
||||
|
||||
Original->Vertices.reallocate( vsize );
|
||||
MeshBuffer->Vertices.reallocate( vsize );
|
||||
|
@ -87,7 +87,7 @@ void CQuake3ShaderSceneNode::cloneBuffer ( scene::SMeshBufferLightMap * buffer )
|
|||
MeshBuffer->Vertices.getLast().Color=0xFFFFFFFF;
|
||||
}
|
||||
|
||||
MeshBuffer->recalculateBoundingBox ();
|
||||
MeshBuffer->recalculateBoundingBox();
|
||||
|
||||
#if 1
|
||||
// move the (temp) Mesh
|
||||
|
@ -103,7 +103,7 @@ void CQuake3ShaderSceneNode::cloneBuffer ( scene::SMeshBufferLightMap * buffer )
|
|||
SceneManager->getMeshManipulator()->transform( Original, m );
|
||||
SceneManager->getMeshManipulator()->transform( MeshBuffer, m );
|
||||
|
||||
MeshBuffer->recalculateBoundingBox ();
|
||||
MeshBuffer->recalculateBoundingBox();
|
||||
}
|
||||
#endif
|
||||
// used for sorting
|
||||
|
@ -111,31 +111,30 @@ void CQuake3ShaderSceneNode::cloneBuffer ( scene::SMeshBufferLightMap * buffer )
|
|||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
load the textures for all stages
|
||||
*/
|
||||
void CQuake3ShaderSceneNode::loadTextures ( io::IFileSystem * fileSystem )
|
||||
void CQuake3ShaderSceneNode::loadTextures( io::IFileSystem * fileSystem )
|
||||
{
|
||||
const quake3::SVarGroup *group;
|
||||
u32 i;
|
||||
|
||||
// clear all stages and prefill empty
|
||||
Q3Texture.clear ();
|
||||
for ( i = 0; i != Shader->VarGroup->VariableGroup.size (); ++i )
|
||||
Q3Texture.clear();
|
||||
for ( i = 0; i != Shader->VarGroup->VariableGroup.size(); ++i )
|
||||
{
|
||||
Q3Texture.push_back ( SQ3Texture() );
|
||||
Q3Texture.push_back( SQ3Texture() );
|
||||
}
|
||||
|
||||
u32 pos;
|
||||
|
||||
// get texture map
|
||||
for ( i = 0; i < Shader->VarGroup->VariableGroup.size (); ++i )
|
||||
for ( i = 0; i < Shader->VarGroup->VariableGroup.size(); ++i )
|
||||
{
|
||||
group = Shader->getGroup ( i );
|
||||
group = Shader->getGroup( i );
|
||||
|
||||
const core::stringc &mapname = group->get ( "map" );
|
||||
if ( 0 == mapname.size () )
|
||||
const core::stringc &mapname = group->get( "map" );
|
||||
if ( 0 == mapname.size() )
|
||||
continue;
|
||||
|
||||
// our lightmap is passed in material.Texture[2]
|
||||
|
@ -146,44 +145,44 @@ void CQuake3ShaderSceneNode::loadTextures ( io::IFileSystem * fileSystem )
|
|||
else
|
||||
{
|
||||
pos = 0;
|
||||
quake3::getTextures ( Q3Texture [i].Texture, mapname, pos, fileSystem, SceneManager->getVideoDriver() );
|
||||
quake3::getTextures( Q3Texture [i].Texture, mapname, pos, fileSystem, SceneManager->getVideoDriver() );
|
||||
}
|
||||
}
|
||||
|
||||
// get anim map
|
||||
for ( i = 0; i < Shader->VarGroup->VariableGroup.size (); ++i )
|
||||
for ( i = 0; i < Shader->VarGroup->VariableGroup.size(); ++i )
|
||||
{
|
||||
if ( Q3Texture [i].Texture.size() )
|
||||
continue;
|
||||
|
||||
group = Shader->getGroup ( i );
|
||||
group = Shader->getGroup( i );
|
||||
|
||||
const core::stringc &animmap = group->get ( "animmap" );
|
||||
if ( 0 == animmap.size () )
|
||||
const core::stringc &animmap = group->get( "animmap" );
|
||||
if ( 0 == animmap.size() )
|
||||
continue;
|
||||
|
||||
// first parameter is frequency
|
||||
pos = 0;
|
||||
Q3Texture [i].TextureFrequency = core::max_ ( 0.0001f, quake3::getAsFloat ( animmap, pos ) );
|
||||
Q3Texture [i].TextureFrequency = core::max_( 0.0001f, quake3::getAsFloat( animmap, pos ) );
|
||||
|
||||
quake3::getTextures ( Q3Texture [i].Texture, animmap, pos,fileSystem, SceneManager->getVideoDriver() );
|
||||
quake3::getTextures( Q3Texture [i].Texture, animmap, pos,fileSystem, SceneManager->getVideoDriver() );
|
||||
}
|
||||
|
||||
// get clamp map
|
||||
for ( i = 0; i < Shader->VarGroup->VariableGroup.size (); ++i )
|
||||
for ( i = 0; i < Shader->VarGroup->VariableGroup.size(); ++i )
|
||||
{
|
||||
if ( Q3Texture [i].Texture.size() )
|
||||
continue;
|
||||
|
||||
group = Shader->getGroup ( i );
|
||||
group = Shader->getGroup( i );
|
||||
|
||||
const core::stringc &clampmap = group->get ( "clampmap" );
|
||||
if ( 0 == clampmap.size () )
|
||||
const core::stringc &clampmap = group->get( "clampmap" );
|
||||
if ( 0 == clampmap.size() )
|
||||
continue;
|
||||
|
||||
Q3Texture [i].TextureAddressMode = video::ETC_CLAMP;
|
||||
pos = 0;
|
||||
quake3::getTextures ( Q3Texture [i].Texture, clampmap, pos,fileSystem, SceneManager->getVideoDriver() );
|
||||
quake3::getTextures( Q3Texture [i].Texture, clampmap, pos,fileSystem, SceneManager->getVideoDriver() );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -194,43 +193,43 @@ void CQuake3ShaderSceneNode::OnRegisterSceneNode()
|
|||
{
|
||||
if ( isVisible() )
|
||||
{
|
||||
SceneManager->registerNodeForRendering(this, isTransparent () ? ESNRP_TRANSPARENT: ESNRP_SOLID );
|
||||
SceneManager->registerNodeForRendering(this, isTransparent() ? ESNRP_TRANSPARENT: ESNRP_SOLID );
|
||||
}
|
||||
ISceneNode::OnRegisterSceneNode ();
|
||||
ISceneNode::OnRegisterSceneNode();
|
||||
}
|
||||
|
||||
/*
|
||||
is this a transparent node ?
|
||||
*/
|
||||
bool CQuake3ShaderSceneNode::isTransparent () const
|
||||
bool CQuake3ShaderSceneNode::isTransparent() const
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
// generic stage
|
||||
const quake3::SVarGroup *group;
|
||||
|
||||
group = Shader->getGroup ( 1 );
|
||||
group = Shader->getGroup( 1 );
|
||||
/*
|
||||
if ( group->isDefined ( "surfaceparm", "nonsolid" ) )
|
||||
if ( group->isDefined( "surfaceparm", "nonsolid" ) )
|
||||
{
|
||||
ret = true;
|
||||
}
|
||||
*/
|
||||
if ( group->isDefined ( "surfaceparm", "trans" ) )
|
||||
if ( group->isDefined( "surfaceparm", "trans" ) )
|
||||
{
|
||||
ret = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( u32 stage = 0; stage < Shader->VarGroup->VariableGroup.size (); ++stage )
|
||||
for ( u32 stage = 0; stage < Shader->VarGroup->VariableGroup.size(); ++stage )
|
||||
{
|
||||
if ( 0 == Q3Texture [ stage].Texture.size() )
|
||||
continue;
|
||||
|
||||
group = Shader->getGroup ( stage );
|
||||
group = Shader->getGroup( stage );
|
||||
quake3::SBlendFunc blendfunc;
|
||||
quake3::getBlendFunc ( group->get ( "blendfunc" ), blendfunc );
|
||||
quake3::getBlendFunc ( group->get ( "alphafunc" ), blendfunc );
|
||||
quake3::getBlendFunc( group->get( "blendfunc" ), blendfunc );
|
||||
quake3::getBlendFunc( group->get( "alphafunc" ), blendfunc );
|
||||
|
||||
ret = blendfunc.isTransparent;
|
||||
break;
|
||||
|
@ -260,34 +259,34 @@ void CQuake3ShaderSceneNode::render()
|
|||
material.NormalizeNormals = false;
|
||||
|
||||
// generic stage
|
||||
group = Shader->getGroup ( 1 );
|
||||
material.BackfaceCulling = quake3::isDisabled ( group->get ( "cull" ) );
|
||||
group = Shader->getGroup( 1 );
|
||||
material.BackfaceCulling = quake3::isDisabled( group->get( "cull" ) );
|
||||
|
||||
// u32 zEnable = group->getIndex ( "polygonoffset" ) >= 0;
|
||||
// u32 zEnable = group->getIndex( "polygonoffset" ) >= 0;
|
||||
|
||||
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation );
|
||||
|
||||
u32 drawCount = 0;
|
||||
for ( u32 stage = 0; stage < Shader->VarGroup->VariableGroup.size (); ++stage )
|
||||
for ( u32 stage = 0; stage < Shader->VarGroup->VariableGroup.size(); ++stage )
|
||||
//for ( u32 stage = 2; stage < 3; ++stage )
|
||||
{
|
||||
SQ3Texture &q = Q3Texture [ stage];
|
||||
|
||||
// advance current stage
|
||||
core::matrix4 texture;
|
||||
animate ( stage, texture );
|
||||
animate( stage, texture );
|
||||
|
||||
// stage 1 finished, no drawing stage ( vertex transform only )
|
||||
if ( 0 == q.Texture.size() )
|
||||
continue;
|
||||
|
||||
// current stage
|
||||
group = Shader->getGroup ( stage );
|
||||
group = Shader->getGroup( stage );
|
||||
|
||||
material.setTexture(0, q.Texture [ q.TextureIndex ]);
|
||||
material.ZBuffer = quake3::getDepthFunction ( group->get ( "depthfunc" ) );
|
||||
material.ZBuffer = quake3::getDepthFunction( group->get( "depthfunc" ) );
|
||||
|
||||
if ( group->getIndex ( "depthwrite" ) >= 0 )
|
||||
if ( group->getIndex( "depthwrite" ) >= 0 )
|
||||
{
|
||||
material.ZWriteEnable = true;
|
||||
}
|
||||
|
@ -298,14 +297,14 @@ void CQuake3ShaderSceneNode::render()
|
|||
|
||||
//resolve quake3 blendfunction to irrlicht Material Type
|
||||
quake3::SBlendFunc blendfunc;
|
||||
quake3::getBlendFunc ( group->get ( "blendfunc" ), blendfunc );
|
||||
quake3::getBlendFunc ( group->get ( "alphafunc" ), blendfunc );
|
||||
quake3::getBlendFunc( group->get( "blendfunc" ), blendfunc );
|
||||
quake3::getBlendFunc( group->get( "alphafunc" ), blendfunc );
|
||||
|
||||
material.MaterialType = blendfunc.type;
|
||||
material.MaterialTypeParam = blendfunc.param;
|
||||
|
||||
material.TextureLayer[0].TextureWrap = q.TextureAddressMode;
|
||||
material.setTextureMatrix ( 0, texture );
|
||||
material.setTextureMatrix( 0, texture );
|
||||
|
||||
driver->setMaterial( material );
|
||||
driver->drawMeshBuffer( MeshBuffer );
|
||||
|
@ -325,9 +324,9 @@ void CQuake3ShaderSceneNode::render()
|
|||
|
||||
/*!
|
||||
*/
|
||||
void CQuake3ShaderSceneNode::vertextransform_wave ( f32 dt, quake3::SModifierFunction &function )
|
||||
void CQuake3ShaderSceneNode::vertextransform_wave( f32 dt, quake3::SModifierFunction &function )
|
||||
{
|
||||
function.wave = core::reciprocal ( function.wave );
|
||||
function.wave = core::reciprocal( function.wave );
|
||||
|
||||
const f32 phase = function.phase;
|
||||
|
||||
|
@ -337,10 +336,10 @@ void CQuake3ShaderSceneNode::vertextransform_wave ( f32 dt, quake3::SModifierFun
|
|||
const video::S3DVertex2TCoords &src = Original->Vertices[i];
|
||||
video::S3DVertex &dst = MeshBuffer->Vertices[i];
|
||||
|
||||
f32 wavephase = (src.Pos.X + src.Pos.Y + src.Pos.Z) * function.wave;
|
||||
const f32 wavephase = (src.Pos.X + src.Pos.Y + src.Pos.Z) * function.wave;
|
||||
function.phase = phase + wavephase;
|
||||
|
||||
const f32 f = function.evaluate ( dt );
|
||||
const f32 f = function.evaluate( dt );
|
||||
|
||||
dst.Pos.X = src.Pos.X + f * src.Normal.X;
|
||||
dst.Pos.Y = src.Pos.Y + f * src.Normal.Y;
|
||||
|
@ -350,10 +349,10 @@ void CQuake3ShaderSceneNode::vertextransform_wave ( f32 dt, quake3::SModifierFun
|
|||
|
||||
/*!
|
||||
*/
|
||||
void CQuake3ShaderSceneNode::vertextransform_bulge ( f32 dt, quake3::SModifierFunction &function )
|
||||
void CQuake3ShaderSceneNode::vertextransform_bulge( f32 dt, quake3::SModifierFunction &function )
|
||||
{
|
||||
function.func = 0;
|
||||
function.wave = core::reciprocal ( function.bulgewidth );
|
||||
function.wave = core::reciprocal( function.bulgewidth );
|
||||
|
||||
dt *= function.bulgespeed * 0.1f;
|
||||
const f32 phase = function.phase;
|
||||
|
@ -364,10 +363,10 @@ void CQuake3ShaderSceneNode::vertextransform_bulge ( f32 dt, quake3::SModifierFu
|
|||
const video::S3DVertex2TCoords &src = Original->Vertices[i];
|
||||
video::S3DVertex &dst = MeshBuffer->Vertices[i];
|
||||
|
||||
f32 wavephase = (Original->Vertices[i].TCoords.X ) * function.wave;
|
||||
const f32 wavephase = (Original->Vertices[i].TCoords.X ) * function.wave;
|
||||
function.phase = phase + wavephase;
|
||||
|
||||
const f32 f = function.evaluate ( dt );
|
||||
const f32 f = function.evaluate( dt );
|
||||
|
||||
dst.Pos.X = src.Pos.X + f * src.Normal.X;
|
||||
dst.Pos.Y = src.Pos.Y + f * src.Normal.Y;
|
||||
|
@ -377,10 +376,10 @@ void CQuake3ShaderSceneNode::vertextransform_bulge ( f32 dt, quake3::SModifierFu
|
|||
|
||||
/*!
|
||||
*/
|
||||
void CQuake3ShaderSceneNode::vertextransform_autosprite ( f32 dt, quake3::SModifierFunction &function )
|
||||
void CQuake3ShaderSceneNode::vertextransform_autosprite( f32 dt, quake3::SModifierFunction &function )
|
||||
{
|
||||
const core::matrix4 &m = SceneManager->getActiveCamera()->getViewFrustum()->Matrices [ video::ETS_VIEW ];
|
||||
const core::vector3df view ( -m[2], -m[6] , -m[10] );
|
||||
const core::vector3df view( -m[2], -m[6] , -m[10] );
|
||||
|
||||
const u32 vsize = MeshBuffer->Vertices.size();
|
||||
|
||||
|
@ -390,18 +389,18 @@ void CQuake3ShaderSceneNode::vertextransform_autosprite ( f32 dt, quake3::SModif
|
|||
for ( u32 i = 0; i < vsize; i += 4 )
|
||||
{
|
||||
// in pairs of 4
|
||||
box.reset ( Original->Vertices[i].Pos );
|
||||
box.reset( Original->Vertices[i].Pos );
|
||||
for ( g = 1; g != 4; ++g )
|
||||
{
|
||||
box.addInternalPoint ( Original->Vertices[i + g].Pos );
|
||||
box.addInternalPoint( Original->Vertices[i + g].Pos );
|
||||
}
|
||||
|
||||
core::vector3df c = box.getCenter ();
|
||||
core::vector3df c = box.getCenter();
|
||||
f32 sh = 0.5f * ( box.MaxEdge.Z - box.MinEdge.Z );
|
||||
f32 sv = 0.5f * ( box.MaxEdge.Y - box.MinEdge.Y );
|
||||
|
||||
const core::vector3df h ( m[0] * sh, m[4] * sh, m[8] * sh );
|
||||
const core::vector3df v ( m[1] * sv, m[5] * sv, m[9] * sv );
|
||||
const core::vector3df h( m[0] * sh, m[4] * sh, m[8] * sh );
|
||||
const core::vector3df v( m[1] * sv, m[5] * sv, m[9] * sv );
|
||||
|
||||
MeshBuffer->Vertices[ i + 0 ].Pos = c + h + v;
|
||||
MeshBuffer->Vertices[ i + 1 ].Pos = c - h - v;
|
||||
|
@ -418,7 +417,7 @@ void CQuake3ShaderSceneNode::vertextransform_autosprite ( f32 dt, quake3::SModif
|
|||
/*
|
||||
Generate Vertex Color
|
||||
*/
|
||||
void CQuake3ShaderSceneNode::vertextransform_rgbgen ( f32 dt, quake3::SModifierFunction &function )
|
||||
void CQuake3ShaderSceneNode::vertextransform_rgbgen( f32 dt, quake3::SModifierFunction &function )
|
||||
{
|
||||
u32 i;
|
||||
const u32 vsize = MeshBuffer->Vertices.size();
|
||||
|
@ -438,8 +437,8 @@ void CQuake3ShaderSceneNode::vertextransform_rgbgen ( f32 dt, quake3::SModifierF
|
|||
case 5:
|
||||
{
|
||||
// wave
|
||||
f32 f = function.evaluate ( dt ) * 255.f;
|
||||
s32 value = core::clamp ( core::floor32 ( f ), 0, 255 );
|
||||
f32 f = function.evaluate( dt ) * 255.f;
|
||||
s32 value = core::clamp( core::floor32(f), 0.f, 255.f );
|
||||
value |= value << 8;
|
||||
value |= value << 16;
|
||||
|
||||
|
@ -454,7 +453,7 @@ void CQuake3ShaderSceneNode::vertextransform_rgbgen ( f32 dt, quake3::SModifierF
|
|||
/*
|
||||
Generate Texture Coordinates
|
||||
*/
|
||||
void CQuake3ShaderSceneNode::vertextransform_tcgen ( f32 dt, quake3::SModifierFunction &function )
|
||||
void CQuake3ShaderSceneNode::vertextransform_tcgen( f32 dt, quake3::SModifierFunction &function )
|
||||
{
|
||||
u32 i;
|
||||
const u32 vsize = MeshBuffer->Vertices.size();
|
||||
|
@ -464,7 +463,7 @@ void CQuake3ShaderSceneNode::vertextransform_tcgen ( f32 dt, quake3::SModifierFu
|
|||
case 12:
|
||||
//tcgen turb
|
||||
{
|
||||
function.wave = core::reciprocal ( function.wave );
|
||||
function.wave = core::reciprocal( function.wave );
|
||||
|
||||
const f32 phase = function.phase;
|
||||
|
||||
|
@ -473,10 +472,10 @@ void CQuake3ShaderSceneNode::vertextransform_tcgen ( f32 dt, quake3::SModifierFu
|
|||
const video::S3DVertex2TCoords &src = Original->Vertices[i];
|
||||
video::S3DVertex &dst = MeshBuffer->Vertices[i];
|
||||
|
||||
f32 wavephase = (src.Pos.X + src.Pos.Y + src.Pos.Z) * function.wave;
|
||||
const f32 wavephase = (src.Pos.X + src.Pos.Y + src.Pos.Z) * function.wave;
|
||||
function.phase = phase + wavephase;
|
||||
|
||||
const f32 f = function.evaluate ( dt );
|
||||
const f32 f = function.evaluate( dt );
|
||||
|
||||
dst.TCoords.X = src.TCoords.X + f * src.Normal.X;
|
||||
dst.TCoords.Y = src.TCoords.Y + f * src.Normal.Y;
|
||||
|
@ -507,21 +506,21 @@ void CQuake3ShaderSceneNode::vertextransform_tcgen ( f32 dt, quake3::SModifierFu
|
|||
core::vector3df eyePlaneS;
|
||||
core::vector3df eyePlaneT;
|
||||
|
||||
viewinverse.transformVect ( eyePlaneS, core::vector3df ( 1.f, 0.f, 0.f ) );
|
||||
viewinverse.transformVect ( eyePlaneT, core::vector3df ( 0.f, 1.f, 0.f ) );
|
||||
viewinverse.transformVect( eyePlaneS, core::vector3df(1.f, 0.f, 0.f) );
|
||||
viewinverse.transformVect( eyePlaneT, core::vector3df(0.f, 1.f, 0.f) );
|
||||
|
||||
eyePlaneS.normalize ();
|
||||
eyePlaneT.normalize ();
|
||||
eyePlaneS.normalize();
|
||||
eyePlaneT.normalize();
|
||||
|
||||
core::vector3df v;
|
||||
for ( i = 0; i != vsize; ++i )
|
||||
{
|
||||
// vertex in eye space
|
||||
view.transformVect ( v, Original->Vertices[i].Pos );
|
||||
view.transformVect( v, Original->Vertices[i].Pos );
|
||||
v.normalize();
|
||||
|
||||
MeshBuffer->Vertices[i].TCoords.X = (1.f + eyePlaneS.dotProduct ( v ) ) * 0.5f;
|
||||
MeshBuffer->Vertices[i].TCoords.Y = 1.f - ( (1.f + eyePlaneT.dotProduct ( v ) ) * 0.5f );
|
||||
MeshBuffer->Vertices[i].TCoords.X = (1.f + eyePlaneS.dotProduct(v) ) * 0.5f;
|
||||
MeshBuffer->Vertices[i].TCoords.Y = 1.f - ( (1.f + eyePlaneT.dotProduct(v) ) * 0.5f );
|
||||
}
|
||||
|
||||
} break;
|
||||
|
@ -534,7 +533,7 @@ void CQuake3ShaderSceneNode::vertextransform_tcgen ( f32 dt, quake3::SModifierFu
|
|||
/*
|
||||
Transform Texture Coordinates
|
||||
*/
|
||||
void CQuake3ShaderSceneNode::transformtex ( const core::matrix4 &m, const u32 addressMode )
|
||||
void CQuake3ShaderSceneNode::transformtex( const core::matrix4 &m, const u32 addressMode )
|
||||
{
|
||||
u32 i;
|
||||
const u32 vsize = MeshBuffer->Vertices.size();
|
||||
|
@ -568,8 +567,8 @@ void CQuake3ShaderSceneNode::transformtex ( const core::matrix4 &m, const u32 ad
|
|||
tx.X = tx1 <= 0.f ? 0.f : tx1 >= 1.f ? 1.f : tx1;
|
||||
tx.Y = ty1 <= 0.f ? 0.f : ty1 >= 1.f ? 1.f : ty1;
|
||||
|
||||
//tx.X = core::clamp ( tx1, 0.f, 1.f );
|
||||
//tx.Y = core::clamp ( ty1, 0.f, 1.f );
|
||||
//tx.X = core::clamp( tx1, 0.f, 1.f );
|
||||
//tx.Y = core::clamp( ty1, 0.f, 1.f );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -586,13 +585,13 @@ void CQuake3ShaderSceneNode::transformtex ( const core::matrix4 &m, const u32 ad
|
|||
*/
|
||||
void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture )
|
||||
{
|
||||
const quake3::SVarGroup *group = Shader->getGroup ( stage );
|
||||
const quake3::SVarGroup *group = Shader->getGroup( stage );
|
||||
|
||||
// select current texture
|
||||
if ( Q3Texture [ stage ].TextureFrequency != 0.f )
|
||||
{
|
||||
s32 v = core::floor32 ( TimeAbs * Q3Texture [ stage ].TextureFrequency );
|
||||
Q3Texture [ stage ].TextureIndex = v % Q3Texture [ stage ].Texture.size();
|
||||
s32 v = core::floor32( TimeAbs * Q3Texture[stage].TextureFrequency );
|
||||
Q3Texture [ stage ].TextureIndex = v % Q3Texture[stage].Texture.size();
|
||||
}
|
||||
|
||||
core::matrix4 m2;
|
||||
|
@ -602,7 +601,7 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture )
|
|||
f32 f1;
|
||||
|
||||
// walk group for all modifiers
|
||||
for ( u32 g = 0; g != group->Variable.size (); ++g )
|
||||
for ( u32 g = 0; g != group->Variable.size(); ++g )
|
||||
{
|
||||
const quake3::SVariable &v = group->Variable[g];
|
||||
|
||||
|
@ -613,7 +612,7 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture )
|
|||
};
|
||||
|
||||
u32 pos = 0;
|
||||
function.masterfunc0 = quake3::isEqual ( v.name, pos, modifierList, 5 );
|
||||
function.masterfunc0 = quake3::isEqual( v.name, pos, modifierList, 5 );
|
||||
|
||||
if ( -2 == function.masterfunc0 )
|
||||
continue;
|
||||
|
@ -622,7 +621,7 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture )
|
|||
{
|
||||
//tcmod
|
||||
case 0:
|
||||
m2.makeIdentity ();
|
||||
m2.makeIdentity();
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -636,26 +635,25 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture )
|
|||
};
|
||||
|
||||
pos = 0;
|
||||
function.masterfunc1 = quake3::isEqual ( v.content, pos, funclist, 14 );
|
||||
function.masterfunc1 = quake3::isEqual( v.content, pos, funclist, 14 );
|
||||
|
||||
switch ( function.masterfunc1 )
|
||||
{
|
||||
case 0:
|
||||
// scroll
|
||||
f0 = quake3::getAsFloat ( v.content, pos ) * TimeAbs;
|
||||
f1 = quake3::getAsFloat ( v.content, pos ) * TimeAbs;
|
||||
m2.setTextureTranslate ( f0, f1 );
|
||||
f0 = quake3::getAsFloat( v.content, pos ) * TimeAbs;
|
||||
f1 = quake3::getAsFloat( v.content, pos ) * TimeAbs;
|
||||
m2.setTextureTranslate( f0, f1 );
|
||||
break;
|
||||
case 1:
|
||||
// scale
|
||||
f0 = quake3::getAsFloat ( v.content, pos );
|
||||
f1 = quake3::getAsFloat ( v.content, pos );
|
||||
m2.setTextureScale ( f0, f1 );
|
||||
f0 = quake3::getAsFloat( v.content, pos );
|
||||
f1 = quake3::getAsFloat( v.content, pos );
|
||||
m2.setTextureScale( f0, f1 );
|
||||
break;
|
||||
case 2:
|
||||
//rotate
|
||||
m2.setTextureRotationCenter ( quake3::getAsFloat ( v.content, pos ) * core::DEGTORAD * TimeAbs );
|
||||
m2 = m2.getTransposed();
|
||||
m2.setTextureRotationCenter( quake3::getAsFloat( v.content, pos ) * core::DEGTORAD * TimeAbs );
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
|
@ -666,28 +664,26 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture )
|
|||
// turb == sin, default == sin
|
||||
function.func = 0;
|
||||
|
||||
if ( function.masterfunc1 == 5 && function.masterfunc0 == 1)
|
||||
if (function.masterfunc1 == 5 && function.masterfunc0 == 1)
|
||||
{
|
||||
// deformvertexes, wave
|
||||
function.wave = quake3::getAsFloat ( v.content, pos );
|
||||
function.wave = quake3::getAsFloat( v.content, pos );
|
||||
}
|
||||
|
||||
if ( function.masterfunc1 == 3 ||
|
||||
if (function.masterfunc1 == 3 ||
|
||||
function.masterfunc1 == 4 ||
|
||||
function.masterfunc1 == 5
|
||||
)
|
||||
function.masterfunc1 == 5)
|
||||
{
|
||||
// stretch, wave, tub
|
||||
quake3::getModifierFunc ( function, v.content, pos );
|
||||
quake3::getModifierFunc( function, v.content, pos );
|
||||
}
|
||||
|
||||
switch ( function.masterfunc1 )
|
||||
{
|
||||
case 3:
|
||||
// stretch
|
||||
f0 = core::reciprocal ( function.evaluate ( TimeAbs ) );
|
||||
m2.setTextureScaleCenter ( f0, f0 );
|
||||
m2 = m2.getTransposed();
|
||||
f0 = core::reciprocal( function.evaluate(TimeAbs) );
|
||||
m2.setTextureScaleCenter( f0, f0 );
|
||||
break;
|
||||
case 4:
|
||||
{
|
||||
|
@ -698,30 +694,30 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture )
|
|||
ampFunction.freq = function.freq;
|
||||
ampFunction.base = 1.f;
|
||||
ampFunction.amp = 0.2f;
|
||||
f2 = ampFunction.evaluate ( TimeAbs );
|
||||
f2 = ampFunction.evaluate( TimeAbs );
|
||||
|
||||
f0 = function.evaluate ( TimeAbs );
|
||||
f0 = function.evaluate( TimeAbs );
|
||||
function.func = 1;
|
||||
f1 = function.evaluate ( TimeAbs );
|
||||
f1 = function.evaluate( TimeAbs );
|
||||
|
||||
m2.setTextureTranslate ( f0, f1 );
|
||||
m2.setTextureScaleCenter ( f2, f2 );
|
||||
//m2.setTextureScale ( f2, f2 );
|
||||
m2.setTextureTranslate( f0, f1 );
|
||||
m2.setTextureScaleCenter( f2, f2 );
|
||||
//m2.setTextureScale( f2, f2 );
|
||||
*/
|
||||
}break;
|
||||
case 5:
|
||||
if ( function.masterfunc0 == 1 )
|
||||
{
|
||||
vertextransform_wave ( TimeAbs, function );
|
||||
vertextransform_wave( TimeAbs, function );
|
||||
}
|
||||
else
|
||||
{
|
||||
vertextransform_rgbgen ( TimeAbs, function );
|
||||
vertextransform_rgbgen( TimeAbs, function );
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
case 7:
|
||||
vertextransform_rgbgen ( TimeAbs, function );
|
||||
vertextransform_rgbgen( TimeAbs, function );
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -738,17 +734,17 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture )
|
|||
break;
|
||||
case 12:
|
||||
// deformvertexes bulge
|
||||
function.bulgewidth = quake3::getAsFloat ( v.content, pos );
|
||||
function.bulgeheight = quake3::getAsFloat ( v.content, pos );
|
||||
function.bulgespeed = quake3::getAsFloat ( v.content, pos );
|
||||
function.bulgewidth = quake3::getAsFloat( v.content, pos );
|
||||
function.bulgeheight = quake3::getAsFloat( v.content, pos );
|
||||
function.bulgespeed = quake3::getAsFloat( v.content, pos );
|
||||
|
||||
vertextransform_bulge ( TimeAbs, function );
|
||||
vertextransform_bulge(TimeAbs, function);
|
||||
break;
|
||||
|
||||
case 13:
|
||||
case 14:
|
||||
// deformvertexes autosprite
|
||||
vertextransform_autosprite ( TimeAbs, function);
|
||||
vertextransform_autosprite(TimeAbs, function);
|
||||
break;
|
||||
|
||||
} // func
|
||||
|
@ -763,20 +759,19 @@ void CQuake3ShaderSceneNode::animate( u32 stage,core::matrix4 &texture )
|
|||
} // group
|
||||
|
||||
// texture coordinate modifier
|
||||
vertextransform_tcgen ( TimeAbs, function);
|
||||
vertextransform_tcgen(TimeAbs, function);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void CQuake3ShaderSceneNode::OnAnimate(u32 timeMs)
|
||||
{
|
||||
TimeAbs = f32( timeMs ) * ( 1.f/1000.f);
|
||||
ISceneNode::OnAnimate ( timeMs );
|
||||
TimeAbs = f32( timeMs ) * (1.f/1000.f);
|
||||
ISceneNode::OnAnimate( timeMs );
|
||||
}
|
||||
|
||||
const core::aabbox3d<f32>& CQuake3ShaderSceneNode::getBoundingBox() const
|
||||
{
|
||||
return MeshBuffer->getBoundingBox ();
|
||||
return MeshBuffer->getBoundingBox();
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue