From 0afdac244629258bebda6e65a25ba3e3879f4003 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Sun, 6 Jun 2010 14:32:49 +0900 Subject: [PATCH] implement createMaterials. --- swig/blender/bl24.py | 39 ++++++++++++ swig/blender/bl25.py | 32 ++++++++++ swig/blender/cp.py | 3 +- swig/blender/mqo_import.py | 145 ++++++++++++++------------------------------- 4 files changed, 119 insertions(+), 100 deletions(-) create mode 100644 swig/blender/bl24.py create mode 100644 swig/blender/bl25.py diff --git a/swig/blender/bl24.py b/swig/blender/bl24.py new file mode 100644 index 0000000..a9ee110 --- /dev/null +++ b/swig/blender/bl24.py @@ -0,0 +1,39 @@ +# coding: utf-8 +import sys +import os +import Blender + +# $B%U%!%$%k%7%9%F%`$NJ8;z%3!<%I(B +# $B2~B$HG$H$N6&MQ$N$?$a(B +FS_ENCODING=sys.getfilesystemencoding() +if os.path.exists(os.path.dirname(sys.argv[0])+"/utf8"): + INTERNAL_ENCODING='utf-8' +else: + INTERNAL_ENCODING=FS_ENCODING + +def createEmptyObject(scene, name): + empty=scene.objects.new("Empty") + empty.setName(name) + return empty + +def createMaterial(m): + material = Blender.Material.New(m.getName().encode(INTERNAL_ENCODING)) + material.mode |= Blender.Material.Modes.SHADELESS + material.rgbCol = [m.color.r, m.color.g, m.color.b] + material.alpha = m.color.a + material.amb = m.ambient + material.spec = m.specular + material.hard = int(255 * m.power) + return material + +def createTexture(path): + image = Blender.Image.Load(path.encode(INTERNAL_ENCODING)) + texture = Blender.Texture.New(path.encode(INTERNAL_ENCODING)) + texture.type = Blender.Texture.Types.IMAGE + texture.image = image + return texture, image + +def materialAddTexture(material, texture): + material.mode = material.mode | Blender.Material.Modes.TEXFACE + material.setTexture(0, texture, Blender.Texture.TexCo.UV) + diff --git a/swig/blender/bl25.py b/swig/blender/bl25.py new file mode 100644 index 0000000..b8a1a50 --- /dev/null +++ b/swig/blender/bl25.py @@ -0,0 +1,32 @@ +import bpy +import os + +def createEmptyObject(scene, name): + empty=bpy.data.objects.new(name, None) + scene.objects.link(empty) + return empty + +def createMaterial(m): + material = bpy.data.materials.new(m.getName()) + material.diffuse_color=[m.color.r, m.color.g, m.color.b] + material.alpha=m.color.a + material.diffuse_intensity=m.diffuse + # temporary + material.emit=1.0 + return material + +def createTexture(path): + texture=bpy.data.textures.new(os.path.basename(path)) + texture.type='IMAGE' + texture=texture.recast_type() + image=bpy.data.images.load(path) + texture.image=image + texture.mipmap = True + texture.interpolation = True + texture.use_alpha = True + return texture, image + +def materialAddTexture(material, texture): + #material.add_texture(texture, "UV", {"COLOR", "ALPHA"}) + material.add_texture(texture, "UV", "COLOR") + diff --git a/swig/blender/cp.py b/swig/blender/cp.py index bac1057..a3b595e 100644 --- a/swig/blender/cp.py +++ b/swig/blender/cp.py @@ -8,6 +8,7 @@ DST_24=[ MAP_25={ "mqo_import.py": "import_scene_mqo.py", + "bl25.py": "bl25.py", } DST_25=[ @@ -30,7 +31,7 @@ def copy25(src): try: dst="%s/%s" % (dst, MAP_25[src]) except: - dst="%s/%s" % (dst, src) + continue print(dst) shutil.copy(src, dst) diff --git a/swig/blender/mqo_import.py b/swig/blender/mqo_import.py index d83433e..038ddf0 100644 --- a/swig/blender/mqo_import.py +++ b/swig/blender/mqo_import.py @@ -22,6 +22,8 @@ This script imports a mqo into Blender for editing. 0.6 20100505: C extension. 0.7 20100606: integrate 2.4 and 2.5. ''' + + ############################################################################### # import ############################################################################### @@ -43,14 +45,6 @@ if isBlender24(): # wrapper import bl24 as bl - - # ファイルシステムの文字コード - # 改造版との共用のため - FS_ENCODING=sys.getfilesystemencoding() - if os.path.exists(os.path.dirname(sys.argv[0])+"/utf8"): - INTERNAL_ENCODING='utf-8' - else: - INTERNAL_ENCODING=FS_ENCODING else: # for 2.5 import bpy @@ -67,51 +61,6 @@ def has_mikoto(mqo): return False if isBlender24(): - def create_materials(scene, mqo, directory): - """ - create blender materials and renturn material list. - """ - materials = [] - images = [] - for m in mqo.materials: - material = Blender.Material.New(m.getName().encode(INTERNAL_ENCODING)) - materials.append(material) - - material.mode |= Blender.Material.Modes.SHADELESS - material.rgbCol = [m.color.r, m.color.g, m.color.b] - material.alpha = m.color.a - material.amb = m.ambient - material.spec = m.specular - material.hard = int(255 * m.power) - if m.texture!="": - texture_path=m.getTexture() - - # load texture image - if os.path.isabs(texture_path): - # absolute - path = texture_path - else: - # relative - path = os.path.join(directory, texture_path) - - # backslash to slash - #path = path.replace('\\', '/') - - # texture - if os.path.exists(path): - image = Blender.Image.Load(path.encode(INTERNAL_ENCODING)) - images.append(image) - material.mode = material.mode | Blender.Material.Modes.TEXFACE - tex = Blender.Texture.New(path.encode(INTERNAL_ENCODING)) - tex.type = Blender.Texture.Types.IMAGE - tex.image = image - material.setTexture(0, tex, Blender.Texture.TexCo.UV) - else: - print("%s not exits" % path) - - return materials, {} - - def create_objects(scene, mqo, root, materials, imageMap=None, scale=None): """ create blender mesh objects. @@ -604,49 +553,6 @@ if isBlender24(): else: - def create_texture(directory, texture_name): - texture=bpy.data.textures.new(texture_name) - texture.type='IMAGE' - texture=texture.recast_type() - #texturePath="%s/%s" % (directory, texture_name) - texturePath=os.path.join(directory, texture_name) - print('create_texture', texturePath) - image=bpy.data.images.load(texturePath) - texture.image=image - texture.mipmap = True - texture.interpolation = True - texture.use_alpha = True - return texture - - def create_materials(scene, mqo, directory): - materials = [] - textureMap={} - imageMap={} - if len(mqo.materials)>0: - for material_index, m in enumerate(mqo.materials): - material = bpy.data.materials.new(m.getName()) - materials.append(material) - # mqo material - material.diffuse_color=[m.color.r, m.color.g, m.color.b] - material.alpha=m.color.a - material.diffuse_intensity=m.diffuse - texture_name=m.getTexture() - if texture_name!='': - if texture_name in textureMap: - texture=textureMap[texture_name] - else: - texture=create_texture(directory, texture_name) - textureMap[texture_name]=texture - imageMap[material_index]=texture.image - #material.add_texture(texture, "UV", {"COLOR", "ALPHA"}) - material.add_texture(texture, "UV", "COLOR") - # temporary - material.emit=1.0 - else: - material = bpy.data.materials.new('Default') - materials.append(material) - return materials, imageMap - def create_objects(scene, mqo, parent, materials, imageMap, scale): for o in mqo.objects: @@ -736,6 +642,47 @@ else: mesh.update() +def __createMaterials(scene, mqo, directory): + """ + create blender materials and renturn material list. + """ + materials = [] + textureMap={} + imageMap={} + if len(mqo.materials)>0: + for material_index, m in enumerate(mqo.materials): + # material + material=bl.createMaterial(m) + materials.append(material) + # texture + texture_name=m.getTexture() + if texture_name!='': + if texture_name in textureMap: + texture=textureMap[texture_name] + else: + # load texture image + if os.path.isabs(texture_name): + # absolute + path = texture_name + else: + # relative + path = os.path.join(directory, texture_name) + # texture + if os.path.exists(path): + print("create texture:", path) + texture, image=bl.createTexture(path) + textureMap[texture_name]=texture + imageMap[material_index]=image + else: + print("%s not exits" % path) + continue + bl.materialAddTexture(material, texture) + else: + # default material + pass + return materials, imageMap + + def __execute(filename, scene, scale=1.0): # parse file io=mqo.IO() @@ -744,7 +691,7 @@ def __execute(filename, scene, scale=1.0): return # create materials - materials, imageMap=create_materials(scene, io, os.path.dirname(filename)) + materials, imageMap=__createMaterials(scene, io, os.path.dirname(filename)) # create objects root=bl.createEmptyObject(scene, os.path.basename(filename)) @@ -768,9 +715,9 @@ if isBlender24(): """ import a mqo file. """ - filename=filename.decode(INTERNAL_ENCODING) + filename=filename.decode(bl.INTERNAL_ENCODING) print("##start mqo_import.py##") - print(INTERNAL_ENCODING, FS_ENCODING) + print(bl.INTERNAL_ENCODING, bl.FS_ENCODING) print("parse mqo file: %s" % (filename)) Blender.Window.WaitCursor(1) -- 2.11.0