Skip to content

Commit cb5c139

Browse files
committed
initial implementation of MPO (untested!)
1 parent 239524c commit cb5c139

File tree

6 files changed

+133
-30
lines changed

6 files changed

+133
-30
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Copyright (c) 2009-2016 jMonkeyEngine
3+
* All rights reserved.
4+
*
5+
* Redistribution and use in source and binary forms, with or without
6+
* modification, are permitted provided that the following conditions are
7+
* met:
8+
*
9+
* * Redistributions of source code must retain the above copyright
10+
* notice, this list of conditions and the following disclaimer.
11+
*
12+
* * Redistributions in binary form must reproduce the above copyright
13+
* notice, this list of conditions and the following disclaimer in the
14+
* documentation and/or other materials provided with the distribution.
15+
*
16+
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors
17+
* may be used to endorse or promote products derived from this software
18+
* without specific prior written permission.
19+
*
20+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22+
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23+
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24+
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25+
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26+
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27+
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28+
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29+
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31+
*/
32+
package com.jme3.material;
33+
34+
import com.jme3.shader.VarType;
35+
36+
public final class MatParamOverride extends MatParam {
37+
38+
public MatParamOverride(VarType type, String name, Object value) {
39+
super(type, name, value);
40+
}
41+
42+
}

jme3-core/src/main/java/com/jme3/material/Material.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -820,7 +820,7 @@ private void updateRenderState(RenderManager renderManager, Renderer renderer, T
820820
* used for rendering, there won't be any delay since the material has
821821
* been already been setup for rendering.
822822
*
823-
* @param rm The render manager to preload for
823+
* @param renderManager The render manager to preload for
824824
*/
825825
public void preload(RenderManager renderManager) {
826826
if (technique == null) {
@@ -834,7 +834,7 @@ public void preload(RenderManager renderManager) {
834834
return;
835835
}
836836

837-
Shader shader = technique.makeCurrent(renderManager, null, rendererCaps);
837+
Shader shader = technique.makeCurrent(renderManager, null, null, rendererCaps);
838838
updateShaderMaterialParameters(renderer, shader);
839839
renderManager.getRenderer().setShader(shader);
840840
}
@@ -938,8 +938,11 @@ public void render(Geometry geometry, LightList lights, RenderManager renderMana
938938
// Apply render state
939939
updateRenderState(renderManager, renderer, techniqueDef);
940940

941+
// Get world overrides
942+
ArrayList<MatParamOverride> overrides = geometry.getWorldOverrides();
943+
941944
// Select shader to use
942-
Shader shader = technique.makeCurrent(renderManager, lights, rendererCaps);
945+
Shader shader = technique.makeCurrent(renderManager, overrides, lights, rendererCaps);
943946

944947
// Begin tracking which uniforms were changed by material.
945948
clearUniformsSetByCurrent(shader);

jme3-core/src/main/java/com/jme3/material/Technique.java

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@
4141
import com.jme3.shader.Shader;
4242
import com.jme3.shader.VarType;
4343
import com.jme3.util.ListMap;
44+
import java.util.ArrayList;
4445
import java.util.EnumSet;
46+
import java.util.List;
4547

4648
/**
4749
* Represents a technique instance.
@@ -85,26 +87,8 @@ void notifyParamChanged(String paramName, VarType type, Object value) {
8587
if (defineId == null) {
8688
return;
8789
}
88-
89-
if (value == null) {
90-
dynamicDefines.set(defineId, 0);
91-
return;
92-
}
93-
94-
switch (type) {
95-
case Int:
96-
dynamicDefines.set(defineId, (Integer) value);
97-
break;
98-
case Float:
99-
dynamicDefines.set(defineId, (Float) value);
100-
break;
101-
case Boolean:
102-
dynamicDefines.set(defineId, ((Boolean)value));
103-
break;
104-
default:
105-
dynamicDefines.set(defineId, 1);
106-
break;
107-
}
90+
91+
dynamicDefines.set(defineId, type, value);
10892
}
10993

11094
/**
@@ -115,6 +99,7 @@ void notifyParamChanged(String paramName, VarType type, Object value) {
11599
*/
116100
void notifyTechniqueSwitched() {
117101
ListMap<String, MatParam> paramMap = owner.getParamsMap();
102+
dynamicDefines.clear();
118103
for (int i = 0; i < paramMap.size(); i++) {
119104
MatParam param = paramMap.getValue(i);
120105
notifyParamChanged(param.getName(), param.getVarType(), param.getValue());
@@ -131,10 +116,23 @@ void notifyTechniqueSwitched() {
131116
* @param rendererCaps The renderer capabilities which the shader should support.
132117
* @return A compatible shader.
133118
*/
134-
Shader makeCurrent(RenderManager renderManager, LightList lights, EnumSet<Caps> rendererCaps) {
119+
Shader makeCurrent(RenderManager renderManager, ArrayList<MatParamOverride> overrides,
120+
LightList lights, EnumSet<Caps> rendererCaps) {
135121
TechniqueDefLogic logic = def.getLogic();
136122
AssetManager assetManager = owner.getMaterialDef().getAssetManager();
137-
return logic.makeCurrent(assetManager, renderManager, rendererCaps, lights, dynamicDefines);
123+
124+
// TODO: remove allocation
125+
DefineList combinedDefines = def.createDefineList();
126+
combinedDefines.setAll(dynamicDefines);
127+
128+
for (MatParamOverride override : overrides) {
129+
Integer defineId = def.getShaderParamDefineId(override.name);
130+
if (defineId != null) {
131+
combinedDefines.set(defineId, override.type, override.value);
132+
}
133+
}
134+
135+
return logic.makeCurrent(assetManager, renderManager, rendererCaps, lights, combinedDefines);
138136
}
139137

140138
/**

jme3-core/src/main/java/com/jme3/material/TechniqueDef.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -330,13 +330,13 @@ public String getShaderParamDefine(String paramName){
330330
}
331331

332332
/**
333-
* Get the define ID for a given define name.
333+
* Get the define ID for a given material parameter.
334334
*
335-
* @param defineName The define name to lookup
335+
* @param paramName The parameter name to look up
336336
* @return The define ID, or null if not found.
337337
*/
338-
public Integer getShaderParamDefineId(String defineName) {
339-
return paramToDefineId.get(defineName);
338+
public Integer getShaderParamDefineId(String paramName) {
339+
return paramToDefineId.get(paramName);
340340
}
341341

342342

jme3-core/src/main/java/com/jme3/scene/Spatial.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import com.jme3.export.*;
3939
import com.jme3.light.Light;
4040
import com.jme3.light.LightList;
41+
import com.jme3.material.MatParamOverride;
4142
import com.jme3.material.Material;
4243
import com.jme3.math.*;
4344
import com.jme3.renderer.Camera;
@@ -424,6 +425,29 @@ public LightList getWorldLightList() {
424425
return worldLights;
425426
}
426427

428+
/**
429+
* Get the local material parameter overrides.
430+
*
431+
* @return The list of local material parameter overrides.
432+
*/
433+
public ArrayList<MatParamOverride> getLocalOverrides() {
434+
return null;
435+
}
436+
437+
/**
438+
* Get the world material parameter overrides.
439+
*
440+
* Note that this list is only updated on a call to
441+
* {@link #updateGeometricState()}. After update, the world overrides list
442+
* will contain the {@link #getParent() parent's} world overrides combined
443+
* with this spatial's {@link #getLocalOverrides() local overrides}.
444+
*
445+
* @return The list of world material parameter overrides.
446+
*/
447+
public ArrayList<MatParamOverride> getWorldOverrides() {
448+
return null;
449+
}
450+
427451
/**
428452
* <code>getWorldRotation</code> retrieves the absolute rotation of the
429453
* Spatial.

jme3-core/src/main/java/com/jme3/shader/DefineList.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
*/
3232
package com.jme3.shader;
3333

34+
import java.util.Arrays;
3435
import java.util.List;
3536

3637
/**
@@ -41,7 +42,7 @@
4142
public final class DefineList {
4243

4344
public static final int MAX_DEFINES = 64;
44-
45+
4546
private long hash;
4647
private final int[] vals;
4748

@@ -76,6 +77,41 @@ public void set(int id, boolean val) {
7677
set(id, val ? 1 : 0);
7778
}
7879

80+
public void set(int id, VarType type, Object value) {
81+
if (value == null) {
82+
set(id, 0);
83+
return;
84+
}
85+
86+
switch (type) {
87+
case Int:
88+
set(id, (Integer) value);
89+
break;
90+
case Float:
91+
set(id, (Float) value);
92+
break;
93+
case Boolean:
94+
set(id, ((Boolean) value));
95+
break;
96+
default:
97+
set(id, 1);
98+
break;
99+
}
100+
}
101+
102+
public void setAll(DefineList other) {
103+
for (int i = 0; i < other.vals.length; i++) {
104+
if (other.vals[i] != 0) {
105+
vals[i] = other.vals[i];
106+
}
107+
}
108+
}
109+
110+
public void clear() {
111+
hash = 0;
112+
Arrays.fill(vals, 0);
113+
}
114+
79115
public boolean getBoolean(int id) {
80116
return vals[id] != 0;
81117
}

0 commit comments

Comments
 (0)