OSDN Git Service

Blender Loader
authorshadowislord <shadowislord@75d07b2b-3a1a-0410-a2c5-0572b91ccdca>
Sat, 13 Aug 2011 19:01:52 +0000 (19:01 +0000)
committershadowislord <shadowislord@75d07b2b-3a1a-0410-a2c5-0572b91ccdca>
Sat, 13 Aug 2011 19:01:52 +0000 (19:01 +0000)
 * Enable mipmaps for packed and generated textures
 * Better handling of material flags for 2.58
 * Allow loading of meshes with no vertices instead of crashing

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

engine/src/blender/com/jme3/scene/plugins/blender/materials/MaterialHelper.java
engine/src/blender/com/jme3/scene/plugins/blender/meshes/MeshHelper.java
engine/src/blender/com/jme3/scene/plugins/blender/objects/ObjectHelper.java
engine/src/blender/com/jme3/scene/plugins/blender/textures/TextureHelper.java

index aad4aeb..42e9674 100644 (file)
@@ -190,32 +190,40 @@ public class MaterialHelper extends AbstractBlenderHelper {
 \r
                int mode = ((Number) structure.getFieldValue("mode")).intValue();\r
                boolean shadeless = (mode & 0x4) != 0;\r
-               boolean vertexColor = (mode & 0x16) != 0;\r
-               boolean transparent = (mode & 0x64) != 0;\r
-\r
+               boolean vertexColor = (mode & 0x80) != 0;\r
+               boolean transparent = (mode & 0x10000) != 0;\r
+                boolean vtangent = (mode & 0x4000000) != 0; // NOTE: Requires tangents\r
+                \r
                if (shadeless) {\r
                        result = new Material(dataRepository.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");\r
                } else {\r
                        result = new Material(dataRepository.getAssetManager(), "Common/MatDefs/Light/Lighting.j3md");\r
                }\r
 \r
+                //System.out.println("Mode: \n" +\r
+                //                   "Shadeless: " + shadeless + "\n" +\r
+                //                   "VColor: " + vertexColor + "\n" +\r
+                //                   "ZTrans: " + transparent + "\n" + \r
+                //                   "VTangent: " + vtangent);\r
+                \r
                result.getAdditionalRenderState().setFaceCullMode(faceCullMode);\r
 \r
                if (transparent) {\r
-            result.setTransparent(true);\r
+                        result.setTransparent(true);\r
                        result.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);\r
-               }\r
+                }\r
 \r
                String name = structure.getName();\r
                LOGGER.log(Level.INFO, "Material's name: {0}", name);\r
                if (vertexColor) {\r
                        result.setBoolean(shadeless ? "VertexColor" : "UseVertexColor", true);\r
                }\r
-\r
+                \r
                MaterialHelper materialHelper = dataRepository.getHelper(MaterialHelper.class);\r
                ColorRGBA diffuseColor = null;\r
                if (shadeless) {\r
                        // color of shadeless? doesn't seem to work in blender ..\r
+                        diffuseColor = ColorRGBA.White.clone();\r
                } else {\r
                        result.setBoolean("UseMaterialColors", Boolean.TRUE);\r
 \r
@@ -223,6 +231,9 @@ public class MaterialHelper extends AbstractBlenderHelper {
                        DiffuseShader diffuseShader = materialHelper.getDiffuseShader(structure);\r
                        result.setBoolean("Minnaert", diffuseShader == DiffuseShader.MINNAERT);\r
                        diffuseColor = materialHelper.getDiffuseColor(structure, diffuseShader);\r
+                        if (!transparent){\r
+                            diffuseColor.a = 1;\r
+                        }\r
                        result.setColor("Diffuse", diffuseColor);\r
 \r
                        SpecularShader specularShader = materialHelper.getSpecularShader(structure);\r
@@ -231,6 +242,8 @@ public class MaterialHelper extends AbstractBlenderHelper {
 \r
                        result.setColor("Ambient", materialHelper.getAmbientColor(structure));\r
                        result.setFloat("Shininess", materialHelper.getShininess(structure));\r
+                        \r
+                        \r
                }\r
 \r
                // texture\r
@@ -262,40 +275,43 @@ public class MaterialHelper extends AbstractBlenderHelper {
                                                                if ((mapto & 0x01) != 0) {// Col\r
                                     // Map to COLOR channel or DIFFUSE\r
                                     // Set diffuse to white so it doesn't get multiplied by texture\r
-                                    result.setColor("Diffuse", ColorRGBA.White);\r
+                                    diffuseColor.r = diffuseColor.g = diffuseColor.b = 1.0f;\r
+                                    result.setColor(shadeless ? "Color" : "Diffuse", diffuseColor);\r
                                                                        //result.setBoolean("UseMaterialColors", Boolean.FALSE);\r
                                                                        // blending the texture with material color and texture's defined color\r
                                                                        int blendType = ((Number) textureLink.getFieldValue("blendtype")).intValue();\r
                                                                        float[] color = new float[] { ((Number) textureLink.getFieldValue("r")).floatValue(), ((Number) textureLink.getFieldValue("g")).floatValue(), ((Number) textureLink.getFieldValue("b")).floatValue() };\r
                                                                        float colfac = ((Number) textureLink.getFieldValue("colfac")).floatValue();\r
                                                                        texture = textureHelper.blendTexture(diffuseColor.getColorArray(), texture, color, colfac, blendType, negateTexture, dataRepository);\r
-                                                                       texture.setWrap(WrapMode.Repeat);\r
+                                                                        texture.setMinFilter(MinFilter.Trilinear);\r
+                                                                        texture.setWrap(WrapMode.Repeat);\r
                                                                        if (shadeless) {\r
                                                                                result.setTexture(TEXTURE_TYPE_COLOR, texture);\r
                                                                        } else {\r
                                                                                result.setTexture(TEXTURE_TYPE_DIFFUSE, texture);\r
                                                                        }\r
                                                                }\r
-                                                               if ((mapto & 0x02) != 0) {// Nor\r
+                                                               if ((mapto & 0x02) != 0 && !shadeless) {// Nor\r
                                                                        Texture normalMapTexture;\r
                                                                        if(texture.getKey() instanceof GeneratedTextureKey) {\r
                                                                                normalMapTexture = textureHelper.convertToNormalMapTexture(texture, ((Number)textureLink.getFieldValue("norfac")).floatValue());\r
-                                                                       } else {\r
+                                                                                normalMapTexture.setMinFilter(MinFilter.Trilinear);\r
+                                                                        } else {\r
                                                                                normalMapTexture = texture;\r
                                                                        }\r
-                                                                       result.setTexture(TEXTURE_TYPE_NORMAL, normalMapTexture);\r
+                                                                        result.setTexture(TEXTURE_TYPE_NORMAL, normalMapTexture);\r
                                                                        if (vertexColor) {\r
                                                                                result.setBoolean(shadeless ? "VertexColor" : "UseVertexColor", false);\r
                                                                        }\r
                                                                }\r
-                                                               if ((mapto & 0x04) != 0) {// Spec\r
+                                                               if ((mapto & 0x04) != 0 && !shadeless) {// Spec\r
                                     // Map to SPECULAR \r
                                                                        result.setTexture(TEXTURE_TYPE_SPECULAR, texture);\r
                                                                }\r
                                                                if ((mapto & 0x40) != 0) {// Emit\r
                                                                        result.setTexture(TEXTURE_TYPE_GLOW, texture);\r
                                                                }\r
-                                                               if ((mapto & 0x80) != 0) {// Alpha\r
+                                                               if ((mapto & 0x80) != 0 && !shadeless) {// Alpha\r
                                                                        result.setTexture(TEXTURE_TYPE_ALPHA, texture);\r
                                                                }\r
                                                        } else {\r
index 46ce3dd..317e44e 100644 (file)
@@ -127,7 +127,10 @@ public class MeshHelper extends AbstractBlenderHelper {
                // the following map sorts faces by material number (because in jme Mesh can have only one material)\r
                Map<Integer, List<Integer>> meshesMap = new HashMap<Integer, List<Integer>>();\r
                Pointer pMFace = (Pointer) structure.getFieldValue("mface");\r
-               List<Structure> mFaces = pMFace.fetchData(dataRepository.getInputStream());\r
+                List<Structure> mFaces = null;\r
+                if (pMFace.isNotNull()){\r
+                    mFaces = pMFace.fetchData(dataRepository.getInputStream());\r
+                }\r
 \r
                Pointer pMTFace = (Pointer) structure.getFieldValue("mtface");\r
                List<Vector2f> uvCoordinates = null;\r
@@ -153,6 +156,9 @@ public class MeshHelper extends AbstractBlenderHelper {
                // positions (it simply tells which vertex is referenced where in the result list)\r
                Map<Integer, List<Integer>> vertexReferenceMap = new HashMap<Integer, List<Integer>>(verticesAmount);\r
                int vertexColorIndex = 0;\r
+                if (mFaces == null){\r
+                    return null;\r
+                }\r
                for (int i = 0; i < mFaces.size(); ++i) {\r
                        Structure mFace = mFaces.get(i);\r
                        boolean smooth = (((Number) mFace.getFieldValue("flag")).byteValue() & 0x01) != 0x00;\r
@@ -544,6 +550,9 @@ public class MeshHelper extends AbstractBlenderHelper {
        public Vector3f[] getVertices(Structure meshStructure, DataRepository dataRepository) throws BlenderFileException {\r
                int verticesAmount = ((Number) meshStructure.getFieldValue("totvert")).intValue();\r
                Vector3f[] vertices = new Vector3f[verticesAmount];\r
+                if (verticesAmount == 0)\r
+                    return vertices;\r
+                \r
                Pointer pMVert = (Pointer) meshStructure.getFieldValue("mvert");\r
                List<Structure> mVerts = pMVert.fetchData(dataRepository.getInputStream());\r
                for (int i = 0; i < verticesAmount; ++i) {\r
index 5d9f916..4baa7a3 100644 (file)
@@ -184,9 +184,11 @@ public class ObjectHelper extends AbstractBlenderHelper {
                                        Pointer pMesh = (Pointer)objectStructure.getFieldValue("data");\r
                                        List<Structure> meshesArray = pMesh.fetchData(dataRepository.getInputStream());\r
                                        List<Geometry> geometries = meshHelper.toMesh(meshesArray.get(0), dataRepository);\r
-                                       for(Geometry geometry : geometries) {\r
-                                               node.attachChild(geometry);\r
-                                       }\r
+                                       if (geometries != null){\r
+                                            for(Geometry geometry : geometries) {\r
+                                                    node.attachChild(geometry);\r
+                                            }\r
+                                        }\r
                                        node.setLocalTransform(t);\r
 \r
                                        //reading and applying all modifiers\r
index 5452772..94d65de 100644 (file)
@@ -935,12 +935,12 @@ public class TextureHelper extends AbstractBlenderHelper {
                                name = name.substring(1);\r
                        }\r
 \r
-                       TextureKey texKey = new TextureKey(name, false);\r
+                       TextureKey texKey = new TextureKey(name, true);\r
                        try {\r
                                Texture tex = dataRepository.getAssetManager().loadTexture(texKey);\r
                                image = tex.getImage();\r
                        } catch (AssetNotFoundException e) {\r
-                               LOGGER.warning("Asset not found: " + e.getLocalizedMessage());\r
+                               LOGGER.log(Level.WARNING, "Asset not found: {0}", e.getLocalizedMessage());\r
                        }\r
                }\r
 \r