HELP: Tinting a loaded model with textures

hello there!



i was wondering how to change the tint of textures from loaded models (specifically COLLADA).

i used MaterialState but to no avail it still doesn't shade what i intend to.



MaterialState msRedTint = renderer.createMaterialState();
msRedTint.setDiffuse(new ColorRGBA(1.0f,0.0f,0.0f,1.0f));
msRedTint.setEmissive(new ColorRGBA(1.0f,0.0f,0.0f,1.0f));
msRedTint.setAmbient(new ColorRGBA(1.0f,0.0f,0.0f,1.0f));
msRedTint.setSpecular(new ColorRGBA(1.0f,0.0f,0.0f,1.0f));
msRedTint.setShininess(100);
scene.setRenderState(msRedTint);
scene.updateRenderState();



to see the diff, i applied the MaterialState to the root node.

here's the sample scene:



thanks a lot,

Andrew

the utility goes NullPointerException on a Procedural Texture Splatting, i think.

here's my dump. :slight_smile:



Node: rootNode
CullMode: never
RenderStates: CFLMZ
RenderQueue: opaque
Children: TerrainBlock/Terrain  Node/null  Node/null  Node/particles  MyBattleGrid/Battle Grid 


java.lang.NullPointerException
TerrainBlock: Terrain
        at java.net.URI$Parser.parse(URI.java:3003)
RenderStates: T
        at java.net.URI.<init>(URI.java:578)
0: null - RGB888-DXT1x256x256
r.rgb = tex0.rgb * vcolor.rgb;
r.a = tex0.rgb;

1: /C:/Users/Andrew/Documents/Java/CNMG/build/classes/textures/Detail.jpg - RGB888-DXT1x512x512
r.rgb = tex1.rgb + r.rgb - 0.5;
r.a = tex1.rgb;

RenderQueue: opaque
.......................
TriangleBatch: null
Batches set: VINT0T1 (VBO)
Vertex: 256
Triangles: 450
Node: null
CullMode: never
RenderStates: M
Transform: (550.0, 15.0, 550.0)[0.0, 0.0, 0.0]{0.3}
RenderQueue: opaque
Children: TriMesh/Model::head-geometry  TriMesh/Model::back_gun-geometry  TriMesh/Model::core-geometry  TriMesh/Model::foot-geometry 
TriMesh: Model::head-geometry
CullMode: never
RenderQueue: opaque
.......................
TriangleBatch: Mat1Tex1
CullMode: never
RenderStates: MT
0: /C:/Users/Andrew/Documents/Java/CNMG/build/classes/textures/head.png - RGB888-DXT1x256x256
r.rgb = r.rgb * tex0.rgb;
r.a = r.a * tex0.a;

Batches set: VINT0
Vertex: 76
Triangles: 48
TriMesh: Model::back_gun-geometry
CullMode: never
RenderQueue: opaque
.......................
TriangleBatch: Mat2Tex2
CullMode: never
RenderStates: MT
0: /C:/Users/Andrew/Documents/Java/CNMG/build/classes/textures/backgun_low.png - RGB888-DXT1x512x512
r.rgb = r.rgb * tex0.rgb;
r.a = r.a * tex0.a;

Batches set: VINT0
Vertex: 104
Triangles: 56
TriMesh: Model::core-geometry
CullMode: never
RenderQueue: opaque
.......................
TriangleBatch: Mat3Tex3
CullMode: never
RenderStates: MT
0: /C:/Users/Andrew/Documents/Java/CNMG/build/classes/textures/coreLuminance.png - RGB888-DXT1x256x256
r.rgb = r.rgb * tex0.rgb;
r.a = r.a * tex0.a;

Batches set: VINT0
Vertex: 226
Triangles: 156
TriMesh: Model::foot-geometry
CullMode: never
RenderQueue: opaque
.......................
TriangleBatch: Mat4Tex4
CullMode: never
RenderStates: MT
0: /C:/Users/Andrew/Documents/Java/CNMG/build/classes/textures/foot_lowLuminance.png - RGB888-DXT1x512x512
r.rgb = r.rgb * tex0.rgb;
r.a = r.a * tex0.a;

Batches set: VINT0
Vertex: 812
Triangles: 504
Node: null
CullMode: never
RenderStates: L
Transform: (550.0, 15.0, 750.0)[0.0, 0.0, 0.0]{0.3}
RenderQueue: opaque
Children: TriMesh/Model::head-geometry  TriMesh/Model::back_gun-geometry  TriMesh/Model::core-geometry  TriMesh/Model::foot-geometry  TriMesh/Model::shoulder-geometry  TriMesh/Model::gun-geometry 
TriMesh: Model::head-geometry
CullMode: never
RenderQueue: opaque
.......................
TriangleBatch: Mat1Tex1
CullMode: never
RenderStates: MT
0: /C:/Users/Andrew/Documents/Java/CNMG/build/classes/textures/head.png - RGB888-DXT1x256x256
r.rgb = r.rgb * tex0.rgb;
r.a = r.a * tex0.a;

Batches set: VINT0
Vertex: 76
Triangles: 48
TriMesh: Model::back_gun-geometry
CullMode: never
RenderQueue: opaque
.......................
TriangleBatch: Mat2Tex2
CullMode: never
RenderStates: MT
0: /C:/Users/Andrew/Documents/Java/CNMG/build/classes/textures/backgun_low.png - RGB888-DXT1x512x512
r.rgb = r.rgb * tex0.rgb;
r.a = r.a * tex0.a;

Batches set: VINT0
Vertex: 104
Triangles: 56
TriMesh: Model::core-geometry
CullMode: never
RenderQueue: opaque
.......................
TriangleBatch: Mat3Tex3
CullMode: never
RenderStates: MT
0: /C:/Users/Andrew/Documents/Java/CNMG/build/classes/textures/coreLuminance.png - RGB888-DXT1x256x256
r.rgb = r.rgb * tex0.rgb;
r.a = r.a * tex0.a;

Batches set: VINT0
Vertex: 226
Triangles: 156
TriMesh: Model::foot-geometry
CullMode: never
RenderQueue: opaque
.......................
TriangleBatch: Mat4Tex4
CullMode: never
RenderStates: MT
0: /C:/Users/Andrew/Documents/Java/CNMG/build/classes/textures/foot_lowLuminance.png - RGB888-DXT1x512x512
r.rgb = r.rgb * tex0.rgb;
r.a = r.a * tex0.a;

Batches set: VINT0
Vertex: 812
Triangles: 504
TriMesh: Model::shoulder-geometry
CullMode: never
RenderQueue: opaque
.......................
TriangleBatch: Mat5Tex5
CullMode: never
RenderStates: MT
0: /C:/Users/Andrew/Documents/Java/CNMG/build/classes/textures/arms_low.png - RGB888-DXT1x512x512
r.rgb = r.rgb * tex0.rgb;
r.a = r.a * tex0.a;

Batches set: VINT0
Vertex: 654
Triangles: 452
TriMesh: Model::gun-geometry
CullMode: never
RenderQueue: opaque
.......................
TriangleBatch: Mat6Tex6
CullMode: never
RenderStates: MT
0: /C:/Users/Andrew/Documents/Java/CNMG/build/classes/textures/gunColor.png - RGB888-DXT1x1024x1024
r.rgb = r.rgb * tex0.rgb;
r.a = r.a * tex0.a;

Batches set: VINT0
Vertex: 1639
Triangles: 948
Node: particles
CullMode: never
RenderStates: Z
Transform: (540.0, 10.0, 490.0)[0.0, 0.0, 0.0]{0.5}
RenderQueue: opaque
Children: ParticleMesh/Layer #0  ParticleMesh/Layer #1  ParticleMesh/Layer #2 
ParticleMesh: Layer #0
CullMode: never
TexMode: replace
LightMode: off
RenderStates: AT
0: null - RGB888-DXT1x32x32
r.rgb = r.rgb * tex0.rgb;
r.a = r.a * tex0.a;

RenderQueue: transparent
Controllers: [com.jmex.effects.particles.ParticleController@19f3736]
.......................
TriangleBatch: null
CullMode: never
TexMode: replace
LightMode: off
Batches set: VICT0
Vertex: 1200
Triangles: 600
ParticleMesh: Layer #1
CullMode: never
TexMode: replace
LightMode: off
RenderStates: AT
0: null - RGB888-DXT1x32x32
r.rgb = r.rgb * tex0.rgb;
r.a = r.a * tex0.a;

RenderQueue: transparent
Controllers: [com.jmex.effects.particles.ParticleController@56860b]
.......................
TriangleBatch: null
CullMode: never
TexMode: replace
LightMode: off
Batches set: VICT0
Vertex: 200
Triangles: 100
ParticleMesh: Layer #2
CullMode: never
TexMode: replace
LightMode: off
RenderStates: AT
0: null - RGB888-DXT1x32x32
r.rgb = r.rgb * tex0.rgb;
r.a = r.a * tex0.a;

RenderQueue: transparent
Controllers: [com.jmex.effects.particles.ParticleController@1343ed0]
.......................
TriangleBatch: null
CullMode: never
TexMode: replace
LightMode: off
Batches set: VICT0
Vertex: 200
Triangles: 100
MyBattleGrid: Battle Grid
CullMode: never
RenderStates: A
RenderQueue: opaque
Children: Node/hoverNode  TriMesh/gridLines  Node/gridLines 
Node: hoverNode
CullMode: never
RenderQueue: opaque
Children: Quad/selQuad  Octahedron/pointer_alpha 
Quad: selQuad
CullMode: never
LightMode: off
RenderQueue: transparent
.......................
TriangleBatch: null
CullMode: never
LightMode: off
Batches set: VINT0
Vertex: 4
Triangles: 2
Octahedron: pointer_alpha
CullMode: never
LightMode: off
RenderStates: A
Transform: (0.0, 150.0, 0.0)[0.0, 0.0, 0.0]{1.3333334}
RenderQueue: transparent
.......................
TriangleBatch: null
CullMode: never
LightMode: off
Batches set: VINT0
Vertex: 6
Triangles: 8
TriMesh: gridLines
CullMode: never
LightMode: off
RenderQueue: transparent
.......................
TriangleBatch: null
CullMode: never
LightMode: off
Batches set: VIT0
Vertex: 2
Triangles: 0
Node: gridLines
CullMode: never
Transform: (0.0, 0.1, 0.0)[0.0, 0.0, 0.0]{1.0}
RenderQueue: opaque
Children: Line/null 
Line: null
CullMode: never
LightMode: off
RenderQueue: opaque
.......................
LineBatch: null
CullMode: never
LightMode: off
Batches set: VT0
Vertex: 384
        at cnmg.SceneGraphDump.dumpTextureState(SceneGraphDump.java:414)
        at cnmg.SceneGraphDump.dumpRenderState(SceneGraphDump.java:477)
        at cnmg.SceneGraphDump.dumpSceneElement(SceneGraphDump.java:320)
        at cnmg.SceneGraphDump.dumpSpatial(SceneGraphDump.java:327)
        at cnmg.SceneGraphDump.dumpGeometry(SceneGraphDump.java:394)
        at cnmg.SceneGraphDump.dump(SceneGraphDump.java:513)
        at cnmg.SceneGraphDump.dump(SceneGraphDump.java:522)
        at cnmg.state.RoundGameState.stateActivate(RoundGameState.java:203)
        at cnmg.state.MyGameState.setActive(MyGameState.java:187)
        at cnmg.Main.main(Main.java:62)

You need a LightState for the MaterialState to take effect.

i did place and had LightState enabled for all of them. (1 directional and 1 point)



i tried doing msRedTint.setMaterialFace(MaterialState.MF_FRONT_AND_BACK); out of curiousity

and found some red triangles around the Mech's knees, which proves that the Mech is affected by the MaterialState.

although i'm not sure why it doesn't work on the model textures.

It’s possible that the texture environment is not set up correctly to have lighting applied.

Use this utility class to get a scene graph dump, then post the output here.

If I recall correctly there are some blending functions for materials + textures… I don't know where, though… try searching the forums for modulate, blending, texture and material.

It seems that you have some null-named nodes, this can be problematic in some cases, so you might want to fix that.

Everything else seems fine, you don't have any color buffer set on any of the meshes, the textures modulate by primary color, lighting is enabled on the root node, and the material is set. The only thing I can think of is that you're forgetting to call updateRenderState after applying the material state…



EDIT: SceneGraphDump code was updated, your crash is fixed.

thanks for the help so far guys, but still it doesn't tint up, still the same. i have the updateRenderStates too. :stuck_out_tongue:

You will have to provide more info… Post your lightstate setup code, for example.

And texture, please

notice that the terrain block on the ground is also applied with the same material state,

but to no avail the loaded COLLADA files did not have the material.



i have scene as the root node, as for the light:



        defaultLight = new DirectionalLight();
        defaultLight.setAmbient(getColor(125, 125, 125, 1.0f));
        defaultLight.setDiffuse(getColor(255, 255, 255, 1.0f));
        defaultLight.setDirection(new Vector3f(-1.0f, -1.0f, -1.0f));
        defaultLight.setShadowCaster(true);
        defaultLight.setEnabled(true);
       
        lightState = renderer.createLightState();
        lightState.attach(defaultLight);
        lightState.setTwoSidedLighting(true);
        lightState.setEnabled(true);
        scene.setRenderState(lightState);



and i used the following code to load the COLLADA file:


    public static Node loadColladaFile(String path) {
        Node n = new Node("collada:" + path);
        InputStream model = Main.class.getClassLoader().getResourceAsStream(path);
        if(model != null) {
            ColladaImporter.load(model, "model");
            ArrayList<String> models = ColladaImporter.getGeometryNames();
            if(models != null) {
                for(int i=0; i<models.size(); i++) {
                    Geometry g = ColladaImporter.getGeometry(models.get(i));
                    n.attachChild(g);
                }
            }
            ColladaImporter.cleanUp();
        }
        return n;
    }

...

    final Node n2 = Main.loadColladaFile("models/model.dae");
    n2.setLocalScale(0.3f);
    n2.setLocalTranslation(550, 15, 750);
    n2.getLocalRotation().fromAngles(0, 180 * FastMath.DEG_TO_RAD, 0);
    scene.attachChild(n2);



the textures are automatically embedded with the COLLADA .dae, i'm not sure what to post. :P

thanks! hope to solve this one. :D

The direction is not normalized for the light… You need to call normalizeLocal on the direction vector.

made it into this one:



defaultLight.setDirection(new Vector3f(-1.0f, -1.0f, -1.0f).normalizeLocal());



but still no success.. i've loaded some models with textures, and the same effect, no material state.
i've tried loading a box without textures and then the material goes happily red.

i wonder why the TerrainBlock turns into red (texture was some jME default grass) while the models do not?

It's obviously some property on the model that prevents it from recieving light…

If you can, post your scene graph because I don't think there's any other way to get this fixed…