• R/O
  • HTTP
  • SSH
  • HTTPS

提交

標籤
無標籤

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Main repository of MikuMikuStudio


Commit MetaInfo

修訂0e2be6420286117fe8d45c5f8392048dcc8d32e4 (tree)
時間2013-05-01 06:44:05
作者Kaelthas_Spellsinger@o2.pl <Kaelthas_Spellsinger@o2.p...>
CommiterKaelthas_Spellsinger@o2.pl

Log Message

Refactoring: storing importer custom data in blender context instead of loaded features. This way there will be no conflict between the custom data names and user's properties names and no unwanted additional data will be stored in the result features.

git-svn-id: http://jmonkeyengine.googlecode.com/svn/trunk@10587 75d07b2b-3a1a-0410-a2c5-0572b91ccdca

Change Summary

差異

--- a/engine/src/blender/com/jme3/scene/plugins/blender/BlenderContext.java
+++ b/engine/src/blender/com/jme3/scene/plugins/blender/BlenderContext.java
@@ -114,7 +114,9 @@ public class BlenderContext {
114114 protected Map<Long, BoneContext> boneContexts = new HashMap<Long, BoneContext>();
115115 /** A map og helpers that perform loading. */
116116 private Map<String, AbstractBlenderHelper> helpers = new HashMap<String, AbstractBlenderHelper>();
117-
117+ /** Markers used by loading classes to store some custom data. This is made to avoid putting this data into user properties. */
118+ private Map<String, Map<Object, Object>> markers = new HashMap<String, Map<Object,Object>>();
119+
118120 /**
119121 * This method sets the blender file version.
120122 *
@@ -562,6 +564,44 @@ public class BlenderContext {
562564 }
563565 return blenderKey.getDefaultMaterial();
564566 }
567+
568+ /**
569+ * Adds a custom marker for scene's feature.
570+ *
571+ * @param marker
572+ * the marker name
573+ * @param feature
574+ * te scene's feature (can be node, material or texture or
575+ * anything else)
576+ * @param markerValue
577+ * the marker value
578+ */
579+ public void addMarker(String marker, Object feature, Object markerValue) {
580+ if (markerValue == null) {
581+ throw new IllegalArgumentException("The marker's value cannot be null.");
582+ }
583+ Map<Object, Object> markersMap = markers.get(marker);
584+ if (markersMap == null) {
585+ markersMap = new HashMap<Object, Object>();
586+ markers.put(marker, markersMap);
587+ }
588+ markersMap.put(feature, markerValue);
589+ }
590+
591+ /**
592+ * Returns the marker value. The returned value is null if no marker was
593+ * defined for the given feature.
594+ *
595+ * @param marker
596+ * the marker name
597+ * @param feature
598+ * the scene's feature
599+ * @return marker value or null if it was not defined
600+ */
601+ public Object getMarkerValue(String marker, Object feature) {
602+ Map<Object, Object> markersMap = markers.get(marker);
603+ return markersMap == null ? null : markersMap.get(feature);
604+ }
565605
566606 /**
567607 * Clears all sotred resources and closes the blender input stream.
@@ -580,6 +620,7 @@ public class BlenderContext {
580620 helpers.clear();
581621 fileBlockHeadersByOma.clear();
582622 fileBlockHeadersByCode.clear();
623+ markers.clear();
583624 }
584625
585626 /**
--- a/engine/src/blender/com/jme3/scene/plugins/blender/constraints/BoneConstraint.java
+++ b/engine/src/blender/com/jme3/scene/plugins/blender/constraints/BoneConstraint.java
@@ -51,7 +51,7 @@ import com.jme3.scene.plugins.blender.file.Structure;
5151 }
5252 // the second part of the if expression verifies if the found node
5353 // (if any) is an armature node
54- if (nodeTarget.getUserData(ArmatureHelper.ARMATURE_NODE_MARKER) != null) {
54+ if (blenderContext.getMarkerValue(ArmatureHelper.ARMATURE_NODE_MARKER, nodeTarget) != null) {
5555 if(subtargetName.trim().isEmpty()) {
5656 LOGGER.log(Level.WARNING, "No bone target specified for constraint: {0}.", name);
5757 return false;
--- a/engine/src/blender/com/jme3/scene/plugins/blender/constraints/ConstraintHelper.java
+++ b/engine/src/blender/com/jme3/scene/plugins/blender/constraints/ConstraintHelper.java
@@ -25,6 +25,7 @@ import com.jme3.scene.plugins.blender.animations.IpoHelper;
2525 import com.jme3.scene.plugins.blender.exceptions.BlenderFileException;
2626 import com.jme3.scene.plugins.blender.file.Pointer;
2727 import com.jme3.scene.plugins.blender.file.Structure;
28+import com.jme3.scene.plugins.blender.objects.ObjectHelper;
2829
2930 /**
3031 * This class should be used for constraint calculations.
@@ -195,7 +196,7 @@ public class ConstraintHelper extends AbstractBlenderHelper {
195196 while (spatial.getParent() != null) {
196197 spatial = spatial.getParent();
197198 }
198- simulationRootNodes.add(new SimulationNode((Long) spatial.getUserData("oma"), blenderContext));
199+ simulationRootNodes.add(new SimulationNode((Long) blenderContext.getMarkerValue(ObjectHelper.OMA_MARKER, spatial), blenderContext));
199200 } else {
200201 throw new IllegalStateException("Unsupported constraint type: " + constraint);
201202 }
@@ -220,7 +221,7 @@ public class ConstraintHelper extends AbstractBlenderHelper {
220221 */
221222 public Transform getTransform(Long oma, String subtargetName, Space space) {
222223 Spatial feature = (Spatial) blenderContext.getLoadedFeature(oma, LoadedFeatureDataType.LOADED_FEATURE);
223- boolean isArmature = feature.getUserData(ArmatureHelper.ARMATURE_NODE_MARKER) != null;
224+ boolean isArmature = blenderContext.getMarkerValue(ArmatureHelper.ARMATURE_NODE_MARKER, feature) != null;
224225 if (isArmature) {
225226 BoneContext targetBoneContext = blenderContext.getBoneByName(subtargetName);
226227 Bone bone = targetBoneContext.getBone();
@@ -269,9 +270,9 @@ public class ConstraintHelper extends AbstractBlenderHelper {
269270 } else {
270271 switch (space) {
271272 case CONSTRAINT_SPACE_LOCAL:
272- return ((Spatial) feature).getLocalTransform();
273+ return feature.getLocalTransform();
273274 case CONSTRAINT_SPACE_WORLD:
274- return ((Spatial) feature).getWorldTransform();
275+ return feature.getWorldTransform();
275276 case CONSTRAINT_SPACE_PARLOCAL:
276277 case CONSTRAINT_SPACE_POSE:
277278 throw new IllegalStateException("Nodes can have only Local and World spaces applied!");
@@ -297,7 +298,7 @@ public class ConstraintHelper extends AbstractBlenderHelper {
297298 */
298299 public void applyTransform(Long oma, String subtargetName, Space space, Transform transform) {
299300 Spatial feature = (Spatial) blenderContext.getLoadedFeature(oma, LoadedFeatureDataType.LOADED_FEATURE);
300- boolean isArmature = feature.getUserData(ArmatureHelper.ARMATURE_NODE_MARKER) != null;
301+ boolean isArmature = blenderContext.getMarkerValue(ArmatureHelper.ARMATURE_NODE_MARKER, feature) != null;
301302 if (isArmature) {
302303 Skeleton skeleton = blenderContext.getSkeleton(oma);
303304 BoneContext targetBoneContext = blenderContext.getBoneByName(subtargetName);
@@ -354,17 +355,16 @@ public class ConstraintHelper extends AbstractBlenderHelper {
354355 default:
355356 throw new IllegalStateException("Invalid space type for target object: " + space.toString());
356357 }
357- } else if (feature instanceof Spatial) {
358- Spatial spatial = (Spatial) feature;
358+ } else {
359359 switch (space) {
360360 case CONSTRAINT_SPACE_LOCAL:
361- spatial.getLocalTransform().set(transform);
361+ feature.getLocalTransform().set(transform);
362362 break;
363363 case CONSTRAINT_SPACE_WORLD:
364- if (spatial.getParent() == null) {
365- spatial.setLocalTransform(transform);
364+ if (feature.getParent() == null) {
365+ feature.setLocalTransform(transform);
366366 } else {
367- Transform parentWorldTransform = spatial.getParent().getWorldTransform();
367+ Transform parentWorldTransform = feature.getParent().getWorldTransform();
368368
369369 Matrix4f parentMatrix = this.toMatrix(parentWorldTransform).invertLocal();
370370 Matrix4f m = this.toMatrix(transform);
@@ -374,14 +374,12 @@ public class ConstraintHelper extends AbstractBlenderHelper {
374374 transform.setRotation(m.toRotationQuat());
375375 transform.setScale(m.toScaleVector());
376376
377- spatial.setLocalTransform(transform);
377+ feature.setLocalTransform(transform);
378378 }
379379 break;
380380 default:
381381 throw new IllegalStateException("Invalid space type for spatial object: " + space.toString());
382382 }
383- } else {
384- throw new IllegalStateException("Constrained transformation can be applied only to Bone or Spatial feature!");
385383 }
386384 }
387385
--- a/engine/src/blender/com/jme3/scene/plugins/blender/constraints/SimulationNode.java
+++ b/engine/src/blender/com/jme3/scene/plugins/blender/constraints/SimulationNode.java
@@ -25,6 +25,7 @@ import com.jme3.scene.plugins.blender.BlenderContext;
2525 import com.jme3.scene.plugins.blender.BlenderContext.LoadedFeatureDataType;
2626 import com.jme3.scene.plugins.blender.animations.ArmatureHelper;
2727 import com.jme3.scene.plugins.blender.animations.BoneContext;
28+import com.jme3.scene.plugins.blender.objects.ObjectHelper;
2829 import com.jme3.util.TempVars;
2930
3031 /**
@@ -89,7 +90,7 @@ public class SimulationNode {
8990 */
9091 private SimulationNode(Long featureOMA, BlenderContext blenderContext, boolean rootNode) {
9192 Node spatial = (Node) blenderContext.getLoadedFeature(featureOMA, LoadedFeatureDataType.LOADED_FEATURE);
92- if (spatial.getUserData(ArmatureHelper.ARMATURE_NODE_MARKER) != null) {
93+ if (blenderContext.getMarkerValue(ArmatureHelper.ARMATURE_NODE_MARKER, spatial) != null) {
9394 this.skeleton = blenderContext.getSkeleton(featureOMA);
9495
9596 Node nodeWithAnimationControl = blenderContext.getControlledNode(skeleton);
@@ -135,7 +136,7 @@ public class SimulationNode {
135136 animations = blenderContext.getAnimData(featureOMA) == null ? null : blenderContext.getAnimData(featureOMA).anims;
136137 for (Spatial child : spatial.getChildren()) {
137138 if (child instanceof Node) {
138- children.add(new SimulationNode((Long) child.getUserData("oma"), blenderContext, false));
139+ children.add(new SimulationNode((Long) blenderContext.getMarkerValue(ObjectHelper.OMA_MARKER, child), blenderContext, false));
139140 }
140141 }
141142 }
@@ -199,7 +200,7 @@ public class SimulationNode {
199200 boolean applyStaticConstraints = true;
200201 if (animations != null) {
201202 for (Animation animation : animations) {
202- float[] animationTimeBoundaries = computeAnimationTimeBoundaries(animation);
203+ float[] animationTimeBoundaries = this.computeAnimationTimeBoundaries(animation);
203204 int maxFrame = (int) animationTimeBoundaries[0];
204205 float maxTime = animationTimeBoundaries[1];
205206
--- a/engine/src/blender/com/jme3/scene/plugins/blender/objects/ObjectHelper.java
+++ b/engine/src/blender/com/jme3/scene/plugins/blender/objects/ObjectHelper.java
@@ -83,6 +83,8 @@ public class ObjectHelper extends AbstractBlenderHelper {
8383 protected static final int OBJECT_TYPE_WAVE = 21;
8484 protected static final int OBJECT_TYPE_LATTICE = 22;
8585 protected static final int OBJECT_TYPE_ARMATURE = 25;
86+
87+ public static final String OMA_MARKER = "oma";
8688
8789 /**
8890 * This constructor parses the given blender version and stores the result.
@@ -214,7 +216,7 @@ public class ObjectHelper extends AbstractBlenderHelper {
214216 // parent-children relationships between nodes
215217 Node armature = new Node(name);
216218 armature.setLocalTransform(t);
217- armature.setUserData(ArmatureHelper.ARMATURE_NODE_MARKER, Boolean.TRUE);
219+ blenderContext.addMarker(ArmatureHelper.ARMATURE_NODE_MARKER, armature, Boolean.TRUE);
218220
219221 if (parent instanceof Node) {
220222 ((Node) parent).attachChild(armature);
@@ -233,9 +235,7 @@ public class ObjectHelper extends AbstractBlenderHelper {
233235 result.updateModelBound();
234236
235237 blenderContext.addLoadedFeatures(objectStructure.getOldMemoryAddress(), name, objectStructure, result);
236- // TODO: this data is only to help during loading, shall I remove it
237- // after all the loading is done ???
238- result.setUserData("oma", objectStructure.getOldMemoryAddress());
238+ blenderContext.addMarker(OMA_MARKER, result, objectStructure.getOldMemoryAddress());
239239
240240 // applying modifiers
241241 LOGGER.log(Level.FINE, "Reading and applying object's modifiers.");