Revision: 23557 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23557 Author: campbellbarton Date: 2009-09-29 17:16:22 +0200 (Tue, 29 Sep 2009)
Log Message: ----------- Copying scripts from 2.4x without 2.5x changes Added Paths: ----------- trunk/blender/release/scripts/io/export_3ds.py trunk/blender/release/scripts/io/export_fbx.py trunk/blender/release/scripts/io/export_obj.py trunk/blender/release/scripts/io/export_ply.py trunk/blender/release/scripts/io/export_x3d.py trunk/blender/release/scripts/io/import_3ds.py trunk/blender/release/scripts/io/import_obj.py Copied: trunk/blender/release/scripts/io/export_3ds.py (from rev 23556, branches/blender2.4/release/scripts/3ds_export.py) =================================================================== --- trunk/blender/release/scripts/io/export_3ds.py (rev 0) +++ trunk/blender/release/scripts/io/export_3ds.py 2009-09-29 15:16:22 UTC (rev 23557) @@ -0,0 +1,1019 @@ +#!BPY +# coding: utf-8 +""" +Name: '3D Studio (.3ds)...' +Blender: 243 +Group: 'Export' +Tooltip: 'Export to 3DS file format (.3ds).' +""" + +__author__ = ["Campbell Barton", "Bob Holcomb", "Richard Lärkäng", "Damien McGinnes", "Mark Stijnman"] +__url__ = ("blenderartists.org", "www.blender.org", "www.gametutorials.com", "lib3ds.sourceforge.net/") +__version__ = "0.90a" +__bpydoc__ = """\ + +3ds Exporter + +This script Exports a 3ds file. + +Exporting is based on 3ds loader from www.gametutorials.com(Thanks DigiBen) and using information +from the lib3ds project (http://lib3ds.sourceforge.net/) sourcecode. +""" + +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# Script copyright (C) Bob Holcomb +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# ***** END GPL LICENCE BLOCK ***** +# -------------------------------------------------------------------------- + + +###################################################### +# Importing modules +###################################################### + +import Blender +import bpy +from BPyMesh import getMeshFromObject +from BPyObject import getDerivedObjects +try: + import struct +except: + struct = None + +# So 3ds max can open files, limit names to 12 in length +# this is verry annoying for filenames! +name_unique = [] +name_mapping = {} +def sane_name(name): + name_fixed = name_mapping.get(name) + if name_fixed != None: + return name_fixed + + if len(name) > 12: + new_name = name[:12] + else: + new_name = name + + i = 0 + + while new_name in name_unique: + new_name = new_name[:-4] + '.%.3d' % i + i+=1 + + name_unique.append(new_name) + name_mapping[name] = new_name + return new_name + +###################################################### +# Data Structures +###################################################### + +#Some of the chunks that we will export +#----- Primary Chunk, at the beginning of each file +PRIMARY= long("0x4D4D",16) + +#------ Main Chunks +OBJECTINFO = long("0x3D3D",16); #This gives the version of the mesh and is found right before the material and object information +VERSION = long("0x0002",16); #This gives the version of the .3ds file +KFDATA = long("0xB000",16); #This is the header for all of the key frame info + +#------ sub defines of OBJECTINFO +MATERIAL=45055 #0xAFFF // This stored the texture info +OBJECT=16384 #0x4000 // This stores the faces, vertices, etc... + +#>------ sub defines of MATERIAL +MATNAME = long("0xA000",16); # This holds the material name +MATAMBIENT = long("0xA010",16); # Ambient color of the object/material +MATDIFFUSE = long("0xA020",16); # This holds the color of the object/material +MATSPECULAR = long("0xA030",16); # SPecular color of the object/material +MATSHINESS = long("0xA040",16); # ?? +MATMAP = long("0xA200",16); # This is a header for a new material +MATMAPFILE = long("0xA300",16); # This holds the file name of the texture + +RGB1= long("0x0011",16) +RGB2= long("0x0012",16) + +#>------ sub defines of OBJECT +OBJECT_MESH = long("0x4100",16); # This lets us know that we are reading a new object +OBJECT_LIGHT = long("0x4600",16); # This lets un know we are reading a light object +OBJECT_CAMERA= long("0x4700",16); # This lets un know we are reading a camera object + +#>------ sub defines of CAMERA +OBJECT_CAM_RANGES= long("0x4720",16); # The camera range values + +#>------ sub defines of OBJECT_MESH +OBJECT_VERTICES = long("0x4110",16); # The objects vertices +OBJECT_FACES = long("0x4120",16); # The objects faces +OBJECT_MATERIAL = long("0x4130",16); # This is found if the object has a material, either texture map or color +OBJECT_UV = long("0x4140",16); # The UV texture coordinates +OBJECT_TRANS_MATRIX = long("0x4160",16); # The Object Matrix + +#>------ sub defines of KFDATA +KFDATA_KFHDR = long("0xB00A",16); +KFDATA_KFSEG = long("0xB008",16); +KFDATA_KFCURTIME = long("0xB009",16); +KFDATA_OBJECT_NODE_TAG = long("0xB002",16); + +#>------ sub defines of OBJECT_NODE_TAG +OBJECT_NODE_ID = long("0xB030",16); +OBJECT_NODE_HDR = long("0xB010",16); +OBJECT_PIVOT = long("0xB013",16); +OBJECT_INSTANCE_NAME = long("0xB011",16); +POS_TRACK_TAG = long("0xB020",16); +ROT_TRACK_TAG = long("0xB021",16); +SCL_TRACK_TAG = long("0xB022",16); + +def uv_key(uv): + return round(uv.x, 6), round(uv.y, 6) + +# size defines: +SZ_SHORT = 2 +SZ_INT = 4 +SZ_FLOAT = 4 + +class _3ds_short(object): + '''Class representing a short (2-byte integer) for a 3ds file. + *** This looks like an unsigned short H is unsigned from the struct docs - Cam***''' + __slots__ = 'value' + def __init__(self, val=0): + self.value=val + + def get_size(self): + return SZ_SHORT + + def write(self,file): + file.write(struct.pack("<H", self.value)) + + def __str__(self): + return str(self.value) + +class _3ds_int(object): + '''Class representing an int (4-byte integer) for a 3ds file.''' + __slots__ = 'value' + def __init__(self, val=0): + self.value=val + + def get_size(self): + return SZ_INT + + def write(self,file): + file.write(struct.pack("<I", self.value)) + + def __str__(self): + return str(self.value) + +class _3ds_float(object): + '''Class representing a 4-byte IEEE floating point number for a 3ds file.''' + __slots__ = 'value' + def __init__(self, val=0.0): + self.value=val + + def get_size(self): + return SZ_FLOAT + + def write(self,file): + file.write(struct.pack("<f", self.value)) + + def __str__(self): + return str(self.value) + + +class _3ds_string(object): + '''Class representing a zero-terminated string for a 3ds file.''' + __slots__ = 'value' + def __init__(self, val=""): + self.value=val + + def get_size(self): + return (len(self.value)+1) + + def write(self,file): + binary_format = "<%ds" % (len(self.value)+1) + file.write(struct.pack(binary_format, self.value)) + + def __str__(self): + return self.value + +class _3ds_point_3d(object): + '''Class representing a three-dimensional point for a 3ds file.''' + __slots__ = 'x','y','z' + def __init__(self, point=(0.0,0.0,0.0)): + self.x, self.y, self.z = point + + def get_size(self): + return 3*SZ_FLOAT + + def write(self,file): + file.write(struct.pack('<3f', self.x, self.y, self.z)) + + def __str__(self): + return '(%f, %f, %f)' % (self.x, self.y, self.z) + +# Used for writing a track +""" +class _3ds_point_4d(object): + '''Class representing a four-dimensional point for a 3ds file, for instance a quaternion.''' + __slots__ = 'x','y','z','w' + def __init__(self, point=(0.0,0.0,0.0,0.0)): + self.x, self.y, self.z, self.w = point + + def get_size(self): + return 4*SZ_FLOAT + + def write(self,file): + data=struct.pack('<4f', self.x, self.y, self.z, self.w) + file.write(data) + + def __str__(self): + return '(%f, %f, %f, %f)' % (self.x, self.y, self.z, self.w) +""" + +class _3ds_point_uv(object): + '''Class representing a UV-coordinate for a 3ds file.''' + __slots__ = 'uv' + def __init__(self, point=(0.0,0.0)): + self.uv = point + + def __cmp__(self, other): + return cmp(self.uv,other.uv) + + def get_size(self): + return 2*SZ_FLOAT + + def write(self,file): + data=struct.pack('<2f', self.uv[0], self.uv[1]) + file.write(data) + + def __str__(self): + return '(%g, %g)' % self.uv + +class _3ds_rgb_color(object): + '''Class representing a (24-bit) rgb color for a 3ds file.''' + __slots__ = 'r','g','b' + def __init__(self, col=(0,0,0)): + self.r, self.g, self.b = col + + def get_size(self): + return 3 + + def write(self,file): + file.write( struct.pack('<3c', chr(int(255*self.r)), chr(int(255*self.g)), chr(int(255*self.b)) ) ) + + def __str__(self): + return '{%f, %f, %f}' % (self.r, self.g, self.b) + +class _3ds_face(object): + '''Class representing a face for a 3ds file.''' + __slots__ = 'vindex' + def __init__(self, vindex): + self.vindex = vindex + + def get_size(self): + return 4*SZ_SHORT + + def write(self,file): + # The last zero is only used by 3d studio + file.write(struct.pack("<4H", self.vindex[0],self.vindex[1], self.vindex[2], 0)) + + def __str__(self): + return '[%d %d %d]' % (self.vindex[0],self.vindex[1], self.vindex[2]) + +class _3ds_array(object): + '''Class representing an array of variables for a 3ds file. + + Consists of a _3ds_short to indicate the number of items, followed by the items themselves. + ''' + __slots__ = 'values', 'size' + def __init__(self): + self.values=[] + self.size=SZ_SHORT + + # add an item: + def add(self,item): + self.values.append(item) + self.size+=item.get_size() + + def get_size(self): + return self.size + + def write(self,file): + _3ds_short(len(self.values)).write(file) + #_3ds_int(len(self.values)).write(file) + for value in self.values: + value.write(file) + + # To not overwhelm the output in a dump, a _3ds_array only + # outputs the number of items, not all of the actual items. + def __str__(self): + return '(%d items)' % len(self.values) + +class _3ds_named_variable(object): + '''Convenience class for named variables.''' + + __slots__ = 'value', 'name' + def __init__(self, name, val=None): + self.name=name + self.value=val + + def get_size(self): + if (self.value==None): + return 0 + else: + return self.value.get_size() + + def write(self, file): + if (self.value!=None): + self.value.write(file) + @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs