def fbx2egg(fbx_path, egg_path):
    manager, scene = FbxCommon.InitializeSdkObjects()
    FbxCommon.LoadScene(manager, scene, fbx_path)

    prepare_scene(scene)

    data = EggData()
    data.addChild(EggCoordinateSystem(CSYupRight)) # TODO: read coordinate system from fbx

    group = EggGroup("walking") # TODO: get name from fbx anim layer
    group.setDartType(EggGroup.DTDefault)

    traverse_joints(scene, scene.GetRootNode(), group)

    data.addChild(group)
    data.writeEgg(egg_path)
def traverse_joints(fbx_scene, fbx_node, egg_parent):
    for i in range(fbx_node.GetChildCount()):
        fbx_child = fbx_node.GetChild(i)

        if fbx_child.GetSkeleton() is None:
            # we're only concerned with the skeleton for now
            continue

        fbx_transform = fbx_child.EvaluateLocalTransform()
        egg_transform = convert_fbx_matrix(fbx_transform)

        egg_joint = EggGroup(fbx_child.GetName())
        egg_joint.setGroupType(EggGroup.GTJoint)
        egg_joint.setTransform3d(egg_transform)

        egg_parent.addChild(egg_joint)

        traverse_joints(fbx_scene, fbx_child, egg_joint)
Example #3
0
	def __facestoegg(self, egg, objname, groupname):
		selectedfaces = self.__facesby(objname, groupname)
		if len(selectedfaces) == 0:
			return self
		eobj = EggGroup(objname)
		egg.addChild(eobj)
		egrp = EggGroup(groupname)
		eobj.addChild(egrp)
		evpool = EggVertexPool(groupname)
		egrp.addChild(evpool)
		for face in selectedfaces:
			vlist, mdata = face
			wobj, wgrp, wmat = mdata
			epoly = EggPolygon()
			egrp.addChild(epoly)
			self.__eggifymats(epoly, wmat)
			self.__eggifyverts(epoly, evpool, vlist)
		#; each matching face
		return self
Example #4
0
 def __polylinestoegg(self, egg, objname, groupname):
     selectedlines = self.__linesby(objname, groupname)
     if len(selectedlines) == 0:
         return self
     eobj = EggGroup(objname)
     egg.addChild(eobj)
     egrp = EggGroup(groupname)
     eobj.addChild(egrp)
     evpool = EggVertexPool(groupname)
     egrp.addChild(evpool)
     for line in selectedlines:
         vlist, mdata = line
         wobj, wgrp, wmat = mdata
         eline = EggLine()
         egrp.addChild(eline)
         self.__eggifymats(eline, wmat)
         self.__eggifyverts(eline, evpool, vlist)
     #; each matching line
     return self
Example #5
0
class createNurbsCurve():
    def __init__(self):
        self.data = EggData()
        self.vtxPool = EggVertexPool('mopath')
        self.data.addChild(self.vtxPool)
        self.eggGroup = EggGroup('group')
        self.data.addChild(self.eggGroup)
        self.myverts = []

    def addPoint(self, pos):
        eggVtx = EggVertex()
        eggVtx.setPos(Point3D(pos[0], pos[1], pos[2]))
        self.myverts.append(eggVtx)
        self.vtxPool.addVertex(eggVtx)

    def getNodepath(self):
        myCurve = EggNurbsCurve()
        myCurve.setup(3, len(self.myverts) + 3)
        myCurve.setCurveType(1)
        for i in self.myverts:
            myCurve.addVertex(i)
        self.eggGroup.addChild(myCurve)
        return NodePath(loadEggData(self.data))
Example #6
0
    def make_light(self, parent_node, obj):
        LIGHT_TYPES = {
            'POINT': 'PointLight',
            'SPOT': 'SpotLight',
        }

        egg_group = EggGroup(obj.name)
        egg_group.set_tag('type', 'Light')
        egg_group.set_tag('light', LIGHT_TYPES[obj.data.type])

        egg_group.set_tag('color', json.dumps(tuple(obj.data.color)))
        egg_group.set_tag('scale', json.dumps(tuple(obj.scale)))
        egg_group.set_tag('energy', '{:.3f}'.format(obj.data.energy))
        egg_group.set_tag('far', '{:.3f}'.format(obj.data.shadow_soft_size))

        if obj.data.type == 'SPOT':
            egg_group.set_tag(
                'fov', '{:.3f}'.format(math.degrees(obj.data.spot_size)))

        self._setup_node(egg_group, obj)
        parent_node.add_child(egg_group)

        return egg_group
Example #7
0
    def make_armature(self, parent_node, armature):
        egg_group = EggGroup(armature.name)
        egg_group.set_dart_type(EggGroup.DT_structured)

        egg_joints = {}

        for bone_name, bone in armature.data.bones.items():
            bone_matrix = get_bone_matrix(bone, armature)

            egg_transform = EggTransform()
            egg_transform.add_matrix4(matrix_to_panda(bone_matrix))

            egg_joint = EggGroup(bone_name)
            egg_joint.set_group_type(EggGroup.GT_joint)
            egg_joint.add_matrix4(matrix_to_panda(bone_matrix))
            egg_joint.set_default_pose(egg_transform)

            if bone.parent:
                egg_joints[bone.parent.name].add_child(egg_joint)
            else:  # root bone
                egg_group.add_child(egg_joint)

            egg_joints[bone_name] = egg_joint

        self._setup_node(egg_group, armature)
        parent_node.add_child(egg_group)

        return egg_group