From: <re...@us...> - 2011-06-25 20:34:11
|
Revision: 36562 http://crystal.svn.sourceforge.net/crystal/?rev=36562&view=rev Author: res2002 Date: 2011-06-25 20:34:05 +0000 (Sat, 25 Jun 2011) Log Message: ----------- meshgen: Make fading info a uniform input (ie not instanced) Modified Paths: -------------- CS/trunk/data/shader-snippets/surface/alpha-modulate-instance.xml CS/trunk/plugins/engine/3d/meshgen/meshgen.cpp CS/trunk/plugins/engine/3d/meshgen/meshgen.h Modified: CS/trunk/data/shader-snippets/surface/alpha-modulate-instance.xml =================================================================== --- CS/trunk/data/shader-snippets/surface/alpha-modulate-instance.xml 2011-06-25 20:33:35 UTC (rev 36561) +++ CS/trunk/data/shader-snippets/surface/alpha-modulate-instance.xml 2011-06-25 20:34:05 UTC (rev 36562) @@ -26,20 +26,24 @@ <input file="/shader-snippets/ModelView.inp" private="yes" /> <input name="meshgenFadeInfo" type="float4" default="complex" private="yes"> <block location="cg:vertexIn"> - <varying type="float4" name="meshgenFadeInfo" /> + <uniform type="float4" name="meshgenFadeInfo" /> </block> + <block location="cg:fragmentIn"> + <uniform type="float4" name="meshgenFadeInfo" /> + </block> <block location="cg:vertexMain"> meshgenFadeInfo = vertexIn.meshgenFadeInfo; </block> - - <block location="cg:vertexToFragment"> - <varying type="float4" name="meshgenFadeInfo" /> + <block location="cg:fragmentMain"> + meshgenFadeInfo = fragmentIn.meshgenFadeInfo; </block> - <block location="pass"> - <instanceparam source="meshgen fade info" + <block location="cg:variablemap"> + <variablemap variable="meshgen fade info" destination="vertexIn.meshgenFadeInfo" /> + <variablemap variable="meshgen fade info" + destination="fragmentIn.meshgenFadeInfo" /> </block> </input> Modified: CS/trunk/plugins/engine/3d/meshgen/meshgen.cpp =================================================================== --- CS/trunk/plugins/engine/3d/meshgen/meshgen.cpp 2011-06-25 20:33:35 UTC (rev 36561) +++ CS/trunk/plugins/engine/3d/meshgen/meshgen.cpp 2011-06-25 20:34:05 UTC (rev 36562) @@ -229,13 +229,14 @@ g.windDataVar.AttachNew (new csShaderVariable (generator->varWindData)); g.windDataVar->SetType (csShaderVariable::VECTOR3); g.instancesNumVar.AttachNew (new csShaderVariable (generator->varInstancesNum)); - g.transformVar.AttachNew (new csShaderVariable (generator->varTransform)); g.fadeInfoVar.AttachNew (new csShaderVariable (generator->varFadeInfo)); + g.fadeInfoVar->SetType (csShaderVariable::VECTOR4); + g.transformVar.AttachNew (new csShaderVariable (generator->varTransform)); g.instanceExtraVar.AttachNew (new csShaderVariable (generator->varInstanceExtra)); AddSVToMesh (g.mesh, g.windDataVar); AddSVToMesh (g.mesh, g.instancesNumVar); - AddSVToMesh (g.mesh, g.transformVar); AddSVToMesh (g.mesh, g.fadeInfoVar); + AddSVToMesh (g.mesh, g.transformVar); AddSVToMesh (g.mesh, g.instanceExtraVar); csBox3 bbox; @@ -278,13 +279,7 @@ newPos = &pos; geom.allTransforms.GetExtend (i); - float fadeOpaqueDist = - generator->use_alpha_scaling ? generator->alpha_mindist : generator->total_max_dist; - float fadeDistScale = - generator->use_alpha_scaling ? generator->alpha_scale : 0; geom.allInstanceExtra.GetExtend (i).Set (rng.Get()); - geom.allFadeInfo.GetExtend (i); - SetFadeParams (pos, fadeOpaqueDist, fadeDistScale); geom.dataDirty = true; @@ -322,39 +317,36 @@ geom.dataDirty = true; } -void csMeshGeneratorGeometry::SetFadeParams (csMGPosition& p, float opaqueDist, float scale) +void csMeshGeneratorGeometry::SetFadeParams (csMGGeom& geom, float opaqueDist, float scale) { - csMGGeom& geom = factories[p.lod]; - csMGGeom::FadeInfo& fade = geom.allFadeInfo[p.idInGeometry]; + float fadeInM, fadeInN, fadeOutM, fadeOutN; float max_opaque_dist = csMin (this->max_opaque_dist, opaqueDist); float max_draw_dist = csMin (total_max_dist, (fabsf (scale) > EPSILON ? 1.0f/scale : 0) + opaqueDist); float min_fade_dist = min_opaque_dist-min_draw_dist; if (fabsf (min_fade_dist) > EPSILON) { - float fadeInM = 1.0f/(min_fade_dist); - fade.fadeInM = fadeInM; - fade.fadeInN = -min_draw_dist * fadeInM; + fadeInM = 1.0f/(min_fade_dist); + fadeInN = -min_draw_dist * fadeInM; } else { - fade.fadeInM = 0; - fade.fadeInN = 1; + fadeInM = 0; + fadeInN = 1; } float max_fade_dist = max_opaque_dist-max_draw_dist; if (fabsf (max_fade_dist) > EPSILON) { - float fadeOutM = 1.0f/(max_fade_dist); - fade.fadeOutM = fadeOutM; - fade.fadeOutN = -max_opaque_dist*fadeOutM + 1; + fadeOutM = 1.0f/(max_fade_dist); + fadeOutN = -max_opaque_dist*fadeOutM + 1; } else { - fade.fadeOutM = 0; - fade.fadeOutN = 1; + fadeOutM = 0; + fadeOutN = 1; } - geom.dataDirty = true; + geom.fadeInfoVar->SetValue (csVector4 (fadeInM, fadeInN, fadeOutM, fadeOutN)); } void csMeshGeneratorGeometry::SetWindDirection (float x, float z) @@ -428,6 +420,11 @@ void csMeshGeneratorGeometry::FinishUpdate () { + float fadeOpaqueDist = + generator->use_alpha_scaling ? generator->alpha_mindist : total_max_dist; + float fadeDistScale = + generator->use_alpha_scaling ? generator->alpha_scale : 0; + size_t lod; for (lod = 0 ; lod < factories.GetSize () ; lod++) { @@ -444,6 +441,7 @@ geom.mesh->GetMovable ()->SetSector (generator->GetSector ()); } + SetFadeParams (geom, fadeOpaqueDist, fadeDistScale); geom.instancesNumVar->SetValue (int (geom.allPositions.GetSize())); /* Update buffers @@ -452,9 +450,6 @@ UpdateInstancingParams (geom.dataDirty, geom.allTransforms, geom.transformBuffer, geom.transformVar); - UpdateInstancingParams (geom.dataDirty, geom.allFadeInfo, - geom.fadeInfoBuffer, geom.fadeInfoVar); - UpdateInstancingParams (geom.dataDirty, geom.allInstanceExtra, geom.instanceExtraBuffer, geom.instanceExtraVar); Modified: CS/trunk/plugins/engine/3d/meshgen/meshgen.h =================================================================== --- CS/trunk/plugins/engine/3d/meshgen/meshgen.h 2011-06-25 20:33:35 UTC (rev 36561) +++ CS/trunk/plugins/engine/3d/meshgen/meshgen.h 2011-06-25 20:34:05 UTC (rev 36562) @@ -59,6 +59,11 @@ csRef<csShaderVariable> windDataVar; csRef<csShaderVariable> instancesNumVar; + /** + * SV contains coefficents for linear fading function <tt>opacity = dist*m + n</tt>: + * (fadeInM,fadeInN,fadeOutM,fadeOutN) + */ + csRef<csShaderVariable> fadeInfoVar; csRef<iMeshWrapper> mesh; // All instances of this geometry @@ -68,26 +73,6 @@ float m[12]; }; csDirtyAccessArray<Transform> allTransforms; - // @@@ These should NOT be instanced! - struct FadeInfo - { - //@{ - /// Coefficents for linear fading function <tt>opacity = dist*m + n</tt> - float fadeInM; - float fadeInN; - float fadeOutM; - float fadeOutN; - //@} - - void Set (float fadeInM, float fadeInN, float fadeOutM, float fadeOutN) - { - this->fadeInM = fadeInM; - this->fadeInN = fadeInN; - this->fadeOutM = fadeOutM; - this->fadeOutN = fadeOutN; - } - }; - csDirtyAccessArray<FadeInfo> allFadeInfo; struct InstanceExtra { float random; @@ -102,10 +87,8 @@ // Buffers/SVs for rendering bool dataDirty; csRef<iRenderBuffer> transformBuffer; - csRef<iRenderBuffer> fadeInfoBuffer; csRef<iRenderBuffer> instanceExtraBuffer; csRef<csShaderVariable> transformVar; - csRef<csShaderVariable> fadeInfoVar; csRef<csShaderVariable> instanceExtraVar; csMGGeom() : dataDirty (true) {} @@ -260,8 +243,8 @@ void MoveMesh (int cidx, const csMGPosition& pos, const csVector3& position, const csMatrix3& matrix); - /// Set the fade params for a mesh. - void SetFadeParams (csMGPosition& p, float opaqueDist, float scale); + /// Set the fade params for the geometry. + void SetFadeParams (csMGGeom& geom, float opaqueDist, float scale); /** * Get the right lod level for the given squared distance. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |