1
0
forked from 0ad/0ad

Check when loading an actor that it defines all the texture samplers required by its material. Print out a readable error otherwise. Fixes #1613 (note that this does not check for unnecessary samplers as that is non-trivial and does not lead to graphical glitches).

Also add a shortcut for some defines to clean-up material files slightly
and make the link between sampler and shader more explicit.

This was SVN commit r16427.
This commit is contained in:
wraitii 2015-03-15 11:37:26 +00:00
parent 372a016311
commit 618fe81814
50 changed files with 166 additions and 55 deletions

View File

@ -3,4 +3,6 @@
<shader effect="model_transparent"/>
<define name="USE_TRANSPARENT" value="1"/>
<define name="USE_ALPHATEST" value="1"/>
<required_texture name="baseTex"/>
</material>

View File

@ -1,9 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<material>
<required_texture name="baseTex"/>
<shader effect="model_transparent"/>
<define name="USE_TRANSPARENT" value="1"/>
<define name="USE_ALPHATEST" value="1"/>
<required_texture name="baseTex"/>
<!--define name="USE_PLAYERCOLOR" value="1"/-->
<!-- REQUIRES: Actor must provide a texture named "normTex", where the Alpha channel

View File

@ -7,4 +7,5 @@
<define name="USE_SPECULAR" value="1"/>
<uniform name="specularPower" value="16.0"/>
<uniform name="specularColor" value="1.0 1.0 1.0"/>
<required_texture name="baseTex"/>
</material>

View File

@ -4,8 +4,9 @@
<alpha_blending/>
<renderquery name="sim_time"/>
<uniform name="translation" value="0.0 -0.1"/>
<define name="USE_SPECULAR_MAP" value="1"/>
<define name="USE_SELF_LIGHT" value="1"/>
<uniform name="specularPower" value="100.0"/>
<uniform name="specularColor" value="1.0 1.0 1.0"/>
<required_texture name="baseTex"/>
<required_texture name="specTex" define="USE_SPECULAR_MAP"/>
</material>

View File

@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<material>
<shader effect="model_transparent"/>
<alpha_blending/>
<define name="USE_TRANSPARENT" value="1"/>
<alternative material="basic_trans.xml" quality="2"/>
<alternative material="alphatest_ao_parallax_spec.xml" if="CFG_FORCE_ALPHATEST"/>
<define name="USE_SPECULAR_MAP" value="1"/>
<shader effect="model_transparent"/>
<alpha_blending/>
<define name="USE_TRANSPARENT" value="1"/>
<alternative material="basic_trans.xml" quality="2"/>
<alternative material="alphatest_ao_parallax_spec.xml" if="CFG_FORCE_ALPHATEST"/>
<define name="USE_SPECULAR_MAP" value="1"/>
<define name="USE_SELF_LIGHT" value="1"/>
<uniform name="effectSettings" value="1.0 50.0 0.0075 0.85"/>
<uniform name="effectSettings" value="1.0 50.0 0.0075 0.85"/>
</material>

View File

@ -5,4 +5,6 @@
<define name="USE_SPECULAR" value="1"/>
<uniform name="specularPower" value="16.0"/>
<uniform name="specularColor" value="1.0 1.0 1.0"/>
<required_texture name="baseTex"/>
</material>

View File

@ -10,7 +10,6 @@
no specularity.
COMPATIBILITY: This effect is incompatible with the old "USE_SPECULAR" effect.
EFFICIENCY: This is a relatively inexpensive effect that should run easily on most hardware. -->
<define name="USE_SPECULAR_MAP" value="1"/>
<!-- Settings for effects above:
First value: Normal mapping intensity.
@ -18,4 +17,7 @@
Third value: Parallax scale.
Fourth value: AO amount. -->
<uniform name="effectSettings" value="1.0 25.0 0.0075 0.85"/>
<required_texture name="baseTex"/>
<required_texture name="specTex" define="USE_SPECULAR_MAP"/>
</material>

View File

@ -4,4 +4,6 @@
<alpha_blending/>
<define name="USE_TRANSPARENT" value="1"/>
<alternative material="alphatest.xml" if="CFG_FORCE_ALPHATEST"/>
<required_texture name="baseTex"/>
</material>

View File

@ -14,7 +14,6 @@
<!--<define name="USE_SPECULAR_MAP" value="1"/>
<define name="USE_SELF_LIGHT" value="1"/>-->
<define name="USE_AO" value="1"/>
<!-- Settings for effects above:
First value: Normal mapping intensity.
@ -22,4 +21,7 @@
Third value: Parallax scale.
Fourth value: AO amount. -->
<uniform name="effectSettings" value="1.0 50.0 0.0075 0.85"/>
<required_texture name="baseTex"/>
<required_texture name="aoTex" define="USE_AO"/>
</material>

View File

@ -9,12 +9,9 @@
<conditional_define name="USE_PARALLAX_MAP" value="1" type="draw_range" conf="PARALLAX_DIST"/>
<conditional_define name="USE_HQ_PARALLAX" value="1" type="draw_range" conf="PARALLAX_HQ_DIST"/>
<conditional_define name="USE_VHQ_PARALLAX" value="1" type="draw_range" conf="PARALLAX_VHQ_DIST"/>
<define name="USE_NORMAL_MAP" value="1"/>
<define name="USE_SPECULAR_MAP" value="1"/>
<!-- <define name="USE_SELF_LIGHT" value="1"/> -->
<define name="USE_AO" value="1"/>
<!-- Settings for effects above:
First value: Normal mapping intensity.
@ -22,4 +19,9 @@
Third value: Parallax scale.
Fourth value: AO amount. -->
<uniform name="effectSettings" value="1.0 50.0 0.0075 0.85"/>
<required_texture name="baseTex"/>
<required_texture name="normTex" define="USE_NORMAL_MAP"/>
<required_texture name="specTex" define="USE_SPECULAR_MAP"/>
<required_texture name="aoTex" define="USE_AO"/>
</material>

View File

@ -11,10 +11,8 @@
<conditional_define name="USE_VHQ_PARALLAX" value="1" type="draw_range" conf="PARALLAX_VHQ_DIST"/>
<define name="USE_NORMAL_MAP" value="1"/>-->
<define name="USE_SPECULAR_MAP" value="1"/>
<!-- <define name="USE_SELF_LIGHT" value="1"/> -->
<define name="USE_AO" value="1"/>
<!-- Settings for effects above:
First value: Normal mapping intensity.
@ -22,4 +20,8 @@
Third value: Parallax scale.
Fourth value: AO amount. -->
<uniform name="effectSettings" value="1.0 50.0 0.0075 0.85"/>
<required_texture name="baseTex"/>
<required_texture name="specTex" define="USE_SPECULAR_MAP"/>
<required_texture name="aoTex" define="USE_AO"/>
</material>

View File

@ -9,9 +9,7 @@
<conditional_define name="USE_PARALLAX_MAP" value="1" type="draw_range" conf="PARALLAX_DIST"/>
<conditional_define name="USE_HQ_PARALLAX" value="1" type="draw_range" conf="PARALLAX_HQ_DIST"/>
<conditional_define name="USE_VHQ_PARALLAX" value="1" type="draw_range" conf="PARALLAX_VHQ_DIST"/>
<define name="USE_NORMAL_MAP" value="1"/>
<define name="USE_SPECULAR_MAP" value="1"/>
<!-- <define name="USE_SELF_LIGHT" value="1"/> -->
<!--<define name="USE_AO" value="1"/>-->
@ -22,4 +20,7 @@
Third value: Parallax scale.
Fourth value: AO amount. -->
<uniform name="effectSettings" value="1.0 50.0 0.0075 0.85"/>
<required_texture name="baseTex"/>
<required_texture name="specTex" define="USE_SPECULAR_MAP"/>
<required_texture name="normTex" define="USE_NORMAL_MAP"/>
</material>

View File

@ -11,7 +11,6 @@
<conditional_define name="USE_VHQ_PARALLAX" value="1" type="draw_range" conf="PARALLAX_VHQ_DIST"/>
<define name="USE_NORMAL_MAP" value="1"/>-->
<define name="USE_SPECULAR_MAP" value="1"/>
<!-- <define name="USE_SELF_LIGHT" value="1"/> -->
<!-- Settings for effects above:
@ -20,4 +19,9 @@
Third value: Parallax scale.
Fourth value: AO amount. -->
<uniform name="effectSettings" value="1.0 50.0 0.0075 0.85"/>
<required_texture name="baseTex"/>
<required_texture name="specTex" define="USE_SPECULAR_MAP"/>
<required_texture name="normTex" define="USE_NORMAL_MAP"/>
</material>

View File

@ -6,4 +6,5 @@
<renderquery name="sim_time"/>
<define name="USE_WIND" value="1"/>
<uniform name="windData" value="1.0 1.0"/>
<required_texture name="baseTex"/>
</material>

View File

@ -9,4 +9,5 @@
<define name="USE_SPECULAR" value="1"/>
<uniform name="specularPower" value="16.0"/>
<uniform name="specularColor" value="1.0 1.0 1.0"/>
<required_texture name="baseTex"/>
</material>

View File

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<material>
<shader effect="model"/>
<required_texture name="baseTex"/>
</material>

View File

@ -39,4 +39,7 @@ element material {
element renderquery {
attribute name { text }
}*
element required_texture {
attribute name { text }
}*
}

View File

@ -86,5 +86,10 @@
<attribute name="name"/>
</element>
</zeroOrMore>
<zeroOrMore>
<element name="required_texture">
<attribute name="name"/>
</element>
</zeroOrMore>
</interleave>
</element>

View File

@ -11,7 +11,6 @@
<!--<define name="USE_SPECULAR_MAP" value="1"/>
<define name="USE_SELF_LIGHT" value="1"/>-->
<define name="USE_AO" value="1"/>
<!-- Settings for effects above:
First value: Normal mapping intensity.
@ -19,4 +18,7 @@
Third value: Parallax scale.
Fourth value: AO amount. -->
<uniform name="effectSettings" value="1.0 50.0 0.0075 0.85"/>
<required_texture name="baseTex"/>
<required_texture name="aoTex" define="USE_AO"/>
</material>

View File

@ -6,11 +6,9 @@
<conditional_define name="USE_PARALLAX_MAP" value="1" type="draw_range" conf="PARALLAX_DIST"/>
<conditional_define name="USE_HQ_PARALLAX" value="1" type="draw_range" conf="PARALLAX_HQ_DIST"/>
<conditional_define name="USE_VHQ_PARALLAX" value="1" type="draw_range" conf="PARALLAX_VHQ_DIST"/>
<define name="USE_NORMAL_MAP" value="1"/>
<!-- <define name="USE_SELF_LIGHT" value="1"/> -->
<define name="USE_AO" value="1"/>
<!-- Settings for effects above:
First value: Normal mapping intensity.
@ -18,4 +16,8 @@
Third value: Parallax scale.
Fourth value: AO amount. -->
<uniform name="effectSettings" value="1.0 50.0 0.0075 0.85"/>
<required_texture name="baseTex"/>
<required_texture name="normTex" define="USE_NORMAL_MAP"/>
<required_texture name="aoTex" define="USE_AO"/>
</material>

View File

@ -2,4 +2,6 @@
<material>
<shader effect="model"/>
<define name="USE_OBJECTCOLOR" value="1"/>
<required_texture name="baseTex"/>
</material>

View File

@ -7,4 +7,6 @@
<define name="USE_SPECULAR" value="1"/>
<uniform name="specularPower" value="16.0"/>
<uniform name="specularColor" value="1.0 1.0 1.0"/>
<required_texture name="baseTex"/>
</material>

View File

@ -4,6 +4,8 @@
<define name="USE_OBJECTCOLOR" value="1"/>
<define name="USE_SPECULAR_MAP" value="1"/>
<uniform name="effectSettings" value="1.0 50.0 0.0075 0.85"/>
<required_texture name="baseTex"/>
<required_texture name="specTex" define="USE_SPECULAR_MAP"/>
</material>

View File

@ -2,4 +2,5 @@
<material>
<shader effect="model"/>
<define name="USE_PLAYERCOLOR" value="1"/>
<required_texture name="baseTex"/>
</material>

View File

@ -12,7 +12,6 @@
<!--<define name="USE_SPECULAR_MAP" value="1"/>
<define name="USE_SELF_LIGHT" value="1"/>-->
<define name="USE_AO" value="1"/>
<!-- Settings for effects above:
First value: Normal mapping intensity.
@ -20,4 +19,8 @@
Third value: Parallax scale.
Fourth value: AO amount. -->
<uniform name="effectSettings" value="1.0 50.0 0.0075 0.6"/>
<required_texture name="baseTex"/>
<required_texture name="aoTex" define="USE_AO"/>
</material>

View File

@ -7,12 +7,9 @@
<conditional_define name="USE_PARALLAX_MAP" value="1" type="draw_range" conf="PARALLAX_DIST"/>
<conditional_define name="USE_HQ_PARALLAX" value="1" type="draw_range" conf="PARALLAX_HQ_DIST"/>
<conditional_define name="USE_VHQ_PARALLAX" value="1" type="draw_range" conf="PARALLAX_VHQ_DIST"/>
<define name="USE_NORMAL_MAP" value="1"/>
<define name="USE_SPECULAR_MAP" value="1"/>
<!-- <define name="USE_SELF_LIGHT" value="1"/> -->
<define name="USE_AO" value="1"/>
<!-- Settings for effects above:
First value: Normal mapping intensity.
@ -20,4 +17,9 @@
Third value: Parallax scale.
Fourth value: AO amount. -->
<uniform name="effectSettings" value="1.0 50.0 0.0075 0.6"/>
<required_texture name="baseTex"/>
<required_texture name="normTex" define="USE_NORMAL_MAP"/>
<required_texture name="specTex" define="USE_SPECULAR_MAP"/>
<required_texture name="aoTex" define="USE_AO"/>
</material>

View File

@ -7,12 +7,9 @@
<!--<conditional_define name="USE_PARALLAX_MAP" value="1" type="draw_range" conf="PARALLAX_DIST"/>
<conditional_define name="USE_HQ_PARALLAX" value="1" type="draw_range" conf="PARALLAX_HQ_DIST"/>
<conditional_define name="USE_VHQ_PARALLAX" value="1" type="draw_range" conf="PARALLAX_VHQ_DIST"/>-->
<define name="USE_NORMAL_MAP" value="1"/>
<define name="USE_SPECULAR_MAP" value="1"/>
<!-- <define name="USE_SELF_LIGHT" value="1"/> -->
<define name="USE_AO" value="1"/>
<!-- Settings for effects above:
First value: Normal mapping intensity.
@ -20,4 +17,10 @@
Third value: Parallax scale.
Fourth value: AO amount. -->
<uniform name="effectSettings" value="1.0 50.0 0.0075 0.85"/>
<required_texture name="baseTex"/>
<required_texture name="specTex" define="USE_SPECULAR_MAP"/>
<required_texture name="normTex" define="USE_NORMAL_MAP"/>
<required_texture name="aoTex" define="USE_AO"/>
</material>

View File

@ -7,7 +7,6 @@
<conditional_define name="USE_PARALLAX_MAP" value="1" type="draw_range" conf="PARALLAX_DIST"/>
<conditional_define name="USE_HQ_PARALLAX" value="1" type="draw_range" conf="PARALLAX_HQ_DIST"/>
<conditional_define name="USE_VHQ_PARALLAX" value="1" type="draw_range" conf="PARALLAX_VHQ_DIST"/>
<define name="USE_NORMAL_MAP" value="1"/>
<!--<define name="USE_SPECULAR_MAP" value="1"/>
<define name="USE_SELF_LIGHT" value="1"/>-->
@ -20,4 +19,8 @@
Third value: Parallax scale.
Fourth value: AO amount. -->
<uniform name="effectSettings" value="1.0 50.0 0.0075 0.75"/>
<required_texture name="baseTex"/>
<required_texture name="normTex" define="USE_NORMAL_MAP"/>
</material>

View File

@ -7,9 +7,7 @@
<conditional_define name="USE_PARALLAX_MAP" value="1" type="draw_range" conf="PARALLAX_DIST"/>
<conditional_define name="USE_HQ_PARALLAX" value="1" type="draw_range" conf="PARALLAX_HQ_DIST"/>
<conditional_define name="USE_VHQ_PARALLAX" value="1" type="draw_range" conf="PARALLAX_VHQ_DIST"/>
<define name="USE_NORMAL_MAP" value="1"/>
<define name="USE_SPECULAR_MAP" value="1"/>
<!-- <define name="USE_SELF_LIGHT" value="1"/> -->
<!--<define name="USE_AO" value="1"/>-->
@ -20,4 +18,9 @@
Third value: Parallax scale.
Fourth value: AO amount. -->
<uniform name="effectSettings" value="1.0 50.0 0.0075 0.85"/>
<required_texture name="baseTex"/>
<required_texture name="specTex" define="USE_SPECULAR_MAP"/>
<required_texture name="normTex" define="USE_NORMAL_MAP"/>
</material>

View File

@ -3,7 +3,6 @@
<shader effect="model"/>
<alternative material="player_trans.xml" quality="1"/>
<define name="USE_PLAYERCOLOR" value="1"/>
<define name="USE_SPECULAR_MAP" value="1"/>
<!-- <define name="USE_SELF_LIGHT" value="1"/> -->
<!-- Settings for effects above:
@ -12,4 +11,8 @@
Third value: Parallax scale.
Fourth value: AO amount. -->
<uniform name="effectSettings" value="1.0 50.0 0.0075 0.85"/>
<required_texture name="baseTex"/>
<required_texture name="specTex" define="USE_SPECULAR_MAP"/>
</material>

View File

@ -3,7 +3,6 @@
<shader effect="model"/>
<alternative material="player_trans.xml" quality="1"/>
<define name="USE_PLAYERCOLOR" value="1"/>
<define name="USE_SPECULAR_MAP" value="1"/>
<!-- <define name="USE_SELF_LIGHT" value="1"/> -->
<!-- Settings for effects above:
@ -12,4 +11,8 @@
Third value: Parallax scale.
Fourth value: AO amount. -->
<uniform name="effectSettings" value="1.0 20.0 0.0075 0.85"/>
<required_texture name="baseTex"/>
<required_texture name="specTex" define="USE_SPECULAR_MAP"/>
</material>

View File

@ -13,4 +13,5 @@
<uniform name="murkiness" value="0.6"/>
<uniform name="reflectionTint" value="0.3 0.4 0.3"/>
<uniform name="reflectionTintStrength" value="0.1"/>
<required_texture name="baseTex"/>
</material>

View File

@ -7,4 +7,5 @@
<define name="USE_SPECULAR" value="1"/>
<uniform name="specularPower" value="16.0"/>
<uniform name="specularColor" value="1.0 1.0 1.0"/>
<required_texture name="baseTex"/>
</material>

View File

@ -17,7 +17,6 @@
<!-- REQUIRES: Actor must provide a texture named "normTex", where the RGB channels
are a normal map corresponding to XYZ normals.
EFFICIENCY: This is a relatively inexpensive effect that should run easily on most hardware. -->
<define name="USE_NORMAL_MAP" value="1"/>
<!-- REQUIRES: Actor must provide a texture named "specTex", where the RGB channels
provide a specular colour multiplier.
@ -27,7 +26,6 @@
no specularity.
COMPATIBILITY: This effect is incompatible with the old "USE_SPECULAR" effect.
EFFICIENCY: This is a relatively inexpensive effect that should run easily on most hardware. -->
<define name="USE_SPECULAR_MAP" value="1"/>
<!-- REQUIRES: That "USE_SPECULAR_MAP" is enabled and a texture named "specTex" is provided by the Actor.
The Alpha channel of the texture defines the amount of self-illumination, with
@ -39,7 +37,6 @@
<!-- REQUIRES: Actor must provide a texture named "aoTex", where the R channel is the Ambient Occlusion.
The model must provide a second, non-overlapping set of UV coordinates.
COMMENT: The texture is combined using a multiply blend of (2 * ao * baseTex). -->
<define name="USE_AO" value="1"/>
<!-- Settings for effects above:
First value: Normal mapping intensity.
@ -47,4 +44,10 @@
Third value: Parallax scale.
Fourth value: AO amount. -->
<uniform name="effectSettings" value="1.0 10.0 0.0075 0.85"/>
<required_texture name="baseTex"/>
<required_texture name="specTex" define="USE_SPECULAR_MAP"/>
<required_texture name="normTex" define="USE_NORMAL_MAP"/>
<required_texture name="aoTex" define="USE_AO"/>
</material>

View File

@ -16,7 +16,6 @@
<!-- REQUIRES: Actor must provide a texture named "normTex", where the RGB channels
are a normal map corresponding to XYZ normals.
EFFICIENCY: This is a relatively inexpensive effect that should run easily on most hardware. -->
<define name="USE_NORMAL_MAP" value="1"/>
<!-- REQUIRES: Actor must provide a texture named "specTex", where the RGB channels
provide a specular colour multiplier.
@ -26,7 +25,6 @@
no specularity.
COMPATIBILITY: This effect is incompatible with the old "USE_SPECULAR" effect.
EFFICIENCY: This is a relatively inexpensive effect that should run easily on most hardware. -->
<define name="USE_SPECULAR_MAP" value="1"/>
<!-- REQUIRES: That "USE_SPECULAR_MAP" is enabled and a texture named "specTex" is provided by the Actor.
The Alpha channel of the texture defines the amount of self-illumination, with
@ -46,4 +44,8 @@
Third value: Parallax scale.
Fourth value: AO amount. -->
<uniform name="effectSettings" value="5.0 50.0 0.0075 0.85"/>
<required_texture name="baseTex"/>
<required_texture name="normTex" define="USE_NORMAL_MAP"/>
<required_texture name="specTex" define="USE_SPECULAR_MAP"/>
</material>

View File

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<material>
<shader effect="terrain_base"/>
<required_texture name="baseTex"/>
</material>

View File

@ -5,4 +5,5 @@
<!--define name="USE_SPECULAR_MAP" value="1"/-->
<!--uniform name="specularPower" value="15.0"/-->
<required_texture name="baseTex"/>
</material>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<material>
<shader effect="terrain_base"/>
<define name="USE_NORMAL_MAP" value="1"/>
<uniform name="effectSettings" value="1.0 15.0 0.0 0.0"/>
<required_texture name="normTex" define="USE_NORMAL_MAP"/>
</material>

View File

@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<material>
<shader effect="terrain_base"/>
<define name="USE_NORMAL_MAP" value="1"/>
<define name="USE_SPECULAR_MAP" value="1"/>
<uniform name="effectSettings" value="1.0 15.0 0.0 0.0"/>
<required_texture name="baseTex"/>
<required_texture name="normTex" define="USE_NORMAL_MAP"/>
<required_texture name="specTex" define="USE_SPECULAR_MAP"/>
</material>

View File

@ -4,4 +4,5 @@
<define name="USE_TRIPLANAR" value="1"/>
<uniform name="effectSettings" value="1.0 15.0 0.0 0.0"/>
<required_texture name="baseTex"/>
</material>

View File

@ -1,9 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<material>
<shader effect="terrain_base"/>
<define name="USE_NORMAL_MAP" value="1"/>
<define name="USE_SPECULAR_MAP" value="1"/>
<define name="USE_TRIPLANAR" value="1"/>
<uniform name="effectSettings" value="1.0 15.0 0.0 0.0"/>
<required_texture name="baseTex"/>
<required_texture name="normTex" define="USE_NORMAL_MAP"/>
<required_texture name="specTex" define="USE_SPECULAR_MAP"/>
</material>

View File

@ -4,4 +4,5 @@
<renderquery name="sim_time"/>
<define name="USE_WIND" value="1"/>
<uniform name="windData" value="1.0 1.0"/>
<required_texture name="baseTex"/>
</material>

View File

@ -6,11 +6,13 @@
<conditional_define name="USE_PARALLAX_MAP" value="1" type="draw_range" conf="PARALLAX_DIST"/>
<conditional_define name="USE_HQ_PARALLAX" value="1" type="draw_range" conf="PARALLAX_HQ_DIST"/>
<conditional_define name="USE_VHQ_PARALLAX" value="1" type="draw_range" conf="PARALLAX_VHQ_DIST"/>
<define name="USE_NORMAL_MAP" value="1"/>
<define name="USE_SPECULAR_MAP" value="1"/>
<uniform name="effectSettings" value="1.0 50.0 0.0075 0.85"/>
<renderquery name="sim_time"/>
<define name="USE_WIND" value="1"/>
<uniform name="windData" value="1.0 1.0"/>
<required_texture name="baseTex"/>
<required_texture name="specTex" define="USE_SPECULAR_MAP"/>
<required_texture name="normTex" define="USE_NORMAL_MAP"/>
</material>

View File

@ -7,4 +7,6 @@
<uniform name="specularPower" value="16.0"/>
<uniform name="specularColor" value="1.0 1.0 1.0"/>
<required_texture name="baseTex"/>
</material>

View File

@ -60,6 +60,13 @@ void CMaterial::AddRenderQuery(const char* key)
m_RenderQueries.Add(key);
}
void CMaterial::AddRequiredSampler(const CStr& samplerName)
{
CStrIntern string(samplerName);
m_RequiredSamplers.push_back(string);
}
// Set up m_CombinedShaderDefines so that index i contains m_ShaderDefines, plus
// the extra defines from m_ConditionalDefines[j] for all j where bit j is set in i.
// This lets GetShaderDefines() cheaply return the defines for any combination of conditions.

View File

@ -31,7 +31,8 @@ public:
struct TextureSampler
{
TextureSampler(CStr &n, CTexturePtr t) : Name(n), Sampler(t) {}
TextureSampler(const CStr &n, CTexturePtr t) : Name(n), Sampler(t) {}
TextureSampler(const CStrIntern &n, CTexturePtr t) : Name(n), Sampler(t) {}
CStrIntern Name;
CTexturePtr Sampler;
@ -74,6 +75,9 @@ public:
void AddRenderQuery(const char* key);
const CShaderRenderQueries& GetRenderQueries() const { return m_RenderQueries; }
void AddRequiredSampler(const CStr& samplerName);
const std::vector<CStrIntern>& GetRequiredSampler() const { return m_RequiredSamplers; }
// Must be called after all AddShaderDefine and AddConditionalDefine
void RecomputeCombinedShaderDefines();
@ -84,6 +88,7 @@ private:
CTexturePtr m_DiffuseTexture;
SamplersVector m_Samplers;
std::vector<CStrIntern> m_RequiredSamplers;
CStrIntern m_ShaderEffect;
CShaderDefines m_ShaderDefines;

View File

@ -58,9 +58,11 @@ CMaterial CMaterialManager::LoadMaterial(const VfsPath& pathname)
EL(shader);
EL(uniform);
EL(renderquery);
EL(required_texture);
EL(conditional_define);
AT(effect);
AT(if);
AT(define);
AT(quality);
AT(material);
AT(name);
@ -180,6 +182,12 @@ CMaterial CMaterialManager::LoadMaterial(const VfsPath& pathname)
{
material.AddRenderQuery(attrs.GetNamedItem(at_name).c_str());
}
else if (token == el_required_texture)
{
material.AddRequiredSampler(attrs.GetNamedItem(at_name));
if (!attrs.GetNamedItem(at_define).empty())
material.AddShaderDefine(CStrIntern(attrs.GetNamedItem(at_define)), str_1);
}
}
material.RecomputeCombinedShaderDefines();

View File

@ -164,7 +164,7 @@ bool CObjectBase::Load(const VfsPath& pathname)
if (se.Name == at_file)
samp.m_SamplerFile = VfsPath("art/textures/skins") / se.Value.FromUTF8();
else if (se.Name == at_name)
samp.m_SamplerName = se.Value;
samp.m_SamplerName = CStrIntern(se.Value);
}
currentVariant->m_Samplers.push_back(samp);
}
@ -459,9 +459,9 @@ const CObjectBase::Variation CObjectBase::BuildVariation(const std::vector<u8>&
// Same for samplers, though perhaps not strictly necessary:
for (std::vector<CObjectBase::Samp>::iterator it = var.m_Samplers.begin(); it != var.m_Samplers.end(); ++it)
variation.samplers.erase(it->m_SamplerName);
variation.samplers.erase(it->m_SamplerName.string());
for (std::vector<CObjectBase::Samp>::iterator it = var.m_Samplers.begin(); it != var.m_Samplers.end(); ++it)
variation.samplers.insert(make_pair(it->m_SamplerName, *it));
variation.samplers.insert(make_pair(it->m_SamplerName.string(), *it));
}
return variation;

View File

@ -28,6 +28,7 @@ class CObjectManager;
#include <boost/unordered_set.hpp>
#include "lib/file/vfs/vfs_path.h"
#include "ps/CStr.h"
#include "ps/CStrIntern.h"
#include <boost/random/mersenne_twister.hpp>
@ -70,7 +71,7 @@ public:
struct Samp
{
// identifier name of sampler in GLSL shaders
CStr m_SamplerName;
CStrIntern m_SamplerName;
// path to load from
VfsPath m_SamplerFile;
};

View File

@ -136,19 +136,26 @@ bool CObjectEntry::BuildVariation(const std::vector<std::set<CStr> >& selections
LOGERROR("Actor '%s' has no textures.", utf8_from_wstring(m_Base->m_ShortName));
}
std::vector<CObjectBase::Samp>::iterator samp;
for (samp = m_Samplers.begin(); samp != m_Samplers.end(); ++samp)
for (const auto& samp : m_Samplers)
{
CTextureProperties textureProps(samp->m_SamplerFile);
CTextureProperties textureProps(samp.m_SamplerFile);
textureProps.SetWrap(GL_CLAMP_TO_EDGE);
CTexturePtr texture = g_Renderer.GetTextureManager().CreateTexture(textureProps);
// if we've loaded this model we're probably going to render it soon, so prefetch its texture.
// All textures are prefetched even in the fixed pipeline, including the normal maps etc.
// TODO: Should check which renderpath is selected and only preload the necessary textures.
texture->Prefetch();
model->GetMaterial().AddSampler(CMaterial::TextureSampler(samp->m_SamplerName, texture));
model->GetMaterial().AddSampler(CMaterial::TextureSampler(samp.m_SamplerName, texture));
}
const std::vector<CStrIntern>& requiredSamplers = model->GetMaterial().GetRequiredSampler();
for (const auto& requSampName : requiredSamplers)
{
if (std::find_if(m_Samplers.begin(), m_Samplers.end(),
[&](CObjectBase::Samp sampler) { return sampler.m_SamplerName == requSampName; }) == m_Samplers.end())
LOGERROR("Actor %s: required texture sampler %s not found (material %s)", utf8_from_wstring(m_Base->m_ShortName), requSampName.string().c_str(), m_Base->m_Material.string8().c_str());
}
// calculate initial object space bounds, based on vertex positions
model->CalcStaticObjectBounds();