Adding the MeshContext that will help with mesh modifications in a future.

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8251 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
Kae..pl 14 years ago
parent 2b8ec329ab
commit ec4486d5eb
  1. 32
      engine/src/blender/com/jme3/scene/plugins/blender/BlenderContext.java
  2. 106
      engine/src/blender/com/jme3/scene/plugins/blender/meshes/MeshContext.java
  3. 29
      engine/src/blender/com/jme3/scene/plugins/blender/meshes/MeshHelper.java
  4. 9
      engine/src/blender/com/jme3/scene/plugins/blender/modifiers/ArmatureModifier.java
  5. 1
      engine/src/blender/com/jme3/scene/plugins/blender/modifiers/Modifier.java
  6. 5
      engine/src/blender/com/jme3/scene/plugins/blender/textures/UVCoordinatesGenerator.java

@ -49,7 +49,7 @@ import com.jme3.scene.plugins.blender.file.DnaBlockData;
import com.jme3.scene.plugins.blender.file.FileBlockHeader;
import com.jme3.scene.plugins.blender.file.Structure;
import com.jme3.scene.plugins.blender.materials.MaterialContext;
import com.jme3.scene.plugins.blender.meshes.MeshHelper.VertexData;
import com.jme3.scene.plugins.blender.meshes.MeshContext;
import com.jme3.scene.plugins.blender.modifiers.Modifier;
/**
@ -90,8 +90,8 @@ public class BlenderContext {
protected Map<Long, List<Modifier>> modifiers = new HashMap<Long, List<Modifier>>();
/** A list of constraints for the specified object. */
protected Map<Long, List<Constraint>> constraints = new HashMap<Long, List<Constraint>>();
/** Vertex data for a mesh specified by OMA. */
protected Map<Long, VertexData> vertexData = new HashMap<Long, VertexData>();
/** A map of mesh contexts. */
protected Map<Long, MeshContext> meshContexts = new HashMap<Long, MeshContext>();
/** A map of material contexts. */
protected Map<Material, MaterialContext> materialContexts = new HashMap<Material, MaterialContext>();
/** A map og helpers that perform loading. */
@ -402,26 +402,26 @@ public class BlenderContext {
}
/**
* This method sets the vertex data for the specified mesh. Attention!!! If
* vertex data is already set it will be overwritten.
* This method sets the mesh context for the given mesh old memory address.
* If the context is already set it will be replaced.
* @param meshOMA
* old memeory address of mesh
* @param vertexData
* mesh's vertex data
* the mesh's old memory address
* @param meshContext
* the mesh's context
*/
public void setVertexData(Long meshOMA, VertexData vertexData) {
this.vertexData.put(meshOMA, vertexData);
public void setMeshContext(Long meshOMA, MeshContext meshContext) {
this.meshContexts.put(meshOMA, meshContext);
}
/**
* This method returns vertex data for a mesh with the specified old memory
* address. If no data is registered then null is returned.
* This method returns the mesh context for the given mesh old memory address.
* If no context exists then <b>null</b> is returned.
* @param meshOMA
* old memeory address of mesh
* @return mesh's vertex data
* the mesh's old memory address
* @return mesh's context
*/
public VertexData getVertexData(Long meshOMA) {
return vertexData.get(meshOMA);
public MeshContext getMeshContext(Long meshOMA) {
return this.meshContexts.get(meshOMA);
}
/**

@ -0,0 +1,106 @@
package com.jme3.scene.plugins.blender.meshes;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.VertexBuffer;
/**
* Class that holds information about the mesh.
*
* @author Marcin Roguski (Kaelthas)
*/
public class MeshContext {
/** The mesh stored here as a list of geometries. */
private List<Geometry> mesh;
/** Vertex list that is referenced by all the geometries. */
private List<Vector3f> vertexList;
/** The vertex reference map. */
private Map<Integer, List<Integer>> vertexReferenceMap;
/** The UV-coordinates for each of the geometries. */
private Map<Geometry, VertexBuffer> uvCoordinates = new HashMap<Geometry, VertexBuffer>();
/**
* This method returns the referenced mesh.
*
* @return the referenced mesh
*/
public List<Geometry> getMesh() {
return mesh;
}
/**
* This method sets the referenced mesh.
*
* @param mesh
* the referenced mesh
*/
public void setMesh(List<Geometry> mesh) {
this.mesh = mesh;
}
/**
* This method returns the vertex list.
*
* @return the vertex list
*/
public List<Vector3f> getVertexList() {
return vertexList;
}
/**
* This method sets the vertex list.
*
* @param vertexList
* the vertex list
*/
public void setVertexList(List<Vector3f> vertexList) {
this.vertexList = vertexList;
}
/**
* This method returns the vertex reference map.
*
* @return the vertex reference map
*/
public Map<Integer, List<Integer>> getVertexReferenceMap() {
return vertexReferenceMap;
}
/**
* This method sets the vertex reference map.
*
* @param vertexReferenceMap
* the vertex reference map
*/
public void setVertexReferenceMap(
Map<Integer, List<Integer>> vertexReferenceMap) {
this.vertexReferenceMap = vertexReferenceMap;
}
/**
* This method adds the mesh's UV-coordinates.
*
* @param geometry
* the mesh that has the UV-coordinates
* @param vertexBuffer
* the mesh's UV-coordinates
*/
public void addUVCoordinates(Geometry geometry, VertexBuffer vertexBuffer) {
uvCoordinates.put(geometry, vertexBuffer);
}
/**
* This method returns the mesh's UV-coordinates.
*
* @param geometry
* the mesh
* @return the mesh's UV-coordinates
*/
public VertexBuffer getUVCoordinates(Geometry geometry) {
return uvCoordinates.get(geometry);
}
}

@ -108,6 +108,7 @@ public class MeshHelper extends AbstractBlenderHelper {
// reading mesh data
String name = structure.getName();
MeshContext meshContext = new MeshContext();
// reading vertices
Vector3f[] vertices = this.getVertices(structure, blenderContext);
@ -243,7 +244,8 @@ public class MeshHelper extends AbstractBlenderHelper {
}
}
}
blenderContext.setVertexData(structure.getOldMemoryAddress(), new VertexData(vertexList, vertexReferenceMap));
meshContext.setVertexList(vertexList);
meshContext.setVertexReferenceMap(vertexReferenceMap);
Vector3f[] normals = normalList.toArray(new Vector3f[normalList.size()]);
@ -383,14 +385,19 @@ public class MeshHelper extends AbstractBlenderHelper {
for(Entry<Material, List<Geometry>> entry : materialMap.entrySet()) {
MaterialContext materialContext = blenderContext.getMaterialContext(entry.getKey());
if(materialContext != null && materialContext.getTexturesCount()>0) {
UVCoordinatesGenerator.generateUVCoordinates(materialContext.getUvCoordinatesType(),
VertexBuffer coords = UVCoordinatesGenerator.generateUVCoordinates(materialContext.getUvCoordinatesType(),
materialContext.getProjectionType(), materialContext.getTextureDimension(),
materialContext.getProjection(0), entry.getValue());
//setting the coordinates inside the mesh context
for(Geometry geometry : entry.getValue()) {
meshContext.addUVCoordinates(geometry, coords);
}
}
}
}
blenderContext.addLoadedFeatures(structure.getOldMemoryAddress(), structure.getName(), structure, geometries);
blenderContext.setMeshContext(structure.getOldMemoryAddress(), meshContext);
return geometries;
}
@ -499,22 +506,4 @@ public class MeshHelper extends AbstractBlenderHelper {
public boolean shouldBeLoaded(Structure structure, BlenderContext blenderContext) {
return true;
}
public static class VertexData {
private List<Vector3f> vertexList;
private Map<Integer, List<Integer>> vertexReferenceMap;
public VertexData(List<Vector3f> vertexList, Map<Integer, List<Integer>> vertexReferenceMap) {
this.vertexList = vertexList;
this.vertexReferenceMap = vertexReferenceMap;
}
public List<Vector3f> getVertexList() {
return vertexList;
}
public Map<Integer, List<Integer>> getVertexReferenceMap() {
return vertexReferenceMap;
}
}
}

@ -33,7 +33,7 @@ import com.jme3.scene.plugins.blender.exceptions.BlenderFileException;
import com.jme3.scene.plugins.blender.file.FileBlockHeader;
import com.jme3.scene.plugins.blender.file.Pointer;
import com.jme3.scene.plugins.blender.file.Structure;
import com.jme3.scene.plugins.blender.meshes.MeshHelper.VertexData;
import com.jme3.scene.plugins.blender.meshes.MeshContext;
import com.jme3.scene.plugins.blender.objects.ObjectHelper;
import com.jme3.scene.plugins.ogre.AnimData;
import com.jme3.util.BufferUtils;
@ -198,11 +198,10 @@ import com.jme3.util.BufferUtils;
Map<Integer, Integer> groupToBoneIndexMap = armatureHelper.getGroupToBoneIndexMap(defBase, blenderContext);
int[] bonesGroups = new int[] { 0 };
MeshContext meshContext = blenderContext.getMeshContext(meshStructure.getOldMemoryAddress());
VertexData vertexData = blenderContext.getVertexData(meshStructure.getOldMemoryAddress());
VertexBuffer[] boneWeightsAndIndex = this.getBoneWeightAndIndexBuffer(meshStructure, vertexData.getVertexList().size(), bonesGroups,
vertexData.getVertexReferenceMap(), groupToBoneIndexMap, blenderContext);
VertexBuffer[] boneWeightsAndIndex = this.getBoneWeightAndIndexBuffer(meshStructure, meshContext.getVertexList().size(), bonesGroups,
meshContext.getVertexReferenceMap(), groupToBoneIndexMap, blenderContext);
this.verticesWeights = boneWeightsAndIndex[0];
this.verticesWeightsIndices = boneWeightsAndIndex[1];
this.boneGroups = bonesGroups[0];

@ -19,6 +19,7 @@ public abstract class Modifier {
public static final String ARMATURE_MODIFIER_DATA = "ArmatureModifierData";
public static final String PARTICLE_MODIFIER_DATA = "ParticleSystemModifierData";
public static final String MIRROR_MODIFIER_DATA = "MirrorModifierData";
public static final String SUBSURF_MODIFIER_DATA = "SubsurfModifierData";
public static final String OBJECT_ANIMATION_MODIFIER_DATA = "ObjectAnimationModifierData";
/** This variable indicates if the modifier is invalid (<b>true</b>) or not (<b>false</b>). */

@ -94,8 +94,9 @@ public class UVCoordinatesGenerator {
* an array that tells how UV-coordinates need to be swapped
* @param geometries
* a list of geometries the UV coordinates will be applied to
* @return created UV-coordinates buffer
*/
public static void generateUVCoordinates(int texco, int projection, int textureDimension, int[] coordinatesSwappingIndexes, List<Geometry> geometries) {
public static VertexBuffer generateUVCoordinates(int texco, int projection, int textureDimension, int[] coordinatesSwappingIndexes, List<Geometry> geometries) {
if (textureDimension != 2 && textureDimension != 3) {
throw new IllegalStateException("Unsupported texture dimension: " + textureDimension);
}
@ -189,6 +190,8 @@ public class UVCoordinatesGenerator {
mesh.clearBuffer(VertexBuffer.Type.TexCoord);// in case there are coordinates already set
mesh.setBuffer(result);
}
return result;
}
/**

Loading…
Cancel
Save