[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34100] trunk/blender/release/scripts/op/ io_scene_x3d/export_x3d.py: bugfix [#25393] Export to X3D does not provide color field in indexedFaceSet for colored cube

Campbell Barton ideasman42 at gmail.com
Wed Jan 5 15:57:57 CET 2011


Revision: 34100
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=34100
Author:   campbellbarton
Date:     2011-01-05 15:57:57 +0100 (Wed, 05 Jan 2011)

Log Message:
-----------
bugfix [#25393] Export to X3D does not provide color field in indexedFaceSet for colored cube

mostly rewrote mesh export and added support for multiple materials/images, using texface or material images depending on the materials TexFace option.

Modified Paths:
--------------
    trunk/blender/release/scripts/op/io_scene_x3d/export_x3d.py

Modified: trunk/blender/release/scripts/op/io_scene_x3d/export_x3d.py
===================================================================
--- trunk/blender/release/scripts/op/io_scene_x3d/export_x3d.py	2011-01-05 14:56:10 UTC (rev 34099)
+++ trunk/blender/release/scripts/op/io_scene_x3d/export_x3d.py	2011-01-05 14:57:57 UTC (rev 34100)
@@ -277,8 +277,7 @@
                 return "%s" % (newname)
 
     def writeIndexedFaceSet(self, ob, mesh, mtx, world, EXPORT_TRI=False):
-        # imageMap = {}  # set of used images
-        sided = {}  # 'one':cnt , 'two':cnt
+        fw = self.file.write
         mesh_name_x3d = self.cleanStr(ob.name)
 
         if not mesh.faces:
@@ -319,10 +318,10 @@
         loc, quat, sca = mtx.decompose()
 
         self.write_indented("<Transform DEF=\"%s\" " % mesh_name_x3d, 1)
-        self.file.write("translation=\"%.6f %.6f %.6f\" " % loc[:])
-        self.file.write("scale=\"%.6f %.6f %.6f\" " % sca[:])
-        self.file.write("rotation=\"%.6f %.6f %.6f %.6f\" " % (quat.axis[:] + (quat.angle, )))
-        self.file.write(">\n")
+        fw("translation=\"%.6f %.6f %.6f\" " % loc[:])
+        fw("scale=\"%.6f %.6f %.6f\" " % sca[:])
+        fw("rotation=\"%.6f %.6f %.6f %.6f\" " % (quat.axis[:] + (quat.angle, )))
+        fw(">\n")
 
         if mesh.tag:
             self.write_indented("<Group USE=\"G_%s\" />\n" % mesh_name_x3d, 1)
@@ -331,99 +330,173 @@
 
             self.write_indented("<Group DEF=\"G_%s\">\n" % mesh_name_x3d, 1)
 
-            self.write_indented("<Shape>\n", 1)
-            is_smooth = False
+            is_uv = bool(mesh.uv_textures.active)
+            # is_col, defined for each material
 
-            # XXX, lame, only exports first material.
-            mat_first = None
-            for mat_first in mesh.materials:
-                if mat_first:
-                    break
+            is_coords_written = False
 
-            if mat_first or mesh.uv_textures.active:
-                self.write_indented("<Appearance>\n", 1)
-                # right now this script can only handle a single material per mesh.
-                if mat_first and mat_first.use_face_texture == False:
-                    self.writeMaterial(mat_first, self.cleanStr(mat_first.name, ""), world)
-                    if len(mesh.materials) > 1:
-                        print("Warning: mesh named %s has multiple materials" % mesh_name_x3d)
-                        print("Warning: only one material per object handled")
+            mesh_materials = mesh.materials[:]
+            if not mesh_materials:
+                mesh_materials = [None]
 
-                image = None
-
-                if mat_first is None or mat_first.use_face_texture:
-                    #-- textures
-                    if mesh.uv_textures.active:
-                        for face in mesh.uv_textures.active.data:
-                            if face.use_image:
-                                image = face.image
-                                if image:
-                                    break
-                elif mat_first:
-                    for mtex in mat_first.texture_slots:
+            mesh_material_images = [None] * len(mesh_materials)
+            for i, material in enumerate(mesh_materials):
+                if material:
+                    for mtex in material.texture_slots:
                         if mtex:
                             tex = mtex.texture
                             if tex and tex.type == 'IMAGE':
                                 image = tex.image
                                 if image:
+                                    mesh_material_images[i] = image
                                     break
 
-                # XXX, incorrect, uses first image
-                if image:
-                    self.writeImageTexture(image)
+            mesh_materials_use_face_texture = [getattr(material, "use_face_texture", True) for material in mesh_materials]
 
-                    if self.tilenode == 1:
-                        self.write_indented("<TextureTransform	scale=\"%s %s\" />\n" % (image.xrep, image.yrep))
-                        self.tilenode = 0
+            mesh_faces = mesh.faces[:]
+            mesh_faces_materials = [f.material_index for f in mesh_faces]
 
-                self.write_indented("</Appearance>\n", -1)
+            if is_uv and True in mesh_materials_use_face_texture:
+                mesh_faces_image = [(fuv.image if (mesh_materials_use_face_texture[mesh_faces_materials[i]] and fuv.use_image) else mesh_material_images[mesh_faces_materials[i]]) for i, fuv in enumerate(mesh.uv_textures.active.data)]
+                mesh_faces_image_unique = set(mesh_faces_image)
+            else:
+                mesh_faces_image = [None] * len(mesh_faces)
+                mesh_faces_image_unique = {None}
 
-            #-- IndexedFaceSet or IndexedLineSet
+            # group faces
+            face_groups = {}
+            for material_index in range(len(mesh_materials)):
+                for image in mesh_faces_image_unique:
+                    face_groups[material_index, image] = []
+            del mesh_faces_image_unique
 
-            # user selected BOUNDS=1, SOLID=3, SHARED=4, or TEXTURE=5
-            # look up mesh name, use it if available
+            for i, (material_index, image) in enumerate(zip(mesh_faces_materials, mesh_faces_image)):
+                face_groups[material_index, image].append(i)
 
-            self.write_indented("<IndexedFaceSet ", 1)
+            for (material_index, image), face_group in face_groups.items():
+                if face_group:
+                    material = mesh_materials[material_index]
 
-            # --- Write IndexedFaceSet Attributes
-            if mesh.show_double_sided:
-                self.file.write("solid=\"true\" ")
-            else:
-                self.file.write("solid=\"false\" ")
+                    self.write_indented("<Shape>\n", 1)
+                    is_smooth = False
+                    is_col = (mesh.vertex_colors.active and (material is None or material.use_vertex_color_paint))
 
-            for face in mesh.faces:
-                if face.use_smooth:
-                    is_smooth = True
-                    break
+                    # kludge but as good as it gets!
+                    for i in face_group:
+                        if mesh_faces[i].use_smooth:
+                            is_smooth = True
+                            break
 
-            if is_smooth:
-                self.file.write("creaseAngle=\"%.4f\" " % creaseAngle)
+                    if image:
+                        self.write_indented("<Appearance>\n", 1)
+                        self.writeImageTexture(image)
 
-            is_uv = bool(mesh.uv_textures.active)
-            is_col = (mesh.vertex_colors.active and (mat_first is None or mat_first.use_vertex_color_paint))
+                        if self.tilenode == 1:
+                            self.write_indented("<TextureTransform	scale=\"%s %s\" />\n" % (image.xrep, image.yrep))
+                            self.tilenode = 0
 
-            if is_uv:
-                self.write_ifs_texco_attr(mesh)
-            if is_col:
-                self.write_ifs_color_attr(mesh)
+                        self.write_indented("</Appearance>\n", -1)
 
-            self.write_ifs_coords_attr(ob, mesh, mesh_name_x3d, EXPORT_TRI)
+                    elif material:
+                        self.write_indented("<Appearance>\n", 1)
+                        self.writeMaterial(material, self.cleanStr(material.name, ""), world)
+                        self.write_indented("</Appearance>\n", -1)
 
-            # close IndexedFaceSet
-            self.file.write(">\n")
+                    #-- IndexedFaceSet or IndexedLineSet
 
-            # --- Write IndexedFaceSet Elements
-            self.write_ifs_coords_elem(ob, mesh, mesh_name_x3d, EXPORT_TRI)
+                    self.write_indented("<IndexedFaceSet ", 1)
 
-            if is_col:
-                self.write_ifs_texco_elem(mesh)
-            if is_col:
-                self.write_ifs_color_elem(mesh)
-            #--- output vertexColors
+                    # --- Write IndexedFaceSet Attributes
+                    if mesh.show_double_sided:
+                        fw("solid=\"true\" ")
+                    else:
+                        fw("solid=\"false\" ")
 
-            #--- output closing braces
-            self.write_indented("</IndexedFaceSet>\n", -1)
-            self.write_indented("</Shape>\n", -1)
+                    if is_smooth:
+                        fw("creaseAngle=\"%.4f\" " % creaseAngle)
+
+                    if is_uv:
+                        # "texCoordIndex"
+                        fw("\n\t\t\ttexCoordIndex=\"")
+                        j = 0
+                        for i in face_group:
+                            if len(mesh_faces[i].vertices) == 4:
+                                fw("%d %d %d %d -1, " % (j, j + 1, j + 2, j + 3))
+                                j += 4
+                            else:
+                                fw("%d %d %d -1, " % (j, j + 1, j + 2))
+                                j += 3
+                        fw("\" ")
+                        # --- end texCoordIndex
+
+                    if is_col:
+                        fw("colorPerVertex=\"false\" ")
+
+                    if True:
+                        # "coordIndex"
+                        fw('coordIndex="')
+                        if EXPORT_TRI:
+                            for i in face_group:
+                                fv = mesh_faces[i].vertices[:]
+                                if len(fv) == 3:
+                                    fw("%i %i %i -1, " % fv)
+                                else:
+                                    fw("%i %i %i -1, " % (fv[0], fv[1], fv[2]))
+                                    fw("%i %i %i -1, " % (fv[0], fv[2], fv[3]))
+                        else:
+                            for i in face_group:
+                                fv = mesh_faces[i].vertices[:]
+                                if len(fv) == 3:
+                                    fw("%i %i %i -1, " % fv)
+                                else:
+                                    fw("%i %i %i %i -1, " % fv)
+
+                        fw("\" ")
+                        # --- end coordIndex
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list