[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21291] branches/soc-2009-kazanbas: - started OBJ importer conversion
Arystanbek Dyussenov
arystan.d at gmail.com
Wed Jul 1 20:23:11 CEST 2009
Revision: 21291
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21291
Author: kazanbas
Date: 2009-07-01 20:23:11 +0200 (Wed, 01 Jul 2009)
Log Message:
-----------
- started OBJ importer conversion
- added Mesh.add_uv_layer, Object.add_vertex_group
Modified Paths:
--------------
branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_mesh_api.c
branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_object.c
branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_object_api.c
Added Paths:
-----------
branches/soc-2009-kazanbas/release/io/import_obj.py
Copied: branches/soc-2009-kazanbas/release/io/import_obj.py (from rev 21285, branches/soc-2009-kazanbas/release/scripts/import_obj.py)
===================================================================
--- branches/soc-2009-kazanbas/release/io/import_obj.py (rev 0)
+++ branches/soc-2009-kazanbas/release/io/import_obj.py 2009-07-01 18:23:11 UTC (rev 21291)
@@ -0,0 +1,1280 @@
+#!BPY
+
+"""
+Name: 'Wavefront (.obj)...'
+Blender: 249
+Group: 'Import'
+Tooltip: 'Load a Wavefront OBJ File, Shift: batch import all dir.'
+"""
+
+__author__= "Campbell Barton", "Jiri Hnidek", "Paolo Ciccone"
+__url__= ['http://wiki.blender.org/index.php/Scripts/Manual/Import/wavefront_obj', 'blender.org', 'blenderartists.org']
+__version__= "2.11"
+
+__bpydoc__= """\
+This script imports a Wavefront OBJ files to Blender.
+
+Usage:
+Run this script from "File->Import" menu and then load the desired OBJ file.
+Note, This loads mesh objects and materials only, nurbs and curves are not supported.
+"""
+
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+# Script copyright (C) Campbell J Barton 2007
+#
+# 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 *****
+# --------------------------------------------------------------------------
+
+from Blender import Mesh, Draw, Window, Texture, Material, sys
+import bpy
+import BPyMesh
+import BPyImage
+import BPyMessages
+
+try: import os
+except: os= False
+
+# Generic path functions
+def stripFile(path):
+ '''Return directory, where the file is'''
+ lastSlash= max(path.rfind('\\'), path.rfind('/'))
+ if lastSlash != -1:
+ path= path[:lastSlash]
+ return '%s%s' % (path, sys.sep)
+
+def stripPath(path):
+ '''Strips the slashes from the back of a string'''
+ return path.split('/')[-1].split('\\')[-1]
+
+def stripExt(name): # name is a string
+ '''Strips the prefix off the name before writing'''
+ index= name.rfind('.')
+ if index != -1:
+ return name[ : index ]
+ else:
+ return name
+# end path funcs
+
+def unpack_list(list_of_tuples):
+ l = []
+ for t in list_of_tuples:
+ l.extend(t)
+ return l
+
+# same as above except that it adds 0 for triangle faces
+def unpack_face_list(list_of_tuples):
+ l = []
+ for t in list_of_tuples:
+ if len(t) == 3:
+ t += [0]
+ l.extend(t)
+ return l
+
+
+def line_value(line_split):
+ '''
+ Returns 1 string represneting the value for this line
+ None will be returned if theres only 1 word
+ '''
+ length= len(line_split)
+ if length == 1:
+ return None
+
+ elif length == 2:
+ return line_split[1]
+
+ elif length > 2:
+ return ' '.join( line_split[1:] )
+
+def obj_image_load(imagepath, DIR, IMAGE_SEARCH):
+ '''
+ Mainly uses comprehensiveImageLoad
+ but tries to replace '_' with ' ' for Max's exporter replaces spaces with underscores.
+ '''
+
+ if '_' in imagepath:
+ image= BPyImage.comprehensiveImageLoad(imagepath, DIR, PLACE_HOLDER= False, RECURSIVE= IMAGE_SEARCH)
+ if image: return image
+ # Did the exporter rename the image?
+ image= BPyImage.comprehensiveImageLoad(imagepath.replace('_', ' '), DIR, PLACE_HOLDER= False, RECURSIVE= IMAGE_SEARCH)
+ if image: return image
+
+ # Return an image, placeholder if it dosnt exist
+ image= BPyImage.comprehensiveImageLoad(imagepath, DIR, PLACE_HOLDER= True, RECURSIVE= IMAGE_SEARCH)
+ return image
+
+
+def create_materials(filepath, material_libs, unique_materials, unique_material_images, IMAGE_SEARCH):
+ '''
+ Create all the used materials in this obj,
+ assign colors and images to the materials from all referenced material libs
+ '''
+ DIR= stripFile(filepath)
+
+ #==================================================================================#
+ # This function sets textures defined in .mtl file #
+ #==================================================================================#
+ def load_material_image(blender_material, context_material_name, imagepath, type):
+
+ texture= bpy.data.textures.new(type)
+ texture.setType('Image')
+
+ # Absolute path - c:\.. etc would work here
+ image= obj_image_load(imagepath, DIR, IMAGE_SEARCH)
+ has_data = image.has_data
+ texture.image = image
+
+ # Adds textures for materials (rendering)
+ if type == 'Kd':
+ if has_data and image.depth == 32:
+ # Image has alpha
+ blender_material.setTexture(0, texture, Texture.TexCo.UV, Texture.MapTo.COL | Texture.MapTo.ALPHA)
+ texture.setImageFlags('MipMap', 'InterPol', 'UseAlpha')
+ blender_material.mode |= Material.Modes.ZTRANSP
+ blender_material.alpha = 0.0
+ else:
+ blender_material.setTexture(0, texture, Texture.TexCo.UV, Texture.MapTo.COL)
+
+ # adds textures to faces (Textured/Alt-Z mode)
+ # Only apply the diffuse texture to the face if the image has not been set with the inline usemat func.
+ unique_material_images[context_material_name]= image, has_data # set the texface image
+
+ elif type == 'Ka':
+ blender_material.setTexture(1, texture, Texture.TexCo.UV, Texture.MapTo.CMIR) # TODO- Add AMB to BPY API
+
+ elif type == 'Ks':
+ blender_material.setTexture(2, texture, Texture.TexCo.UV, Texture.MapTo.SPEC)
+
+ elif type == 'Bump':
+ blender_material.setTexture(3, texture, Texture.TexCo.UV, Texture.MapTo.NOR)
+ elif type == 'D':
+ blender_material.setTexture(4, texture, Texture.TexCo.UV, Texture.MapTo.ALPHA)
+ blender_material.mode |= Material.Modes.ZTRANSP
+ blender_material.alpha = 0.0
+ # Todo, unset deffuse material alpha if it has an alpha channel
+
+ elif type == 'refl':
+ blender_material.setTexture(5, texture, Texture.TexCo.UV, Texture.MapTo.REF)
+
+
+ # Add an MTL with the same name as the obj if no MTLs are spesified.
+ temp_mtl= stripExt(stripPath(filepath))+ '.mtl'
+
+ if sys.exists(DIR + temp_mtl) and temp_mtl not in material_libs:
+ material_libs.append( temp_mtl )
+ del temp_mtl
+
+ #Create new materials
+ for name in unique_materials: # .keys()
+ if name != None:
+ unique_materials[name]= bpy.data.materials.new(name)
+ unique_material_images[name]= None, False # assign None to all material images to start with, add to later.
+
+ unique_materials[None]= None
+ unique_material_images[None]= None, False
+
+ for libname in material_libs:
+ mtlpath= DIR + libname
+ if not sys.exists(mtlpath):
+ #print '\tError Missing MTL: "%s"' % mtlpath
+ pass
+ else:
+ #print '\t\tloading mtl: "%s"' % mtlpath
+ context_material= None
+ mtl= open(mtlpath, 'rU')
+ for line in mtl: #.xreadlines():
+ if line.startswith('newmtl'):
+ context_material_name= line_value(line.split())
+ if unique_materials.has_key(context_material_name):
+ context_material = unique_materials[ context_material_name ]
+ else:
+ context_material = None
+
+ elif context_material:
+ # we need to make a material to assign properties to it.
+ line_split= line.split()
+ line_lower= line.lower().lstrip()
+ if line_lower.startswith('ka'):
+ context_material.setMirCol((float(line_split[1]), float(line_split[2]), float(line_split[3])))
+ elif line_lower.startswith('kd'):
+ context_material.setRGBCol((float(line_split[1]), float(line_split[2]), float(line_split[3])))
+ elif line_lower.startswith('ks'):
+ context_material.setSpecCol((float(line_split[1]), float(line_split[2]), float(line_split[3])))
+ elif line_lower.startswith('ns'):
+ context_material.setHardness( int((float(line_split[1])*0.51)) )
+ elif line_lower.startswith('ni'): # Refraction index
+ context_material.setIOR( max(1, min(float(line_split[1]), 3))) # Between 1 and 3
+ elif line_lower.startswith('d') or line_lower.startswith('tr'):
+ context_material.setAlpha(float(line_split[1]))
+ elif line_lower.startswith('map_ka'):
+ img_filepath= line_value(line.split())
+ if img_filepath:
+ load_material_image(context_material, context_material_name, img_filepath, 'Ka')
+ elif line_lower.startswith('map_ks'):
+ img_filepath= line_value(line.split())
+ if img_filepath:
+ load_material_image(context_material, context_material_name, img_filepath, 'Ks')
+ elif line_lower.startswith('map_kd'):
+ img_filepath= line_value(line.split())
+ if img_filepath:
+ load_material_image(context_material, context_material_name, img_filepath, 'Kd')
+ elif line_lower.startswith('map_bump'):
+ img_filepath= line_value(line.split())
+ if img_filepath:
+ load_material_image(context_material, context_material_name, img_filepath, 'Bump')
+ elif line_lower.startswith('map_d') or line_lower.startswith('map_tr'): # Alpha map - Dissolve
+ img_filepath= line_value(line.split())
+ if img_filepath:
+ load_material_image(context_material, context_material_name, img_filepath, 'D')
+
+ elif line_lower.startswith('refl'): # Reflectionmap
+ img_filepath= line_value(line.split())
+ if img_filepath:
+ load_material_image(context_material, context_material_name, img_filepath, 'refl')
+ mtl.close()
+
+
+
+
+def split_mesh(verts_loc, faces, unique_materials, filepath, SPLIT_OB_OR_GROUP, SPLIT_MATERIALS):
+ '''
+ Takes vert_loc and faces, and seperates into multiple sets of
+ (verts_loc, faces, unique_materials, dataname)
+ This is done so objects do not overload the 16 material limit.
+ '''
+
+ filename = stripExt(stripPath(filepath))
+
+ if not SPLIT_OB_OR_GROUP and not SPLIT_MATERIALS:
+ # use the filename for the object name since we arnt chopping up the mesh.
+ return [(verts_loc, faces, unique_materials, filename)]
+
+
+ def key_to_name(key):
+ # if the key is a tuple, join it to make a string
+ if type(key) == tuple:
+ return '%s_%s' % key
+ elif not key:
+ return filename # assume its a string. make sure this is true if the splitting code is changed
+ else:
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list