Applying MatParam by inheritance instead of instanceof

Because Material.render() is called every frame, and for code design

inheritance seems to be better than instanceof for this case.



[patch]

Index: src/core/com/jme3/material/Material.java

===================================================================

— src/core/com/jme3/material/Material.java (revision 6567)

+++ src/core/com/jme3/material/Material.java (working copy)

@@ -126,6 +126,15 @@

public int getUnit() {

return unit;

}

+

  •    @Override<br />
    
  •    public void apply(Renderer r, Technique technique) {<br />
    
  •        TechniqueDef techDef = technique.getDef();<br />
    
  •        r.setTexture(getUnit(), getTextureValue());<br />
    
  •        if (techDef.isUsingShaders()) {<br />
    
  •            technique.updateUniformParam(getName(), getVarType(), getUnit(), true);<br />
    
  •        }<br />
    
  •    }<br />
    

@Override
public void write(JmeExporter ex) throws IOException {
@@ -815,24 +824,7 @@
// setup textures and uniforms
for (int i = 0; i < paramValues.size(); i++) {
MatParam param = paramValues.getValue(i);
- if (param instanceof MatParamTexture) {
- MatParamTexture texParam = (MatParamTexture) param;
- r.setTexture(texParam.getUnit(), texParam.getTextureValue());
- if (techDef.isUsingShaders()) {
-
- technique.updateUniformParam(texParam.getName(),
- texParam.getVarType(),
- texParam.getUnit(), true);
- }
- } else {
- if (!techDef.isUsingShaders()) {
- continue;
- }
-
- technique.updateUniformParam(param.getName(),
- param.getVarType(),
- param.getValue(), true);
- }
+ param.apply(r, technique);
}

Shader shader = technique.getShader();
Index: src/core/com/jme3/material/MatParam.java
===================================================================
--- src/core/com/jme3/material/MatParam.java (revision 6567)
+++ src/core/com/jme3/material/MatParam.java (working copy)
@@ -37,6 +37,7 @@
import com.jme3.export.JmeImporter;
import com.jme3.export.OutputCapsule;
import com.jme3.export.Savable;
+import com.jme3.renderer.Renderer;
import com.jme3.shader.Uniform;
import com.jme3.shader.VarType;
import java.io.IOException;
@@ -148,5 +149,13 @@
public String toString(){
return type.name()+" "+name;
}
+
+ public void apply(Renderer r, Technique technique) {
+ TechniqueDef techDef = technique.getDef();
+ if (techDef.isUsingShaders()) {
+ technique.updateUniformParam(getName(), getVarType(), getValue(), true);
+ }
+
+ }
}
[/patch]

That’s a cool idea, strange that none of us thought of it!

Thanks :slight_smile:

committed in svn. rev. 6577