.b3d Exporting Problems - Probably no problem for you!

If you are a new Irrlicht Engine user, and have a newbie-question, this is the forum for you. You may also post general programming questions here.
utzutz
Posts: 9
Joined: Thu Jun 09, 2011 10:16 am

.b3d Exporting Problems - Probably no problem for you!

Post by utzutz »

Greetings,

I've almost no real experience with blender, which is also why that drag-in drag-out windows closing opening system freaks me out...really.

However, I want to export a simple flag animation as b3d animation, but I just can't get the Ganldf exporter script to run. It simply doesn't shows up in the exporter tab.

So instead of solely asking for help, how to implement the exporter, i also seize this opportunity to ask someone, if he might simply do the xporting thing for me?

...but still need to know how to use that exporter script!


Regards
utzutz
Posts: 9
Joined: Thu Jun 09, 2011 10:16 am

Post by utzutz »

okay managed to load it... however, it is giving me an error something like "inconsistent use of tabs and spaces" and an advice to dare a peak into the console - console is retunring nothing new!

probably downloaded a broken custimizatized version!

EDIT***: Downloaded that one from "alien" recommnded in the wiki - returns same error

Used that one posted in the forum here:
http://irrlicht.sourceforge.net/phpBB2/ ... 679b104ed0
-> returns another error!

tried this one as well:
http://nethack3d.sourceforge.net/o_b3d_export.py
-> guess what, returns an error!

what the... any scripts in the forum return errors!
Does there exist a running combination, blender-script wise?

If so please just export my animation for me - let me know in this thread if you're willing to do this simple step for me!
Last edited by utzutz on Thu Jun 09, 2011 10:41 am, edited 1 time in total.
KP84
Posts: 44
Joined: Thu Feb 24, 2011 5:08 am

Post by KP84 »

Am no blender pro:

Is the script in the right directory? It should be visible I think.

If not, check: User Preferences/Add-ons/Import-Export/ and check if b3d is checked.


PS always tell the version you use, i.d. 2.57b (.0r36247 is out) as the last tip is for 2.57b release but goes from 2.5 and up.

EDIT: Hmmm, did I take 4 minuts to answer you. That's just awfull.

Code: Select all

// if you think real code is always interresting, read this line again
utzutz
Posts: 9
Joined: Thu Jun 09, 2011 10:16 am

Post by utzutz »

thanks, the b3d option isn't showing up!

file path checked is something like
Blender Foundation\Blender\.blender\scripts\

version is the 2.57b !

i also tried a .x exporter somewhere inbetween, which I could now activate thanks to your first advice!

However, b3d isn't showing up anyhwere, what now?
utzutz
Posts: 9
Joined: Thu Jun 09, 2011 10:16 am

Post by utzutz »

tried the .x exporter -> blender crashed!
CuteAlien
Admin
Posts: 9718
Joined: Mon Mar 06, 2006 2:25 pm
Location: Tübingen, Germany
Contact:

Post by CuteAlien »

b3d exporter script was written for blender before 2.5 and they changed the format too much to run old scripts from what I heard.

I've no solution yet, so far I continue using blender 2.49 because of that. When I ever find enough time I'll try if I can rewrite gandaldfs script to 2.5 (or maybe I'm lucky and someone else does it).
IRC: #irrlicht on irc.libera.chat
Code snippet repository: https://github.com/mzeilfelder/irr-playground-micha
Free racer made with Irrlicht: http://www.irrgheist.com/hcraftsource.htm
utzutz
Posts: 9
Joined: Thu Jun 09, 2011 10:16 am

Post by utzutz »

okay... fortunately that implies I can fix the whole thing with simply using an old blender version!
CuteAlien
Admin
Posts: 9718
Joined: Mon Mar 06, 2006 2:25 pm
Location: Tübingen, Germany
Contact:

Post by CuteAlien »

I guess you could also report the blender crash to the blender guys. So maybe they fix it :-)
IRC: #irrlicht on irc.libera.chat
Code snippet repository: https://github.com/mzeilfelder/irr-playground-micha
Free racer made with Irrlicht: http://www.irrgheist.com/hcraftsource.htm
utzutz
Posts: 9
Joined: Thu Jun 09, 2011 10:16 am

Post by utzutz »

I tried the 49 version, which dragged me back to earth, because the animation I made is made in 2.5x ... awesome!

okay... took a look into .49 -> impossible! 2.5 was tough, but .49 is like another dimension!

Gonna try something else...


Thanks for the quick responses - bye!
KP84
Posts: 44
Joined: Thu Feb 24, 2011 5:08 am

Post by KP84 »

Animations of 2.5+ can't be used in olders versions. That feature did undergo a major change. maybe you can load older animated scenes into blender. If not, exporting to a format and importing can be tried too.

Not done much with animations much but I used the .x wich use animations.

settings:
System: Left-handed
rotate on X 90
Animations: Full
Export: All
All others not checked

Only one mesh and one object. Plus the armature as modifier or object-parent as armature. Armature only uses vertex groups. Kept the light though. Did texture it but not exported it. Maybe the one time I tried I crashed too but I can't remember why that happend.


Worked like a charm.

PS: Am really happy with the 2.57b tried the older 2.5x before but went back. This one I think is a jewel. But yeah, it still need some tweaks. Think the python API is almost near finished (as far code can be finished). Also scripts needs to be added and/or I need to look at the Add-ons :D Unfortunatly I do hate python. Well a bit less with the new script editor.

Code: Select all

// if you think real code is always interresting, read this line again
utzutz
Posts: 9
Joined: Thu Jun 09, 2011 10:16 am

Post by utzutz »

wasn't aware of the dx exporter, thanks for that, though!

gonna try it


- tried is, is always crashing! Tried another exporter version from the wiki, is also crashing whilst export!
Ravi08
Posts: 249
Joined: Thu Jul 17, 2008 12:25 pm

Post by Ravi08 »

hi, if u still want b3d, this is how it works for me, copy the code below into the text editor of blender then excute the code. Im using Blender 2.49b and it works fine.

Code: Select all

"""
Name: 'B3D Exporter (.b3d)...'
Blender: 248.1
Group: 'Export'
Tooltip: 'Export to Blitz3D file format (.b3d)'
"""
__author__ = ["Diego 'GaNDaLDF' Parisi"]
__url__ = ["www.gandaldf.com"]
__version__ = "2.07"
__bpydoc__ = """\
"""

# BLITZ3D EXPORTER 2.07:
# Copyright (C) 2009 by Diego "GaNDaLDF" Parisi  -  www.gandaldf.com
#
# Lightmap issue fixed by Capricorn 76 Pty. Ltd. - www.capricorn76.com
# Objects parameter added by SuperTuxKart Team - www.supertuxkart.sourceforge.net
#
# LICENSE:
# 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


#If you get an error here, it might be
#because you don't have Python installed.
import Blender
import BPyMesh
import sys,os,os.path,struct,math,string
from Blender import Mathutils
from Blender.Mathutils import *
from Blender import Draw,BGL
from Blender.BGL import *

if not hasattr(sys,"argv"): sys.argv = ["???"]

#Events
EVENT_ALL = 1
EVENT_SEL = 2
EVENT_NOR = 3
EVENT_COL = 4
EVENT_CAM = 5
EVENT_LIG = 6
EVENT_EXP = 7
EVENT_QUI = 8

#Global Stacks
flag_stack = []
sets_stack = []
texs_stack = []
brus_stack = []
mesh_stack = []
bone_stack = []
keys_stack = []

#Transformation Matrix
TRANS_MATRIX = Mathutils.Matrix([-1,0,0,0],[0,0,1,0],[0,1,0,0],[0,0,0,1])

#Support Functions
def write_int(value):
    return struct.pack("<i",value)

def write_float(value):
    return struct.pack("<f",round(value,4))

def write_string(value):
    binary_format = "<%ds"%(len(value)+1)
    return struct.pack(binary_format,value)

def write_chunk(name,value):
    return name + write_int(len(value)) + value

#Write B3D File
def write_b3d_file(filename, objects=[]):
    global flag_stack, sets_stack, texs_stack
    global brus_stack, mesh_stack, bone_stack, keys_stack

    #Global Stacks
    sets_stack = []
    texs_stack = []
    brus_stack = []
    mesh_stack = []
    bone_stack = []
    keys_stack = []
    file_buf = ""
    temp_buf = ""

    temp_buf += write_int(1) #Version
    temp_buf += write_texs(objects) #TEXS
    temp_buf += write_brus(objects) #BRUS
    temp_buf += write_node(objects) #NODE

    if len(temp_buf) > 0:
        file_buf += write_chunk("BB3D",temp_buf)
        temp_buf = ""

    file = open(filename,'wb')
    file.write(file_buf)
    file.close()

#Write TEXS Chunk
def write_texs(objects=[]):
    texs_buf = ""
    temp_buf = ""
    layer_max = 0
    obj_count = 0
    set_wrote = 0

    if objects:
        exp_obj = objects
    else:
        if flag_stack[1]:
            exp_obj = Blender.Object.GetSelected()
        else:
            exp_obj = Blender.Object.Get()

    for obj in exp_obj:
        if obj.type == "Mesh":
            set_count = 0
            set_wrote = 0
            data = obj.getData(mesh = True)
            orig_uvlayer = data.activeUVLayer
            layer_set = [[],[],[],[],[],[],[],[]]
            sets_stack.append([[],[],[],[],[],[],[],[]])

            if len(data.getUVLayerNames()) <= 8:
                if len(data.getUVLayerNames()) > layer_max:
                    layer_max = len(data.getUVLayerNames())
            else:
                layer_max = 8

            for face in data.faces:
                for iuvlayer,uvlayer in enumerate(data.getUVLayerNames()):
                    if iuvlayer < 8:
                        data.activeUVLayer = uvlayer
                        layer_set[iuvlayer].append(face.uv)

            for i in xrange(len(data.getUVLayerNames())):
                if set_wrote:
                    set_count += 1
                    set_wrote = 0

                for iuvlayer in xrange(i,len(data.getUVLayerNames())):
                    if layer_set[i] == layer_set[iuvlayer]:
                        if sets_stack[obj_count][iuvlayer] == []:
                            if set_count == 0:
                                tex_flag = 1
                            elif set_count == 1:
                                tex_flag = 65536
                            elif set_count > 1:
                                tex_flag = 1
                            sets_stack[obj_count][iuvlayer] = tex_flag
                            set_wrote = 1

            for face in data.faces:
                for iuvlayer,uvlayer in enumerate(data.getUVLayerNames()):
                    if iuvlayer < 8:
                        data.activeUVLayer = uvlayer
                        if face.image:
                            if not [face.image.name,sets_stack[obj_count][iuvlayer]] in texs_stack:
                                texs_stack.append([face.image.name,sets_stack[obj_count][iuvlayer]])
                                temp_buf += write_string(Blender.sys.basename(face.image.getFilename())) #Texture File Name
                                temp_buf += write_int(sets_stack[obj_count][iuvlayer]) #Flags
                                temp_buf += write_int(2)   #Blend
                                temp_buf += write_float(0) #X_Pos
                                temp_buf += write_float(0) #Y_Pos
                                temp_buf += write_float(1) #X_Scale
                                temp_buf += write_float(1) #Y_Scale
                                temp_buf += write_float(0) #Rotation

            obj_count += 1

            if orig_uvlayer:
                data.activeUVLayer = orig_uvlayer

    texs_stack.append(layer_max)

    if len(temp_buf) > 0:
        texs_buf += write_chunk("TEXS",temp_buf)
        temp_buf = ""

    return texs_buf

#Write BRUS Chunk
def write_brus(objects=[]):
    brus_buf = ""
    temp_buf = ""
    mat_count = 0
    obj_count = 0

    if objects:
        exp_obj = objects
    else:
        if flag_stack[1]:
            exp_obj = Blender.Object.GetSelected()
        else:
            exp_obj = Blender.Object.Get()

    for obj in exp_obj:
        if obj.type == "Mesh":
            data = obj.getData(mesh = True)
            orig_uvlayer = data.activeUVLayer

            for face in data.faces:
                img_found = 0
                face_stack = []
                for iuvlayer,uvlayer in enumerate(data.getUVLayerNames()):
                    if iuvlayer < 8:
                        data.activeUVLayer = uvlayer
                        if data.faceUV and face.image:
                            img_found = 1
                            for i in xrange(len(texs_stack)-1):
                                if texs_stack[i][0] == face.image.name:
                                    if texs_stack[i][1] == sets_stack[obj_count][iuvlayer]:
                                        img_id = i
                        else:
                            img_id = -1

                        face_stack.insert(iuvlayer,img_id)

                for i in xrange(len(face_stack),texs_stack[-1]):
                    face_stack.append(-1)

                if not img_found:
                    if data.materials:
                        if data.materials[face.mat]:
                            mat_data = data.materials[face.mat]
                            mat_colr = mat_data.rgbCol[0]
                            mat_colg = mat_data.rgbCol[1]
                            mat_colb = mat_data.rgbCol[2]
                            mat_alpha = mat_data.getAlpha()
                            mat_name = mat_data.name

                            if not mat_name in brus_stack:
                                brus_stack.append(mat_name)
                                temp_buf += write_string(mat_name) #Brush Name
                                temp_buf += write_float(mat_colr)  #Red
                                temp_buf += write_float(mat_colg)  #Green
                                temp_buf += write_float(mat_colb)  #Blue
                                temp_buf += write_float(mat_alpha) #Alpha
                                temp_buf += write_float(0)         #Shininess
                                temp_buf += write_int(1)           #Blend
                                if flag_stack[3] and data.getColorLayerNames():
                                    temp_buf += write_int(2) #Fx
                                else:
                                    temp_buf += write_int(0) #Fx

                                for i in face_stack:
                                    temp_buf += write_int(i) #Texture ID
                    else:
                        if flag_stack[3] and data.getColorLayerNames():
                            if not face_stack in brus_stack:
                                brus_stack.append(face_stack)
                                mat_count += 1
                                temp_buf += write_string("Brush.%.3i"%mat_count) #Brush Name
                                temp_buf += write_float(1) #Red
                                temp_buf += write_float(1) #Green
                                temp_buf += write_float(1) #Blue
                                temp_buf += write_float(1) #Alpha
                                temp_buf += write_float(0) #Shininess
                                temp_buf += write_int(1)   #Blend
                                temp_buf += write_int(2)   #Fx

                                for i in face_stack:
                                    temp_buf += write_int(i) #Texture ID
                else:
                    if not face_stack in brus_stack:
                        brus_stack.append(face_stack)
                        mat_count += 1
                        temp_buf += write_string("Brush.%.3i"%mat_count) #Brush Name
                        temp_buf += write_float(1) #Red
                        temp_buf += write_float(1) #Green
                        temp_buf += write_float(1) #Blue
                        temp_buf += write_float(1) #Alpha
                        temp_buf += write_float(0) #Shininess
                        temp_buf += write_int(1)   #Blend
                        if flag_stack[3] and data.getColorLayerNames():
                            temp_buf += write_int(2) #Fx
                        else:
                            temp_buf += write_int(0) #Fx

                        for i in face_stack:
                            temp_buf += write_int(i) #Texture ID

            obj_count += 1

            if orig_uvlayer:
                data.activeUVLayer = orig_uvlayer

    if len(temp_buf) > 0:
        brus_buf += write_chunk("BRUS",write_int(texs_stack[-1]) + temp_buf) #N Texs
        temp_buf = ""

    return brus_buf

#Write NODE Chunk
def write_node(objects=[]):
    global bone_stack
    global keys_stack
    root_buf = ""
    node_buf = ""
    main_buf = ""
    temp_buf = ""
    obj_count = 0
    amb_light = 0

    num_mesh = 0
    num_ligs = 0
    num_cams = 0
    num_lorc = 0
    exp_scn = Blender.Scene.GetCurrent()
    exp_con = exp_scn.getRenderingContext()

    first_frame = Blender.Draw.Create(exp_con.startFrame())
    last_frame = Blender.Draw.Create(exp_con.endFrame())
    num_frames = last_frame.val - first_frame.val

    if objects:
        exp_obj = objects
    else:
        if flag_stack[1]:
            exp_obj = Blender.Object.GetSelected()
        else:
            exp_obj = Blender.Object.Get()

    for obj in exp_obj:
        if obj.type == "Mesh":
            num_mesh += 1
        if obj.type == "Camera":
            num_cams += 1
        if obj.type == "Lamp":
            num_ligs += 1

    if flag_stack[4] == 1:
        num_lorc += num_cams

    if flag_stack[5] == 1:
        num_lorc += 1
        num_lorc += num_ligs

    if num_mesh + num_lorc > 1:
        exp_root = 1
    else:
        exp_root = 0

    if exp_root:
        root_buf += write_string("ROOT") #Node Name

        root_buf += write_float(0) #Position X
        root_buf += write_float(0) #Position Y
        root_buf += write_float(0) #Position Z

        root_buf += write_float(1) #Scale X
        root_buf += write_float(1) #Scale Y
        root_buf += write_float(1) #Scale Z

        root_buf += write_float(1) #Rotation W
        root_buf += write_float(0) #Rotation X
        root_buf += write_float(0) #Rotation Y
        root_buf += write_float(0) #Rotation Z

    for obj in exp_obj:
        if obj.type == "Mesh":
            bone_stack = []
            keys_stack = []
            data = obj.getData(mesh = True)

            arm_action = None
            if obj.getParent():
                if obj.getParent().type == "Armature":
                    arm = obj.getParent()
                    if arm.getAction():
                        arm_action = arm.getAction()

            if arm_action:
                matrix = Matrix()

                temp_buf += write_string(obj.name) #Node Name

                position = matrix.translationPart()
                temp_buf += write_float(-position[0]) #Position X
                temp_buf += write_float(position[1])  #Position Y
                temp_buf += write_float(position[2])  #Position Z

                scale = matrix.scalePart()
                temp_buf += write_float(scale[0]) #Scale X
                temp_buf += write_float(scale[2]) #Scale Y
                temp_buf += write_float(scale[1]) #Scale Z

                quat = matrix.toQuat()
                quat.normalize()

                temp_buf += write_float(quat.w) #Rotation W
                temp_buf += write_float(quat.x) #Rotation X
                temp_buf += write_float(quat.z) #Rotation Y
                temp_buf += write_float(quat.y) #Rotation Z
            else:
                matrix = obj.getMatrix("worldspace")
                matrix *= TRANS_MATRIX

                temp_buf += write_string(obj.name) #Node Name

                position = matrix.translationPart()
                temp_buf += write_float(-position[0]) #Position X
                temp_buf += write_float(position[1])  #Position Y
                temp_buf += write_float(position[2])  #Position Z

                scale = matrix.scalePart()
                temp_buf += write_float(scale[0]) #Scale X
                temp_buf += write_float(scale[2]) #Scale Y
                temp_buf += write_float(scale[1]) #Scale Z

                matrix *= RotationMatrix(180,4,"y")
                matrix *= RotationMatrix(90,4,"x")
                quat = matrix.toQuat()
                quat.normalize()

                temp_buf += write_float(quat.w) #Rotation W
                temp_buf += write_float(quat.x) #Rotation X
                temp_buf += write_float(quat.z) #Rotation Y
                temp_buf += write_float(quat.y) #Rotation Z

            if arm_action:
                Blender.Set("curframe",0)
                Blender.Window.Redraw()

                data = arm.getData()
                arm_matrix = arm.getMatrix("worldspace")
                arm_matrix *= TRANS_MATRIX.invert()

                def read_armature(arm_matrix,bone,parent = None):
                    if (parent and not bone.parent.name == parent.name):
                        return

                    matrix = Blender.Mathutils.Matrix(bone.matrix["ARMATURESPACE"])

                    if parent:
                        par_matrix = matrix * Blender.Mathutils.Matrix(parent.matrix["ARMATURESPACE"]).invert()
                    else:
                        par_matrix = matrix * arm_matrix

                    bone_stack.append([par_matrix,parent,bone])

                    if bone.children:
                        for child in bone.children: read_armature(arm_matrix,child,bone)

                for bone in data.bones.values():
                    if not bone.parent:
                        read_armature(arm_matrix,bone)

                arm_action.setActive(arm)
                frame_count = first_frame.val

                while frame_count <= last_frame.val:
                    Blender.Set("curframe",int(frame_count))
                    Blender.Window.Redraw()
                    arm_pose = arm.getPose()
                    arm_matrix = arm.getMatrix("worldspace")
                    arm_matrix *= TRANS_MATRIX

                    for bone_name in data.bones.keys():
                        bone_matrix = Blender.Mathutils.Matrix(arm_pose.bones[bone_name].poseMatrix)

                        for ibone in xrange(len(bone_stack)):
                            if bone_stack[ibone][2].name == bone_name:
                                if bone_stack[ibone][1]:
                                    par_matrix = Blender.Mathutils.Matrix(arm_pose.bones[bone_stack[ibone][1].name].poseMatrix)
                                    bone_matrix *= par_matrix.invert()
                                else:
                                    bone_matrix *= arm_matrix

                                bone_loc = bone_matrix.translationPart()
                                bone_rot = bone_matrix.rotationPart().toQuat()
                                bone_rot.normalize()
                                bone_sca = bone_matrix.scalePart()
                                keys_stack.append([frame_count - first_frame.val,bone_name,bone_loc,bone_sca,bone_rot])

                    frame_count += 1

                Blender.Set("curframe",0)
                Blender.Window.Redraw()

            temp_buf += write_node_mesh(obj,obj_count,arm_action,exp_root) #NODE MESH

            if arm_action:
                temp_buf += write_node_anim(num_frames) #NODE ANIM

                for ibone in xrange(len(bone_stack)):
                    if not bone_stack[ibone][1]:
                        temp_buf += write_node_node(ibone) #NODE NODE

            obj_count += 1

            if len(temp_buf) > 0:
                node_buf += write_chunk("NODE",temp_buf)
                temp_buf = ""

        if flag_stack[4]:
            if obj.type == "Camera":
                data = obj.getData()
                matrix = obj.getMatrix("worldspace")
                matrix *= TRANS_MATRIX

                if data.type == "ortho":
                    cam_type = 2
                    cam_zoom = round(data.scale,4)
                else:
                    cam_type = 1
                    cam_zoom = round(data.lens,4)

                cam_near = round(data.clipStart,4)
                cam_far = round(data.clipEnd,4)

                node_name = ("CAMS"+"\n%s"%obj.name+"\n%s"%cam_type+\
                             "\n%s"%cam_zoom+"\n%s"%cam_near+"\n%s"%cam_far)
                temp_buf += write_string(node_name) #Node Name

                position = matrix.translationPart()
                temp_buf += write_float(-position[0]) #Position X
                temp_buf += write_float(position[1])  #Position Y
                temp_buf += write_float(position[2])  #Position Z

                scale = matrix.scalePart()
                temp_buf += write_float(scale[0]) #Scale X
                temp_buf += write_float(scale[1]) #Scale Y
                temp_buf += write_float(scale[2]) #Scale Z

                matrix *= RotationMatrix(180,4,"y")
                quat = matrix.toQuat()
                quat.normalize()

                temp_buf += write_float(quat.w)  #Rotation W
                temp_buf += write_float(quat.x)  #Rotation X
                temp_buf += write_float(quat.y)  #Rotation Y
                temp_buf += write_float(-quat.z) #Rotation Z

                if len(temp_buf) > 0:
                    node_buf += write_chunk("NODE",temp_buf)
                    temp_buf = ""

        if flag_stack[5]:
            if amb_light == 0:
                data = Blender.World.GetCurrent()

                amb_light = 1
                amb_color = (int(data.amb[2]*255) |(int(data.amb[1]*255) << 8) | (int(data.amb[0]*255) << 16))

                node_name = ("AMBI"+"\n%s"%amb_color)
                temp_buf += write_string(node_name) #Node Name

                temp_buf += write_float(0) #Position X
                temp_buf += write_float(0) #Position Y
                temp_buf += write_float(0) #Position Z

                temp_buf += write_float(1) #Scale X
                temp_buf += write_float(1) #Scale Y
                temp_buf += write_float(1) #Scale Z

                temp_buf += write_float(1) #Rotation W
                temp_buf += write_float(0) #Rotation X
                temp_buf += write_float(0) #Rotation Y
                temp_buf += write_float(0) #Rotation Z

                if len(temp_buf) > 0:
                    node_buf += write_chunk("NODE",temp_buf)
                    temp_buf = ""

            if obj.type == "Lamp":
                data = obj.getData()
                matrix = obj.getMatrix("worldspace")
                matrix *= TRANS_MATRIX

                if data.type == 0:
                    lig_type = 2
                elif data.type == 2:
                    lig_type = 3
                else:
                    lig_type = 1

                lig_angle = round(data.spotSize,4)
                lig_color = (int(data.b*255) |(int(data.g*255) << 8) | (int(data.r*255) << 16))
                lig_range = round(data.dist,4)

                node_name = ("LIGS"+"\n%s"%obj.name+"\n%s"%lig_type+\
                             "\n%s"%lig_angle+"\n%s"%lig_color+"\n%s"%lig_range)
                temp_buf += write_string(node_name) #Node Name

                position = matrix.translationPart()
                temp_buf += write_float(-position[0]) #Position X
                temp_buf += write_float(position[1])  #Position Y
                temp_buf += write_float(position[2])  #Position Z

                scale = matrix.scalePart()
                temp_buf += write_float(scale[0]) #Scale X
                temp_buf += write_float(scale[1]) #Scale Y
                temp_buf += write_float(scale[2]) #Scale Z

                matrix *= RotationMatrix(180,4,"y")
                quat = matrix.toQuat()
                quat.normalize()

                temp_buf += write_float(quat.w)  #Rotation W
                temp_buf += write_float(quat.x)  #Rotation X
                temp_buf += write_float(quat.y)  #Rotation Y
                temp_buf += write_float(-quat.z) #Rotation Z

                if len(temp_buf) > 0:
                    node_buf += write_chunk("NODE",temp_buf)
                    temp_buf = ""

    if len(node_buf) > 0:
        if exp_root:
            main_buf += write_chunk("NODE",root_buf + node_buf)
        else:
            main_buf += node_buf

        node_buf = ""
        root_buf = ""

    return main_buf

#Write NODE MESH Chunk
def write_node_mesh(obj,obj_count,arm_action,exp_root):
    global mesh_stack
    mesh_stack = []
    mesh_buf = ""
    temp_buf = ""

    temp_buf += write_int(-1) #Brush ID
    temp_buf += write_node_mesh_vrts(obj,obj_count,arm_action,exp_root) #NODE MESH VRTS
    temp_buf += write_node_mesh_tris(obj,obj_count,arm_action,exp_root) #NODE MESH TRIS

    if len(temp_buf) > 0:
        mesh_buf += write_chunk("MESH",temp_buf)
        temp_buf = ""

    return mesh_buf

#Write NODE MESH VRTS Chunk
def write_node_mesh_vrts(obj,obj_count,arm_action,exp_root):
    vrts_buf = ""
    temp_buf = ""
    obj_flags = 0
    ids_count = 0

    data = obj.getData(mesh = True)
    orig_uvlayer = data.activeUVLayer

    if flag_stack[2]:
        obj_flags += 1

    if flag_stack[3] and data.getColorLayerNames():
        obj_flags += 2

    temp_buf += write_int(obj_flags) #Flags
    temp_buf += write_int(len(data.getUVLayerNames())) #UV Set
    temp_buf += write_int(2) #UV Set Size

    for i in data.verts:
        mesh_stack.append([-1,-1,-1,[],[[],[],[],[],[],[],[],[]],[]])

    for face in data.faces:
        for ivert,vert in enumerate(face.verts):
            if mesh_stack[vert.index][0] == -1:
                link_matrix = obj.getMatrix("worldspace")
                mesh_matrix = Matrix(link_matrix[0],link_matrix[1],link_matrix[2],link_matrix[3])
                vert_matrix = TranslationMatrix(vert.co)

                if arm_action:
                    vert_matrix *= mesh_matrix

                vert_matrix *= TRANS_MATRIX
                vert_matrix = vert_matrix.translationPart()

                mesh_stack[vert.index][0] = vert.index
                mesh_stack[vert.index][1] = vert_matrix

                if flag_stack[2]:
                    link_matrix = obj.getMatrix("worldspace")
                    mesh_matrix = Matrix(link_matrix[0],link_matrix[1],link_matrix[2],link_matrix[3])
                    norm_matrix = TranslationMatrix(vert.no)

                    if arm_action:
                        norm_matrix *= mesh_matrix

                    norm_matrix *= TRANS_MATRIX
                    norm_matrix = norm_matrix.translationPart()

                    mesh_stack[vert.index][2] = norm_matrix

                if flag_stack[3] and data.getColorLayerNames():
                    mesh_stack[vert.index][3] = face.col[ivert]

                if data.vertexUV and not data.faceUV:
		    mesh_stack[vert.index][4][0].append([face.index,vert.uvco[0]])
                if not data.vertexUV and not data.faceUV:
		    mesh_stack[vert.index][4][0].append([face.index,[0.0,0.0]])

                for vert_influ in data.getVertexInfluences(vert.index):
                    mesh_stack[vert.index][5].append(vert_influ)

    if data.faceUV:
        if not 65536 in sets_stack[obj_count]:
            vert_opti = 1
        else:
            vert_opti = 0

        for iuvlayer,uvlayer in enumerate(data.getUVLayerNames()):
            if iuvlayer < 8:
                data.activeUVLayer = uvlayer
                for face in data.faces:
                    for ivert,vert in enumerate(face.verts):
                        if vert_opti:
                            if not face.uv[ivert] in mesh_stack[vert.index][4][iuvlayer]:
				mesh_stack[vert.index][4][iuvlayer].append([face.index,face.uv[ivert]])
                        else:
			    mesh_stack[vert.index][4][iuvlayer].append([face.index,face.uv[ivert]])

    if orig_uvlayer:
        data.activeUVLayer = orig_uvlayer

    for ivert in xrange(len(mesh_stack)):
	mesh_stack[ivert][0] = ids_count
	for iuv in xrange(len(mesh_stack[ivert][4][0])):
	    ids_count += 1

            temp_buf += write_float(-mesh_stack[ivert][1].x) #X
            temp_buf += write_float(mesh_stack[ivert][1].y)  #Y
            temp_buf += write_float(mesh_stack[ivert][1].z)  #Z

            if flag_stack[2]:
                temp_buf += write_float(-mesh_stack[ivert][2].x) #NX
                temp_buf += write_float(mesh_stack[ivert][2].y)  #NY
                temp_buf += write_float(mesh_stack[ivert][2].z)  #NZ

            if flag_stack[3] and data.getColorLayerNames():
                temp_buf += write_float(mesh_stack[ivert][3].r/255.0) #R
                temp_buf += write_float(mesh_stack[ivert][3].g/255.0) #G
                temp_buf += write_float(mesh_stack[ivert][3].b/255.0) #B
                temp_buf += write_float(mesh_stack[ivert][3].a/255.0) #A

            for iuvlayer in xrange(len(data.getUVLayerNames())):
                temp_buf += write_float(mesh_stack[ivert][4][iuvlayer][iuv][1][0])  #U
                temp_buf += write_float(-mesh_stack[ivert][4][iuvlayer][iuv][1][1]) #V

    if len(temp_buf) > 0:
        vrts_buf += write_chunk("VRTS",temp_buf)
        temp_buf = ""

    return vrts_buf

#Write NODE MESH TRIS Chunk
def write_node_mesh_tris(obj,obj_count,arm_action,exp_root):
    tris_buf = ""
    temp_buf = ""
    last_brus = None
    brus_written = 0

    data = obj.getData(mesh = True)
    orig_uvlayer = data.activeUVLayer

    for face in data.faces:
        img_found = 0
        face_stack = []
        for iuvlayer,uvlayer in enumerate(data.getUVLayerNames()):
            if iuvlayer < 8:
                data.activeUVLayer = uvlayer
                if data.faceUV and face.image:
                    img_found = 1
                    for i in xrange(len(texs_stack)-1):
                        if texs_stack[i][0] == face.image.name:
                            if texs_stack[i][1] == sets_stack[obj_count][iuvlayer]:
                                img_id = i
                else:
                    img_id = -1

                face_stack.insert(iuvlayer,img_id)

        for i in xrange(len(face_stack),texs_stack[-1]):
            face_stack.append(-1)

        if img_found == 0:
            brus_id = -1
            if data.materials:
                if data.materials[face.mat]:
                    mat_name = data.materials[face.mat].name
                    for i in xrange(len(brus_stack)):
                        if brus_stack[i] == mat_name:
                            brus_id = i
            else:
                for i in xrange(len(brus_stack)):
                    if brus_stack[i] == face_stack:
                        brus_id = i
        else:
            brus_id = -1
            for i in xrange(len(brus_stack)):
                if brus_stack[i] == face_stack:
                    brus_id = i

        if last_brus <> brus_id:
            if brus_written == 0:
                brus_written = 1
            else:
                if len(temp_buf) > 0:
                    tris_buf += write_chunk("TRIS",temp_buf)
                    temp_buf = ""

            temp_buf += write_int(brus_id) #Brush ID
            last_brus = brus_id

        face_id = [0,0,0,0]

        if data.faceUV:
            for i in xrange(len(face.verts)):
                for iuv in xrange(len(mesh_stack[face.v[i].index][4][0])):
                    if mesh_stack[face.v[i].index][4][0][iuv][0] == face.index:
                        face_id[i] = mesh_stack[face.v[i].index][0] + iuv
        else:
            for i in xrange(len(face.verts)):
                face_id[i] = mesh_stack[face.v[i].index][0]

        temp_buf += write_int(face_id[2]) #A
        temp_buf += write_int(face_id[1]) #B
        temp_buf += write_int(face_id[0]) #C

        if len(face.v) == 4:
            temp_buf += write_int(face_id[3]) #A
            temp_buf += write_int(face_id[2]) #B
            temp_buf += write_int(face_id[0]) #C

    if orig_uvlayer:
        data.activeUVLayer = orig_uvlayer

    if len(temp_buf) > 0:
        tris_buf += write_chunk("TRIS",temp_buf)
        temp_buf = ""

    return tris_buf

#Write NODE ANIM Chunk
def write_node_anim(num_frames):
    anim_buf = ""
    temp_buf = ""

    temp_buf += write_int(0) #Flags
    temp_buf += write_int(num_frames) #Frames
    temp_buf += write_float(60) #FPS

    if len(temp_buf) > 0:
        anim_buf += write_chunk("ANIM",temp_buf)
        temp_buf = ""

    return anim_buf

#Write NODE NODE Chunk
def write_node_node(ibone):
    node_buf = ""
    temp_buf = ""

    matrix = bone_stack[ibone][0]
    temp_buf += write_string(bone_stack[ibone][2].name) #Node Name

    position = matrix.translationPart()
    temp_buf += write_float(-position[0]) #Position X
    temp_buf += write_float(position[1])  #Position Y
    temp_buf += write_float(position[2])  #Position Z

    scale = matrix.scalePart()
    temp_buf += write_float(scale[0]) #Scale X
    temp_buf += write_float(scale[1]) #Scale Y
    temp_buf += write_float(scale[2]) #Scale Z

    quat = matrix.toQuat()
    quat.normalize()

    temp_buf += write_float(quat.w)  #Rotation W
    temp_buf += write_float(-quat.x) #Rotation X
    temp_buf += write_float(quat.y)  #Rotation Y
    temp_buf += write_float(quat.z)  #Rotation Z

    temp_buf += write_node_bone(ibone)
    temp_buf += write_node_keys(ibone)

    for iibone in xrange(len(bone_stack)):
        if bone_stack[iibone][1] == bone_stack[ibone][2]:
            temp_buf += write_node_node(iibone)

    if len(temp_buf) > 0:
        node_buf += write_chunk("NODE",temp_buf)
        temp_buf = ""

    return node_buf

#Write NODE BONE Chunk
def write_node_bone(ibone):
    bone_buf = ""
    temp_buf = ""

    for ivert in xrange(len(mesh_stack)):
        for iuv in xrange(len(mesh_stack[ivert][4][0])):
            for vert_influ in mesh_stack[ivert][5]:
                if bone_stack[ibone][2].name == vert_influ[0]:
                    temp_buf += write_int(mesh_stack[ivert][0] + iuv) # Face Vertex ID
                    temp_buf += write_float(vert_influ[1]) #Weight

    bone_buf += write_chunk("BONE",temp_buf)
    temp_buf = ""

    return bone_buf

#Write NODE KEYS Chunk
def write_node_keys(ibone):
    keys_buf = ""
    temp_buf = ""

    temp_buf += write_int(7) #Flags

    for ikeys in xrange(len(keys_stack)):
        if keys_stack[ikeys][1] == bone_stack[ibone][2].name:
            temp_buf += write_int(keys_stack[ikeys][0]) #Frame

            position = keys_stack[ikeys][2]
            temp_buf += write_float(-position[0]) #Position X
            temp_buf += write_float(position[1])  #Position Y
            temp_buf += write_float(position[2])  #Position Z

            scale = keys_stack[ikeys][3]
            temp_buf += write_float(scale[0]) #Scale X
            temp_buf += write_float(scale[1]) #Scale Y
            temp_buf += write_float(scale[2]) #Scale Z

            quat = keys_stack[ikeys][4]
            quat.normalize()

            temp_buf += write_float(quat.w)  #Rotation W
            temp_buf += write_float(-quat.x) #Rotation X
            temp_buf += write_float(quat.y)  #Rotation Y
            temp_buf += write_float(quat.z)  #Rotation Z

    keys_buf += write_chunk("KEYS",temp_buf)
    temp_buf = ""

    return keys_buf

#Handle Event
def handle_button(event):
    global EVENT_ALL,EVENT_SEL
    global EVENT_NOR,EVENT_COL,EVENT_CAM,EVENT_LIG
    global EVENT_EXP,EVENT_QUI

    if event == EVENT_ALL:
        flag_stack[0] = 1-flag_stack[0] #All Objects
        flag_stack[1] = 1-flag_stack[1] #Selected Only
        Blender.Draw.Redraw(1)

    if event == EVENT_SEL:
        flag_stack[1] = 1-flag_stack[1] #Selected Only
        flag_stack[0] = 1-flag_stack[0] #All Objects
        Blender.Draw.Redraw(1)

    if event == EVENT_NOR:
        flag_stack[2] = 1-flag_stack[2] #Vertex Normals
        Blender.Draw.Redraw(1)

    if event == EVENT_COL:
        flag_stack[3] = 1-flag_stack[3] #Vertex Colors
        Blender.Draw.Redraw(1)

    if event == EVENT_CAM:
        flag_stack[4] = 1-flag_stack[4] #Cameras
        Blender.Draw.Redraw(1)

    if event == EVENT_LIG:
        flag_stack[5] = 1-flag_stack[5] #Lights
        Blender.Draw.Redraw(1)

    if event == EVENT_EXP:
        tmp_filename = Blender.sys.makename(ext = ".b3d")
        Blender.Window.FileSelector(savefile_callback,"Export B3D",tmp_filename)

    if event == EVENT_QUI:
        Blender.Draw.Exit()

#Handle GUI
def handle_event(event,value):
    if event == Blender.Draw.ESCKEY:
        Blender.Draw.Exit()
        return

#Draw GUI
def draw_gui():
    global EVENT_ALL,EVENT_SEL
    global EVENT_NOR,EVENT_COL,EVENT_CAM,EVENT_LIG
    global EVENT_EXP,EVENT_QUI
    button_width = 222
    button_height = 20

    def draw_rect(x,y,width,height):
        glBegin(GL_LINE_LOOP)
        glVertex2i(x,y)
        glVertex2i(x+width,y)
        glVertex2i(x+width,y-height)
        glVertex2i(x,y-height)
        glEnd()

    Blender.BGL.glClearColor(34.0/255.0,85.0/255.0,136.0/255.0,1.0)
    Blender.BGL.glClear(Blender.BGL.GL_COLOR_BUFFER_BIT)

    glColor3f(170.0/255.0,255.0/255.0,255.0/255.0)
    draw_rect(20,330,262,310)
    draw_rect(22,328,258,306)

    glColor3f(255.0/255.0,238.0/255.0,0.0/255.0)
    glRasterPos2i(70,300)
    Draw.Text("Blitz3D Exporter 2.07",'large')

    Blender.Draw.Toggle("All Objects",EVENT_ALL,40,13*button_height,button_width,button_height,flag_stack[0],"Export All Scene Objects")
    Blender.Draw.Toggle("Selected Only",EVENT_SEL,40,12*button_height,button_width,button_height,flag_stack[1],"Export Only Selected Objects")

    Blender.Draw.Toggle("Normals",EVENT_NOR,40,10*button_height,button_width,button_height,flag_stack[2],"Export Vertex Normals")
    Blender.Draw.Toggle("Vertex Colors",EVENT_COL,40,9*button_height,button_width,button_height,flag_stack[3],"Export Vertex Colors")
    Blender.Draw.Toggle("Cameras",EVENT_CAM,40,8*button_height,button_width,button_height,flag_stack[4],"Export Cameras")
    Blender.Draw.Toggle("Lights",EVENT_LIG,40,7*button_height,button_width,button_height,flag_stack[5],"Export Lights")

    Blender.Draw.Button("Export",EVENT_EXP,40,5*button_height,button_width,button_height,"Export to B3D")
    Blender.Draw.Button("Quit",EVENT_QUI,40,4*button_height,button_width,button_height,"Quit this script")

    glRasterPos2i(36,55)
    Draw.Text("Copyright (C) 2009 by Diego 'GaNDaLDF' Parisi",'small')
    glRasterPos2i(105,37)
    Draw.Text("www.gandaldf.com",'small')

#Callback Functions
def savefile_callback(filename):
    if filename == "":
        return

    if not filename.endswith(".b3d"):
	filename += ".b3d"

    if Blender.sys.exists(filename):
	result = Draw.PupMenu("File Already Exists, Overwrite?%t|Yes%x1|No%x0")
	if result != 1:
	    return

    start = Blender.sys.time()
    write_b3d_file(filename)
    end = Blender.sys.time()
    print "%s"%Blender.sys.basename(filename)+" successfully exported in %.4f seconds"%(end-start)
    Blender.Draw.Exit()
    return

#Export B3D
def export_b3d():
    flag_stack.append(1) #All Objects
    flag_stack.append(0) #Selected Only
    flag_stack.append(0) #Vertex Normals
    flag_stack.append(0) #Vertex Colors
    flag_stack.append(0) #Cameras
    flag_stack.append(0) #Lights
    draw_gui()

#Main
def main():
    export_b3d()

if __name__ == "__main__":
    Blender.Draw.Register(draw_gui,handle_event,handle_button)
    main()
"Hey Baby Wobbling Wobbling"
-Russell Peters
utzutz
Posts: 9
Joined: Thu Jun 09, 2011 10:16 am

Post by utzutz »

thanks Ravi, but I already used that script and I'm using the 2.5x blender... Alien already pointed out that the .b3d thing does not work for the 2.5x version yet!
KP84
Posts: 44
Joined: Thu Feb 24, 2011 5:08 am

Post by KP84 »

For the .x format crash:
CuteAlien wrote:I guess you could also report the blender crash to the blender guys. So maybe they fix it :-)
Could also be that you didn't assigned all vertices. Although biggest possiblity but the most nasty to check. So check first:

Maybe you have an error in your armature, propable parent child dependencies:
Blender wrote:Check your console for errors for now.
Think you shouldn't use constraints or IK's.

Code: Select all

// if you think real code is always interresting, read this line again
utzutz
Posts: 9
Joined: Thu Jun 09, 2011 10:16 am

Post by utzutz »

nice... in the meanwhile, the .x exporter still crashes, but creates a .x file, which also works, but... there's no texture applied. I do not know how that works, but the textures are just left blank.

- what can be the problem ?
Post Reply