Changed overrides from ArrayList to SafeArrayList for GC and iteration performance reasons. Fixed bug in SafeArrayList.equals().
This commit is contained in:
parent
b524dcd66d
commit
8e8186de0a
@ -35,7 +35,7 @@ import com.jme3.asset.AssetKey;
|
||||
import com.jme3.asset.AssetManager;
|
||||
import com.jme3.asset.CloneableSmartAsset;
|
||||
import com.jme3.export.*;
|
||||
import com.jme3.light.*;
|
||||
import com.jme3.light.LightList;
|
||||
import com.jme3.material.RenderState.BlendMode;
|
||||
import com.jme3.material.RenderState.FaceCullMode;
|
||||
import com.jme3.material.TechniqueDef.LightMode;
|
||||
@ -54,6 +54,8 @@ import com.jme3.texture.Image;
|
||||
import com.jme3.texture.Texture;
|
||||
import com.jme3.texture.image.ColorSpace;
|
||||
import com.jme3.util.ListMap;
|
||||
import com.jme3.util.SafeArrayList;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.logging.Level;
|
||||
@ -749,15 +751,8 @@ public class Material implements CloneableSmartAsset, Cloneable, Savable {
|
||||
sortingId = -1;
|
||||
}
|
||||
|
||||
private int applyOverrides(Renderer renderer, Shader shader, List<MatParamOverride> overrides, int unit) {
|
||||
MatParamOverride override;
|
||||
boolean isArrayList = overrides instanceof ArrayList;
|
||||
Iterator<MatParamOverride> iterator = isArrayList ? null : overrides.iterator();
|
||||
|
||||
// manual iteration is used to avoid iterator allocation and to increase iteration performance in case of ArrayList
|
||||
for (int i = 0, listSize = overrides.size(); i < listSize; i++) {
|
||||
override = isArrayList ? overrides.get(i) : iterator.next();
|
||||
|
||||
private int applyOverrides(Renderer renderer, Shader shader, SafeArrayList<MatParamOverride> overrides, int unit) {
|
||||
for (MatParamOverride override : overrides.getArray()) {
|
||||
VarType type = override.getVarType();
|
||||
|
||||
MatParam paramDef = def.getMaterialParam(override.getName());
|
||||
@ -784,7 +779,7 @@ public class Material implements CloneableSmartAsset, Cloneable, Savable {
|
||||
}
|
||||
|
||||
private void updateShaderMaterialParameters(Renderer renderer, Shader shader,
|
||||
List<MatParamOverride> worldOverrides, List<MatParamOverride> forcedOverrides) {
|
||||
SafeArrayList<MatParamOverride> worldOverrides, SafeArrayList<MatParamOverride> forcedOverrides) {
|
||||
|
||||
int unit = 0;
|
||||
if (worldOverrides != null) {
|
||||
@ -952,7 +947,7 @@ public class Material implements CloneableSmartAsset, Cloneable, Savable {
|
||||
updateRenderState(renderManager, renderer, techniqueDef);
|
||||
|
||||
// Get world overrides
|
||||
List<MatParamOverride> overrides = geometry.getWorldMatParamOverrides();
|
||||
SafeArrayList<MatParamOverride> overrides = geometry.getWorldMatParamOverrides();
|
||||
|
||||
// Select shader to use
|
||||
Shader shader = technique.makeCurrent(renderManager, overrides, renderManager.getForcedMatParams(), lights, rendererCaps);
|
||||
|
@ -31,10 +31,10 @@
|
||||
*/
|
||||
package com.jme3.material;
|
||||
|
||||
import com.jme3.material.logic.TechniqueDefLogic;
|
||||
import com.jme3.asset.AssetManager;
|
||||
import com.jme3.light.LightList;
|
||||
import com.jme3.material.TechniqueDef.LightMode;
|
||||
import com.jme3.material.logic.TechniqueDefLogic;
|
||||
import com.jme3.renderer.Caps;
|
||||
import com.jme3.renderer.RenderManager;
|
||||
import com.jme3.scene.Geometry;
|
||||
@ -42,10 +42,8 @@ import com.jme3.shader.DefineList;
|
||||
import com.jme3.shader.Shader;
|
||||
import com.jme3.shader.VarType;
|
||||
import com.jme3.util.ListMap;
|
||||
import java.util.ArrayList;
|
||||
import com.jme3.util.SafeArrayList;
|
||||
import java.util.EnumSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Represents a technique instance.
|
||||
@ -111,15 +109,8 @@ public final class Technique {
|
||||
}
|
||||
}
|
||||
|
||||
private void applyOverrides(DefineList defineList, List<MatParamOverride> overrides) {
|
||||
MatParamOverride override;
|
||||
boolean isArrayList = overrides instanceof ArrayList;
|
||||
Iterator<MatParamOverride> iterator = isArrayList ? null : overrides.iterator();
|
||||
|
||||
// manual iteration is used to avoid iterator allocation and to increase iteration performance in case of ArrayList
|
||||
for (int i = 0, listSize = overrides.size(); i < listSize; i++) {
|
||||
override = isArrayList ? overrides.get(i) : iterator.next();
|
||||
|
||||
private void applyOverrides(DefineList defineList, SafeArrayList<MatParamOverride> overrides) {
|
||||
for (MatParamOverride override : overrides.getArray()) {
|
||||
if (!override.isEnabled()) {
|
||||
continue;
|
||||
}
|
||||
@ -142,8 +133,8 @@ public final class Technique {
|
||||
* @param rendererCaps The renderer capabilities which the shader should support.
|
||||
* @return A compatible shader.
|
||||
*/
|
||||
Shader makeCurrent(RenderManager renderManager, List<MatParamOverride> worldOverrides,
|
||||
List<MatParamOverride> forcedOverrides,
|
||||
Shader makeCurrent(RenderManager renderManager, SafeArrayList<MatParamOverride> worldOverrides,
|
||||
SafeArrayList<MatParamOverride> forcedOverrides,
|
||||
LightList lights, EnumSet<Caps> rendererCaps) {
|
||||
TechniqueDefLogic logic = def.getLogic();
|
||||
AssetManager assetManager = owner.getMaterialDef().getAssetManager();
|
||||
|
@ -83,7 +83,7 @@ public class RenderManager {
|
||||
private Material forcedMaterial = null;
|
||||
private String forcedTechnique = null;
|
||||
private RenderState forcedRenderState = null;
|
||||
private final List<MatParamOverride> forcedOverrides = new ArrayList<>();
|
||||
private final SafeArrayList<MatParamOverride> forcedOverrides = new SafeArrayList<>(MatParamOverride.class);
|
||||
private int viewX, viewY, viewWidth, viewHeight;
|
||||
private final Matrix4f orthoMatrix = new Matrix4f();
|
||||
private final LightList filteredLightList = new LightList(null);
|
||||
@ -462,7 +462,7 @@ public class RenderManager {
|
||||
*
|
||||
* @return The forced material parameters.
|
||||
*/
|
||||
public List<MatParamOverride> getForcedMatParams() {
|
||||
public SafeArrayList<MatParamOverride> getForcedMatParams() {
|
||||
return forcedOverrides;
|
||||
}
|
||||
|
||||
|
@ -138,8 +138,8 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab
|
||||
protected LightList localLights;
|
||||
protected transient LightList worldLights;
|
||||
|
||||
protected ArrayList<MatParamOverride> localOverrides;
|
||||
protected ArrayList<MatParamOverride> worldOverrides;
|
||||
protected SafeArrayList<MatParamOverride> localOverrides;
|
||||
protected SafeArrayList<MatParamOverride> worldOverrides;
|
||||
|
||||
/**
|
||||
* This spatial's name.
|
||||
@ -207,8 +207,8 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab
|
||||
localLights = new LightList(this);
|
||||
worldLights = new LightList(this);
|
||||
|
||||
localOverrides = new ArrayList<>();
|
||||
worldOverrides = new ArrayList<>();
|
||||
localOverrides = new SafeArrayList<>(MatParamOverride.class);
|
||||
worldOverrides = new SafeArrayList<>(MatParamOverride.class);
|
||||
refreshFlags |= RF_BOUND;
|
||||
}
|
||||
|
||||
@ -432,7 +432,7 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab
|
||||
*
|
||||
* @return The list of local material parameter overrides.
|
||||
*/
|
||||
public List<MatParamOverride> getLocalMatParamOverrides() {
|
||||
public SafeArrayList<MatParamOverride> getLocalMatParamOverrides() {
|
||||
return localOverrides;
|
||||
}
|
||||
|
||||
@ -446,7 +446,7 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab
|
||||
*
|
||||
* @return The list of world material parameter overrides.
|
||||
*/
|
||||
public List<MatParamOverride> getWorldMatParamOverrides() {
|
||||
public SafeArrayList<MatParamOverride> getWorldMatParamOverrides() {
|
||||
return worldOverrides;
|
||||
}
|
||||
|
||||
@ -1384,8 +1384,8 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab
|
||||
clone.localLights.setOwner(clone);
|
||||
clone.worldLights.setOwner(clone);
|
||||
|
||||
clone.worldOverrides = new ArrayList<MatParamOverride>();
|
||||
clone.localOverrides = new ArrayList<MatParamOverride>();
|
||||
clone.worldOverrides = new SafeArrayList<>(MatParamOverride.class);
|
||||
clone.localOverrides = new SafeArrayList<>(MatParamOverride.class);
|
||||
|
||||
for (MatParamOverride override : localOverrides) {
|
||||
clone.localOverrides.add((MatParamOverride) override.clone());
|
||||
@ -1598,7 +1598,7 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab
|
||||
capsule.write(shadowMode, "shadow_mode", ShadowMode.Inherit);
|
||||
capsule.write(localTransform, "transform", Transform.IDENTITY);
|
||||
capsule.write(localLights, "lights", null);
|
||||
capsule.writeSavableArrayList(localOverrides, "overrides", null);
|
||||
capsule.writeSavableArrayList(new ArrayList(localOverrides), "overrides", null);
|
||||
|
||||
// Shallow clone the controls array to convert its type.
|
||||
capsule.writeSavableArrayList(new ArrayList(controls), "controlsList", null);
|
||||
@ -1622,11 +1622,13 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab
|
||||
localLights = (LightList) ic.readSavable("lights", null);
|
||||
localLights.setOwner(this);
|
||||
|
||||
localOverrides = ic.readSavableArrayList("overrides", null);
|
||||
if (localOverrides == null) {
|
||||
localOverrides = new ArrayList<>();
|
||||
ArrayList<MatParamOverride> localOverridesList = ic.readSavableArrayList("overrides", null);
|
||||
if (localOverridesList == null) {
|
||||
localOverrides = new SafeArrayList<>(MatParamOverride.class);
|
||||
} else {
|
||||
localOverrides = new SafeArrayList(MatParamOverride.class, localOverridesList);
|
||||
}
|
||||
worldOverrides = new ArrayList<>();
|
||||
worldOverrides = new SafeArrayList<>(MatParamOverride.class);
|
||||
|
||||
//changed for backward compatibility with j3o files generated before the AnimControl/SkeletonControl split
|
||||
//the AnimControl creates the SkeletonControl for old files and add it to the spatial.
|
||||
|
@ -258,7 +258,7 @@ public class SafeArrayList<E> implements List<E>, Cloneable {
|
||||
if( o1 == null || !o1.equals(o2) )
|
||||
return false;
|
||||
}
|
||||
return !(i1.hasNext() || !i2.hasNext());
|
||||
return !(i1.hasNext() || i2.hasNext());
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user