Q3 shader fix by sio2

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1550 dfc29bdd-3216-0410-991c-e03cc46cb475
master
hybrid 2008-09-08 22:22:22 +00:00
parent 47b358bcd1
commit b7d528d4a0
1 changed files with 119 additions and 124 deletions

View File

@ -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();
}