[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34136] trunk/blender/release/scripts/op/ io_scene_x3d/export_x3d.py: bugfix [#25522] Export to X3D is missing ImageTexture and TextureTransform for plane with image texture

Campbell Barton ideasman42 at gmail.com
Fri Jan 7 03:39:50 CET 2011


Revision: 34136
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=34136
Author:   campbellbarton
Date:     2011-01-07 02:39:48 +0000 (Fri, 07 Jan 2011)
Log Message:
-----------
bugfix [#25522] Export to X3D is missing ImageTexture and TextureTransform for plane with image texture
- tile option was broken.
- added basic export of texture/mtex transformation.
- recent mesh update broke material/image export with no UVs   

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-06 17:54:17 UTC (rev 34135)
+++ trunk/blender/release/scripts/op/io_scene_x3d/export_x3d.py	2011-01-07 02:39:48 UTC (rev 34136)
@@ -63,7 +63,6 @@
         self.billnode = 0
         self.halonode = 0
         self.collnode = 0
-        self.tilenode = 0
         self.verbose = 2	 # level of verbosity in console 0-none, 1-some, 2-most
         self.cp = 3		  # decimals for material color values	 0.000 - 1.000
         self.vp = 3		  # decimals for vertex coordinate values  0.000 - n.000
@@ -307,9 +306,6 @@
         # elif mode & Mesh.FaceModes.BILLBOARD and self.billnode == 0:
             self.write_indented("<Billboard axisOfRotation=\"0 1 0\">\n", 1)
             self.billnode = 1
-        # TF_TILES is marked as deprecated in DNA_meshdata_types.h
-        # elif mode & Mesh.FaceModes.TILES and self.tilenode == 0:
-        # 	self.tilenode = 1
         elif 'COLLISION' not in mode and self.collnode == 0:
         # elif not mode & Mesh.FaceModes.DYNAMIC and self.collnode == 0:
             self.write_indented("<Collision enabled=\"false\">\n", 1)
@@ -339,7 +335,10 @@
             if not mesh_materials:
                 mesh_materials = [None]
 
+            mesh_material_tex = [None] * len(mesh_materials)
+            mesh_material_mtex = [None] * len(mesh_materials)
             mesh_material_images = [None] * len(mesh_materials)
+
             for i, material in enumerate(mesh_materials):
                 if material:
                     for mtex in material.texture_slots:
@@ -348,6 +347,8 @@
                             if tex and tex.type == 'IMAGE':
                                 image = tex.image
                                 if image:
+                                    mesh_material_tex[i] = tex
+                                    mesh_material_mtex[i] = mtex
                                     mesh_material_images[i] = image
                                     break
 
@@ -355,10 +356,13 @@
 
             mesh_faces = mesh.faces[:]
             mesh_faces_materials = [f.material_index for f in mesh_faces]
-
+            
             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)
+            elif len(set(mesh_material_images) | {None}) > 1:  # make sure there is at least one image
+                mesh_faces_image = [mesh_material_images[material_index] for material_index in mesh_faces_materials]
+                mesh_faces_image_unique = set(mesh_faces_image)
             else:
                 mesh_faces_image = [None] * len(mesh_faces)
                 mesh_faces_image_unique = {None}
@@ -391,10 +395,33 @@
                         self.write_indented("<Appearance>\n", 1)
                         self.writeImageTexture(image)
 
-                        if self.tilenode == 1:
-                            self.write_indented("<TextureTransform	scale=\"%s %s\" />\n" % (image.xrep, image.yrep))
-                            self.tilenode = 0
+                        if mesh_materials_use_face_texture[material_index]:
+                            if image.use_tile:
+                                self.write_indented("<TextureTransform scale=\"%s %s\" />\n" % (image.tiles_x, image.tiles_y))
+                        else:
+                            # transform by mtex
+                            loc = mesh_material_mtex[material_index].offset[:2]
 
+                            # mtex_scale * tex_repeat
+                            sca_x, sca_y = mesh_material_mtex[material_index].scale[:2]
+
+                            sca_x *= mesh_material_tex[material_index].repeat_x
+                            sca_y *= mesh_material_tex[material_index].repeat_y
+
+                            # flip x/y is a sampling feature, convert to transform
+                            if mesh_material_tex[material_index].use_flip_axis:
+                                rot = math.pi / -2.0
+                                sca_x, sca_y = sca_y, -sca_x
+                            else:
+                                rot = 0.0
+
+                            self.write_indented("<TextureTransform ", 1)
+                            # fw("center=\"%.6f %.6f\" " % (0.0, 0.0))
+                            fw("translation=\"%.6f %.6f\" " % loc)
+                            fw("scale=\"%.6f %.6f\" " % (sca_x, sca_y))
+                            fw("rotation=\"%.6f\" " % rot)
+                            fw("/>\n")
+
                         self.write_indented("</Appearance>\n", -1)
 
                     elif material:




More information about the Bf-blender-cvs mailing list