diff --git a/io_scene_fbx/export_fbx.py b/io_scene_fbx/export_fbx.py index d3e35f6418fde339bf3386ae447f8f9e205356de..d38ff1b93a7e4f1f288d0be348943f0207eaed7e 100644 --- a/io_scene_fbx/export_fbx.py +++ b/io_scene_fbx/export_fbx.py @@ -400,17 +400,20 @@ def save_single(operator, scene, filepath="", operator.report({'ERROR'}, "Could'nt open file %r" % filepath) return {'CANCELLED'} + # convenience + fw = file.write + # scene = context.scene # now passed as an arg instead of context world = scene.world # ---------------------------- Write the header first - file.write(header_comment) + fw(header_comment) if use_metadata: curtime = time.localtime()[0:6] else: curtime = (0, 0, 0, 0, 0, 0) # - file.write(\ + fw( '''FBXHeaderExtension: { FBXHeaderVersion: 1003 FBXVersion: 6100 @@ -430,8 +433,8 @@ def save_single(operator, scene, filepath="", } }''' % (curtime)) - file.write('\nCreationTime: "%.4i-%.2i-%.2i %.2i:%.2i:%.2i:000"' % curtime) - file.write('\nCreator: "Blender version %s"' % bpy.app.version_string) + fw('\nCreationTime: "%.4i-%.2i-%.2i %.2i:%.2i:%.2i:000"' % curtime) + fw('\nCreator: "Blender version %s"' % bpy.app.version_string) pose_items = [] # list of (fbxName, matrix) to write pose data for, easier to collect allong the way @@ -504,9 +507,9 @@ def save_single(operator, scene, filepath="", ''' loc, rot, scale, matrix, matrix_rot = object_tx(ob, loc, matrix, matrix_mod) - file.write('\n\t\t\tProperty: "Lcl Translation", "Lcl Translation", "A+",%.15f,%.15f,%.15f' % loc) - file.write('\n\t\t\tProperty: "Lcl Rotation", "Lcl Rotation", "A+",%.15f,%.15f,%.15f' % tuple_rad_to_deg(rot)) - file.write('\n\t\t\tProperty: "Lcl Scaling", "Lcl Scaling", "A+",%.15f,%.15f,%.15f' % scale) + fw('\n\t\t\tProperty: "Lcl Translation", "Lcl Translation", "A+",%.15f,%.15f,%.15f' % loc) + fw('\n\t\t\tProperty: "Lcl Rotation", "Lcl Rotation", "A+",%.15f,%.15f,%.15f' % tuple_rad_to_deg(rot)) + fw('\n\t\t\tProperty: "Lcl Scaling", "Lcl Scaling", "A+",%.15f,%.15f,%.15f' % scale) return loc, rot, scale, matrix, matrix_rot def get_constraints(ob=None): @@ -552,7 +555,7 @@ def save_single(operator, scene, filepath="", # if the type is 0 its an empty otherwise its a mesh # only difference at the moment is one has a color - file.write(''' + fw(''' Properties60: { Property: "QuaternionInterpolate", "bool", "",0 Property: "Visibility", "Visibility", "A+",1''') @@ -568,131 +571,131 @@ def save_single(operator, scene, filepath="", # eEULER_ZXY # eEULER_ZYX - file.write('\n\t\t\tProperty: "RotationOffset", "Vector3D", "",0,0,0' - '\n\t\t\tProperty: "RotationPivot", "Vector3D", "",0,0,0' - '\n\t\t\tProperty: "ScalingOffset", "Vector3D", "",0,0,0' - '\n\t\t\tProperty: "ScalingPivot", "Vector3D", "",0,0,0' - '\n\t\t\tProperty: "TranslationActive", "bool", "",0' - ) - - file.write('\n\t\t\tProperty: "TranslationMin", "Vector3D", "",%.15g,%.15g,%.15g' % constraints["loc_min"]) - file.write('\n\t\t\tProperty: "TranslationMax", "Vector3D", "",%.15g,%.15g,%.15g' % constraints["loc_max"]) - file.write('\n\t\t\tProperty: "TranslationMinX", "bool", "",%d' % constraints["loc_limit"][0]) - file.write('\n\t\t\tProperty: "TranslationMinY", "bool", "",%d' % constraints["loc_limit"][1]) - file.write('\n\t\t\tProperty: "TranslationMinZ", "bool", "",%d' % constraints["loc_limit"][2]) - file.write('\n\t\t\tProperty: "TranslationMaxX", "bool", "",%d' % constraints["loc_limit"][3]) - file.write('\n\t\t\tProperty: "TranslationMaxY", "bool", "",%d' % constraints["loc_limit"][4]) - file.write('\n\t\t\tProperty: "TranslationMaxZ", "bool", "",%d' % constraints["loc_limit"][5]) - - file.write('\n\t\t\tProperty: "RotationOrder", "enum", "",0' - '\n\t\t\tProperty: "RotationSpaceForLimitOnly", "bool", "",0' - '\n\t\t\tProperty: "AxisLen", "double", "",10' - '\n\t\t\tProperty: "PreRotation", "Vector3D", "",0,0,0' - '\n\t\t\tProperty: "PostRotation", "Vector3D", "",0,0,0' - '\n\t\t\tProperty: "RotationActive", "bool", "",0' - ) - - file.write('\n\t\t\tProperty: "RotationMin", "Vector3D", "",%.15g,%.15g,%.15g' % constraints["rot_min"]) - file.write('\n\t\t\tProperty: "RotationMax", "Vector3D", "",%.15g,%.15g,%.15g' % constraints["rot_max"]) - file.write('\n\t\t\tProperty: "RotationMinX", "bool", "",%d' % constraints["rot_limit"][0]) - file.write('\n\t\t\tProperty: "RotationMinY", "bool", "",%d' % constraints["rot_limit"][1]) - file.write('\n\t\t\tProperty: "RotationMinZ", "bool", "",%d' % constraints["rot_limit"][2]) - file.write('\n\t\t\tProperty: "RotationMaxX", "bool", "",%d' % constraints["rot_limit"][0]) - file.write('\n\t\t\tProperty: "RotationMaxY", "bool", "",%d' % constraints["rot_limit"][1]) - file.write('\n\t\t\tProperty: "RotationMaxZ", "bool", "",%d' % constraints["rot_limit"][2]) - - file.write('\n\t\t\tProperty: "RotationStiffnessX", "double", "",0' - '\n\t\t\tProperty: "RotationStiffnessY", "double", "",0' - '\n\t\t\tProperty: "RotationStiffnessZ", "double", "",0' - '\n\t\t\tProperty: "MinDampRangeX", "double", "",0' - '\n\t\t\tProperty: "MinDampRangeY", "double", "",0' - '\n\t\t\tProperty: "MinDampRangeZ", "double", "",0' - '\n\t\t\tProperty: "MaxDampRangeX", "double", "",0' - '\n\t\t\tProperty: "MaxDampRangeY", "double", "",0' - '\n\t\t\tProperty: "MaxDampRangeZ", "double", "",0' - '\n\t\t\tProperty: "MinDampStrengthX", "double", "",0' - '\n\t\t\tProperty: "MinDampStrengthY", "double", "",0' - '\n\t\t\tProperty: "MinDampStrengthZ", "double", "",0' - '\n\t\t\tProperty: "MaxDampStrengthX", "double", "",0' - '\n\t\t\tProperty: "MaxDampStrengthY", "double", "",0' - '\n\t\t\tProperty: "MaxDampStrengthZ", "double", "",0' - '\n\t\t\tProperty: "PreferedAngleX", "double", "",0' - '\n\t\t\tProperty: "PreferedAngleY", "double", "",0' - '\n\t\t\tProperty: "PreferedAngleZ", "double", "",0' - '\n\t\t\tProperty: "InheritType", "enum", "",0' - '\n\t\t\tProperty: "ScalingActive", "bool", "",0' - ) - - file.write('\n\t\t\tProperty: "ScalingMin", "Vector3D", "",%.15g,%.15g,%.15g' % constraints["sca_min"]) - file.write('\n\t\t\tProperty: "ScalingMax", "Vector3D", "",%.15g,%.15g,%.15g' % constraints["sca_max"]) - file.write('\n\t\t\tProperty: "ScalingMinX", "bool", "",%d' % constraints["sca_limit"][0]) - file.write('\n\t\t\tProperty: "ScalingMinY", "bool", "",%d' % constraints["sca_limit"][1]) - file.write('\n\t\t\tProperty: "ScalingMinZ", "bool", "",%d' % constraints["sca_limit"][2]) - file.write('\n\t\t\tProperty: "ScalingMaxX", "bool", "",%d' % constraints["sca_limit"][3]) - file.write('\n\t\t\tProperty: "ScalingMaxY", "bool", "",%d' % constraints["sca_limit"][4]) - file.write('\n\t\t\tProperty: "ScalingMaxZ", "bool", "",%d' % constraints["sca_limit"][5]) - - file.write('\n\t\t\tProperty: "GeometricTranslation", "Vector3D", "",0,0,0' - '\n\t\t\tProperty: "GeometricRotation", "Vector3D", "",0,0,0' - '\n\t\t\tProperty: "GeometricScaling", "Vector3D", "",1,1,1' - '\n\t\t\tProperty: "LookAtProperty", "object", ""' - '\n\t\t\tProperty: "UpVectorProperty", "object", ""' - '\n\t\t\tProperty: "Show", "bool", "",1' - '\n\t\t\tProperty: "NegativePercentShapeSupport", "bool", "",1' - '\n\t\t\tProperty: "DefaultAttributeIndex", "int", "",0' - ) + fw('\n\t\t\tProperty: "RotationOffset", "Vector3D", "",0,0,0' + '\n\t\t\tProperty: "RotationPivot", "Vector3D", "",0,0,0' + '\n\t\t\tProperty: "ScalingOffset", "Vector3D", "",0,0,0' + '\n\t\t\tProperty: "ScalingPivot", "Vector3D", "",0,0,0' + '\n\t\t\tProperty: "TranslationActive", "bool", "",0' + ) + + fw('\n\t\t\tProperty: "TranslationMin", "Vector3D", "",%.15g,%.15g,%.15g' % constraints["loc_min"]) + fw('\n\t\t\tProperty: "TranslationMax", "Vector3D", "",%.15g,%.15g,%.15g' % constraints["loc_max"]) + fw('\n\t\t\tProperty: "TranslationMinX", "bool", "",%d' % constraints["loc_limit"][0]) + fw('\n\t\t\tProperty: "TranslationMinY", "bool", "",%d' % constraints["loc_limit"][1]) + fw('\n\t\t\tProperty: "TranslationMinZ", "bool", "",%d' % constraints["loc_limit"][2]) + fw('\n\t\t\tProperty: "TranslationMaxX", "bool", "",%d' % constraints["loc_limit"][3]) + fw('\n\t\t\tProperty: "TranslationMaxY", "bool", "",%d' % constraints["loc_limit"][4]) + fw('\n\t\t\tProperty: "TranslationMaxZ", "bool", "",%d' % constraints["loc_limit"][5]) + + fw('\n\t\t\tProperty: "RotationOrder", "enum", "",0' + '\n\t\t\tProperty: "RotationSpaceForLimitOnly", "bool", "",0' + '\n\t\t\tProperty: "AxisLen", "double", "",10' + '\n\t\t\tProperty: "PreRotation", "Vector3D", "",0,0,0' + '\n\t\t\tProperty: "PostRotation", "Vector3D", "",0,0,0' + '\n\t\t\tProperty: "RotationActive", "bool", "",0' + ) + + fw('\n\t\t\tProperty: "RotationMin", "Vector3D", "",%.15g,%.15g,%.15g' % constraints["rot_min"]) + fw('\n\t\t\tProperty: "RotationMax", "Vector3D", "",%.15g,%.15g,%.15g' % constraints["rot_max"]) + fw('\n\t\t\tProperty: "RotationMinX", "bool", "",%d' % constraints["rot_limit"][0]) + fw('\n\t\t\tProperty: "RotationMinY", "bool", "",%d' % constraints["rot_limit"][1]) + fw('\n\t\t\tProperty: "RotationMinZ", "bool", "",%d' % constraints["rot_limit"][2]) + fw('\n\t\t\tProperty: "RotationMaxX", "bool", "",%d' % constraints["rot_limit"][0]) + fw('\n\t\t\tProperty: "RotationMaxY", "bool", "",%d' % constraints["rot_limit"][1]) + fw('\n\t\t\tProperty: "RotationMaxZ", "bool", "",%d' % constraints["rot_limit"][2]) + + fw('\n\t\t\tProperty: "RotationStiffnessX", "double", "",0' + '\n\t\t\tProperty: "RotationStiffnessY", "double", "",0' + '\n\t\t\tProperty: "RotationStiffnessZ", "double", "",0' + '\n\t\t\tProperty: "MinDampRangeX", "double", "",0' + '\n\t\t\tProperty: "MinDampRangeY", "double", "",0' + '\n\t\t\tProperty: "MinDampRangeZ", "double", "",0' + '\n\t\t\tProperty: "MaxDampRangeX", "double", "",0' + '\n\t\t\tProperty: "MaxDampRangeY", "double", "",0' + '\n\t\t\tProperty: "MaxDampRangeZ", "double", "",0' + '\n\t\t\tProperty: "MinDampStrengthX", "double", "",0' + '\n\t\t\tProperty: "MinDampStrengthY", "double", "",0' + '\n\t\t\tProperty: "MinDampStrengthZ", "double", "",0' + '\n\t\t\tProperty: "MaxDampStrengthX", "double", "",0' + '\n\t\t\tProperty: "MaxDampStrengthY", "double", "",0' + '\n\t\t\tProperty: "MaxDampStrengthZ", "double", "",0' + '\n\t\t\tProperty: "PreferedAngleX", "double", "",0' + '\n\t\t\tProperty: "PreferedAngleY", "double", "",0' + '\n\t\t\tProperty: "PreferedAngleZ", "double", "",0' + '\n\t\t\tProperty: "InheritType", "enum", "",0' + '\n\t\t\tProperty: "ScalingActive", "bool", "",0' + ) + + fw('\n\t\t\tProperty: "ScalingMin", "Vector3D", "",%.15g,%.15g,%.15g' % constraints["sca_min"]) + fw('\n\t\t\tProperty: "ScalingMax", "Vector3D", "",%.15g,%.15g,%.15g' % constraints["sca_max"]) + fw('\n\t\t\tProperty: "ScalingMinX", "bool", "",%d' % constraints["sca_limit"][0]) + fw('\n\t\t\tProperty: "ScalingMinY", "bool", "",%d' % constraints["sca_limit"][1]) + fw('\n\t\t\tProperty: "ScalingMinZ", "bool", "",%d' % constraints["sca_limit"][2]) + fw('\n\t\t\tProperty: "ScalingMaxX", "bool", "",%d' % constraints["sca_limit"][3]) + fw('\n\t\t\tProperty: "ScalingMaxY", "bool", "",%d' % constraints["sca_limit"][4]) + fw('\n\t\t\tProperty: "ScalingMaxZ", "bool", "",%d' % constraints["sca_limit"][5]) + + fw('\n\t\t\tProperty: "GeometricTranslation", "Vector3D", "",0,0,0' + '\n\t\t\tProperty: "GeometricRotation", "Vector3D", "",0,0,0' + '\n\t\t\tProperty: "GeometricScaling", "Vector3D", "",1,1,1' + '\n\t\t\tProperty: "LookAtProperty", "object", ""' + '\n\t\t\tProperty: "UpVectorProperty", "object", ""' + '\n\t\t\tProperty: "Show", "bool", "",1' + '\n\t\t\tProperty: "NegativePercentShapeSupport", "bool", "",1' + '\n\t\t\tProperty: "DefaultAttributeIndex", "int", "",0' + ) if ob and not isinstance(ob, bpy.types.Bone): # Only mesh objects have color - file.write('\n\t\t\tProperty: "Color", "Color", "A",0.8,0.8,0.8' - '\n\t\t\tProperty: "Size", "double", "",100' - '\n\t\t\tProperty: "Look", "enum", "",1' - ) + fw('\n\t\t\tProperty: "Color", "Color", "A",0.8,0.8,0.8' + '\n\t\t\tProperty: "Size", "double", "",100' + '\n\t\t\tProperty: "Look", "enum", "",1' + ) return loc, rot, scale, matrix, matrix_rot # -------------------------------------------- Armatures #def write_bone(bone, name, matrix_mod): def write_bone(my_bone): - file.write('\n\tModel: "Model::%s", "Limb" {' % my_bone.fbxName) - file.write('\n\t\tVersion: 232') + fw('\n\tModel: "Model::%s", "Limb" {' % my_bone.fbxName) + fw('\n\t\tVersion: 232') #poseMatrix = write_object_props(my_bone.blenBone, None, None, my_bone.fbxArm.parRelMatrix())[3] poseMatrix = write_object_props(my_bone.blenBone, pose_bone=my_bone.getPoseBone())[3] # dont apply bone matricies anymore pose_items.append((my_bone.fbxName, poseMatrix)) - # file.write('\n\t\t\tProperty: "Size", "double", "",%.6f' % ((my_bone.blenData.head['ARMATURESPACE'] - my_bone.blenData.tail['ARMATURESPACE']) * my_bone.fbxArm.parRelMatrix()).length) - file.write('\n\t\t\tProperty: "Size", "double", "",1') + # fw('\n\t\t\tProperty: "Size", "double", "",%.6f' % ((my_bone.blenData.head['ARMATURESPACE'] - my_bone.blenData.tail['ARMATURESPACE']) * my_bone.fbxArm.parRelMatrix()).length) + fw('\n\t\t\tProperty: "Size", "double", "",1') #((my_bone.blenData.head['ARMATURESPACE'] * my_bone.fbxArm.matrixWorld) - (my_bone.blenData.tail['ARMATURESPACE'] * my_bone.fbxArm.parRelMatrix())).length) """ - file.write('\n\t\t\tProperty: "LimbLength", "double", "",%.6f' %\ + fw('\n\t\t\tProperty: "LimbLength", "double", "",%.6f' %\ ((my_bone.blenBone.head['ARMATURESPACE'] - my_bone.blenBone.tail['ARMATURESPACE']) * my_bone.fbxArm.parRelMatrix()).length) """ - file.write('\n\t\t\tProperty: "LimbLength", "double", "",%.6f' % - (my_bone.blenBone.head_local - my_bone.blenBone.tail_local).length) - - #file.write('\n\t\t\tProperty: "LimbLength", "double", "",1') - file.write('\n\t\t\tProperty: "Color", "ColorRGB", "",0.8,0.8,0.8' - '\n\t\t\tProperty: "Color", "Color", "A",0.8,0.8,0.8' - '\n\t\t}' - '\n\t\tMultiLayer: 0' - '\n\t\tMultiTake: 1' - '\n\t\tShading: Y' - '\n\t\tCulling: "CullingOff"' - '\n\t\tTypeFlags: "Skeleton"' - '\n\t}' - ) + fw('\n\t\t\tProperty: "LimbLength", "double", "",%.6f' % + (my_bone.blenBone.head_local - my_bone.blenBone.tail_local).length) + + #fw('\n\t\t\tProperty: "LimbLength", "double", "",1') + fw('\n\t\t\tProperty: "Color", "ColorRGB", "",0.8,0.8,0.8' + '\n\t\t\tProperty: "Color", "Color", "A",0.8,0.8,0.8' + '\n\t\t}' + '\n\t\tMultiLayer: 0' + '\n\t\tMultiTake: 1' + '\n\t\tShading: Y' + '\n\t\tCulling: "CullingOff"' + '\n\t\tTypeFlags: "Skeleton"' + '\n\t}' + ) def write_camera_switch(): - file.write(''' + fw(''' Model: "Model::Camera Switcher", "CameraSwitcher" { Version: 232''') write_object_props() - file.write(''' + fw(''' Property: "Color", "Color", "A",0.8,0.8,0.8 Property: "Camera Index", "Integer", "A+",100 } @@ -709,102 +712,103 @@ def save_single(operator, scene, filepath="", }''') def write_camera_dummy(name, loc, near, far, proj_type, up): - file.write('\n\tModel: "Model::%s", "Camera" {' % name) - file.write('\n\t\tVersion: 232') + fw('\n\tModel: "Model::%s", "Camera" {' % name) + fw('\n\t\tVersion: 232') write_object_props(None, loc) - file.write('\n\t\t\tProperty: "Color", "Color", "A",0.8,0.8,0.8' - '\n\t\t\tProperty: "Roll", "Roll", "A+",0' - '\n\t\t\tProperty: "FieldOfView", "FieldOfView", "A+",40' - '\n\t\t\tProperty: "FieldOfViewX", "FieldOfView", "A+",1' - '\n\t\t\tProperty: "FieldOfViewY", "FieldOfView", "A+",1' - '\n\t\t\tProperty: "OpticalCenterX", "Real", "A+",0' - '\n\t\t\tProperty: "OpticalCenterY", "Real", "A+",0' - '\n\t\t\tProperty: "BackgroundColor", "Color", "A+",0.63,0.63,0.63' - '\n\t\t\tProperty: "TurnTable", "Real", "A+",0' - '\n\t\t\tProperty: "DisplayTurnTableIcon", "bool", "",1' - '\n\t\t\tProperty: "Motion Blur Intensity", "Real", "A+",1' - '\n\t\t\tProperty: "UseMotionBlur", "bool", "",0' - '\n\t\t\tProperty: "UseRealTimeMotionBlur", "bool", "",1' - '\n\t\t\tProperty: "ResolutionMode", "enum", "",0' - '\n\t\t\tProperty: "ApertureMode", "enum", "",2' - '\n\t\t\tProperty: "GateFit", "enum", "",0' - '\n\t\t\tProperty: "FocalLength", "Real", "A+",21.3544940948486' - '\n\t\t\tProperty: "CameraFormat", "enum", "",0' - '\n\t\t\tProperty: "AspectW", "double", "",320' - '\n\t\t\tProperty: "AspectH", "double", "",200' - '\n\t\t\tProperty: "PixelAspectRatio", "double", "",1' - '\n\t\t\tProperty: "UseFrameColor", "bool", "",0' - '\n\t\t\tProperty: "FrameColor", "ColorRGB", "",0.3,0.3,0.3' - '\n\t\t\tProperty: "ShowName", "bool", "",1' - '\n\t\t\tProperty: "ShowGrid", "bool", "",1' - '\n\t\t\tProperty: "ShowOpticalCenter", "bool", "",0' - '\n\t\t\tProperty: "ShowAzimut", "bool", "",1' - '\n\t\t\tProperty: "ShowTimeCode", "bool", "",0' - ) - - file.write('\n\t\t\tProperty: "NearPlane", "double", "",%.6f' % near) - file.write('\n\t\t\tProperty: "FarPlane", "double", "",%.6f' % far) - - file.write('\n\t\t\tProperty: "FilmWidth", "double", "",0.816' - '\n\t\t\tProperty: "FilmHeight", "double", "",0.612' - '\n\t\t\tProperty: "FilmAspectRatio", "double", "",1.33333333333333' - '\n\t\t\tProperty: "FilmSqueezeRatio", "double", "",1' - '\n\t\t\tProperty: "FilmFormatIndex", "enum", "",4' - '\n\t\t\tProperty: "ViewFrustum", "bool", "",1' - '\n\t\t\tProperty: "ViewFrustumNearFarPlane", "bool", "",0' - '\n\t\t\tProperty: "ViewFrustumBackPlaneMode", "enum", "",2' - '\n\t\t\tProperty: "BackPlaneDistance", "double", "",100' - '\n\t\t\tProperty: "BackPlaneDistanceMode", "enum", "",0' - '\n\t\t\tProperty: "ViewCameraToLookAt", "bool", "",1' - '\n\t\t\tProperty: "LockMode", "bool", "",0' - '\n\t\t\tProperty: "LockInterestNavigation", "bool", "",0' - '\n\t\t\tProperty: "FitImage", "bool", "",0' - '\n\t\t\tProperty: "Crop", "bool", "",0' - '\n\t\t\tProperty: "Center", "bool", "",1' - '\n\t\t\tProperty: "KeepRatio", "bool", "",1' - '\n\t\t\tProperty: "BackgroundMode", "enum", "",0' - '\n\t\t\tProperty: "BackgroundAlphaTreshold", "double", "",0.5' - '\n\t\t\tProperty: "ForegroundTransparent", "bool", "",1' - '\n\t\t\tProperty: "DisplaySafeArea", "bool", "",0' - '\n\t\t\tProperty: "SafeAreaDisplayStyle", "enum", "",1' - '\n\t\t\tProperty: "SafeAreaAspectRatio", "double", "",1.33333333333333' - '\n\t\t\tProperty: "Use2DMagnifierZoom", "bool", "",0' - '\n\t\t\tProperty: "2D Magnifier Zoom", "Real", "A+",100' - '\n\t\t\tProperty: "2D Magnifier X", "Real", "A+",50' - '\n\t\t\tProperty: "2D Magnifier Y", "Real", "A+",50' - ) - - file.write('\n\t\t\tProperty: "CameraProjectionType", "enum", "",%i' % proj_type) - - file.write('\n\t\t\tProperty: "UseRealTimeDOFAndAA", "bool", "",0' - '\n\t\t\tProperty: "UseDepthOfField", "bool", "",0' - '\n\t\t\tProperty: "FocusSource", "enum", "",0' - '\n\t\t\tProperty: "FocusAngle", "double", "",3.5' - '\n\t\t\tProperty: "FocusDistance", "double", "",200' - '\n\t\t\tProperty: "UseAntialiasing", "bool", "",0' - '\n\t\t\tProperty: "AntialiasingIntensity", "double", "",0.77777' - '\n\t\t\tProperty: "UseAccumulationBuffer", "bool", "",0' - '\n\t\t\tProperty: "FrameSamplingCount", "int", "",7' - '\n\t\t}' - '\n\t\tMultiLayer: 0' - '\n\t\tMultiTake: 0' - '\n\t\tHidden: "True"' - '\n\t\tShading: Y' - '\n\t\tCulling: "CullingOff"' - '\n\t\tTypeFlags: "Camera"' - '\n\t\tGeometryVersion: 124' - ) - - file.write('\n\t\tPosition: %.6f,%.6f,%.6f' % loc) - file.write('\n\t\tUp: %i,%i,%i' % up) - - file.write('\n\t\tLookAt: 0,0,0' - '\n\t\tShowInfoOnMoving: 1' - '\n\t\tShowAudio: 0' - '\n\t\tAudioColor: 0,1,0' - '\n\t\tCameraOrthoZoom: 1' - '\n\t}') + fw('\n\t\t\tProperty: "Color", "Color", "A",0.8,0.8,0.8' + '\n\t\t\tProperty: "Roll", "Roll", "A+",0' + '\n\t\t\tProperty: "FieldOfView", "FieldOfView", "A+",40' + '\n\t\t\tProperty: "FieldOfViewX", "FieldOfView", "A+",1' + '\n\t\t\tProperty: "FieldOfViewY", "FieldOfView", "A+",1' + '\n\t\t\tProperty: "OpticalCenterX", "Real", "A+",0' + '\n\t\t\tProperty: "OpticalCenterY", "Real", "A+",0' + '\n\t\t\tProperty: "BackgroundColor", "Color", "A+",0.63,0.63,0.63' + '\n\t\t\tProperty: "TurnTable", "Real", "A+",0' + '\n\t\t\tProperty: "DisplayTurnTableIcon", "bool", "",1' + '\n\t\t\tProperty: "Motion Blur Intensity", "Real", "A+",1' + '\n\t\t\tProperty: "UseMotionBlur", "bool", "",0' + '\n\t\t\tProperty: "UseRealTimeMotionBlur", "bool", "",1' + '\n\t\t\tProperty: "ResolutionMode", "enum", "",0' + '\n\t\t\tProperty: "ApertureMode", "enum", "",2' + '\n\t\t\tProperty: "GateFit", "enum", "",0' + '\n\t\t\tProperty: "FocalLength", "Real", "A+",21.3544940948486' + '\n\t\t\tProperty: "CameraFormat", "enum", "",0' + '\n\t\t\tProperty: "AspectW", "double", "",320' + '\n\t\t\tProperty: "AspectH", "double", "",200' + '\n\t\t\tProperty: "PixelAspectRatio", "double", "",1' + '\n\t\t\tProperty: "UseFrameColor", "bool", "",0' + '\n\t\t\tProperty: "FrameColor", "ColorRGB", "",0.3,0.3,0.3' + '\n\t\t\tProperty: "ShowName", "bool", "",1' + '\n\t\t\tProperty: "ShowGrid", "bool", "",1' + '\n\t\t\tProperty: "ShowOpticalCenter", "bool", "",0' + '\n\t\t\tProperty: "ShowAzimut", "bool", "",1' + '\n\t\t\tProperty: "ShowTimeCode", "bool", "",0' + ) + + fw('\n\t\t\tProperty: "NearPlane", "double", "",%.6f' % near) + fw('\n\t\t\tProperty: "FarPlane", "double", "",%.6f' % far) + + fw('\n\t\t\tProperty: "FilmWidth", "double", "",0.816' + '\n\t\t\tProperty: "FilmHeight", "double", "",0.612' + '\n\t\t\tProperty: "FilmAspectRatio", "double", "",1.33333333333333' + '\n\t\t\tProperty: "FilmSqueezeRatio", "double", "",1' + '\n\t\t\tProperty: "FilmFormatIndex", "enum", "",4' + '\n\t\t\tProperty: "ViewFrustum", "bool", "",1' + '\n\t\t\tProperty: "ViewFrustumNearFarPlane", "bool", "",0' + '\n\t\t\tProperty: "ViewFrustumBackPlaneMode", "enum", "",2' + '\n\t\t\tProperty: "BackPlaneDistance", "double", "",100' + '\n\t\t\tProperty: "BackPlaneDistanceMode", "enum", "",0' + '\n\t\t\tProperty: "ViewCameraToLookAt", "bool", "",1' + '\n\t\t\tProperty: "LockMode", "bool", "",0' + '\n\t\t\tProperty: "LockInterestNavigation", "bool", "",0' + '\n\t\t\tProperty: "FitImage", "bool", "",0' + '\n\t\t\tProperty: "Crop", "bool", "",0' + '\n\t\t\tProperty: "Center", "bool", "",1' + '\n\t\t\tProperty: "KeepRatio", "bool", "",1' + '\n\t\t\tProperty: "BackgroundMode", "enum", "",0' + '\n\t\t\tProperty: "BackgroundAlphaTreshold", "double", "",0.5' + '\n\t\t\tProperty: "ForegroundTransparent", "bool", "",1' + '\n\t\t\tProperty: "DisplaySafeArea", "bool", "",0' + '\n\t\t\tProperty: "SafeAreaDisplayStyle", "enum", "",1' + '\n\t\t\tProperty: "SafeAreaAspectRatio", "double", "",1.33333333333333' + '\n\t\t\tProperty: "Use2DMagnifierZoom", "bool", "",0' + '\n\t\t\tProperty: "2D Magnifier Zoom", "Real", "A+",100' + '\n\t\t\tProperty: "2D Magnifier X", "Real", "A+",50' + '\n\t\t\tProperty: "2D Magnifier Y", "Real", "A+",50' + ) + + fw('\n\t\t\tProperty: "CameraProjectionType", "enum", "",%i' % proj_type) + + fw('\n\t\t\tProperty: "UseRealTimeDOFAndAA", "bool", "",0' + '\n\t\t\tProperty: "UseDepthOfField", "bool", "",0' + '\n\t\t\tProperty: "FocusSource", "enum", "",0' + '\n\t\t\tProperty: "FocusAngle", "double", "",3.5' + '\n\t\t\tProperty: "FocusDistance", "double", "",200' + '\n\t\t\tProperty: "UseAntialiasing", "bool", "",0' + '\n\t\t\tProperty: "AntialiasingIntensity", "double", "",0.77777' + '\n\t\t\tProperty: "UseAccumulationBuffer", "bool", "",0' + '\n\t\t\tProperty: "FrameSamplingCount", "int", "",7' + '\n\t\t}' + '\n\t\tMultiLayer: 0' + '\n\t\tMultiTake: 0' + '\n\t\tHidden: "True"' + '\n\t\tShading: Y' + '\n\t\tCulling: "CullingOff"' + '\n\t\tTypeFlags: "Camera"' + '\n\t\tGeometryVersion: 124' + ) + + fw('\n\t\tPosition: %.6f,%.6f,%.6f' % loc) + fw('\n\t\tUp: %i,%i,%i' % up) + + fw('\n\t\tLookAt: 0,0,0' + '\n\t\tShowInfoOnMoving: 1' + '\n\t\tShowAudio: 0' + '\n\t\tAudioColor: 0,1,0' + '\n\t\tCameraOrthoZoom: 1' + '\n\t}' + ) def write_camera_default(): # This sucks but to match FBX converter its easier to @@ -828,35 +832,35 @@ def save_single(operator, scene, filepath="", data = my_cam.blenObject.data - file.write('\n\tModel: "Model::%s", "Camera" {' % my_cam.fbxName) - file.write('\n\t\tVersion: 232') + fw('\n\tModel: "Model::%s", "Camera" {' % my_cam.fbxName) + fw('\n\t\tVersion: 232') loc, rot, scale, matrix, matrix_rot = write_object_props(my_cam.blenObject, None, my_cam.parRelMatrix()) - file.write('\n\t\t\tProperty: "Roll", "Roll", "A+",0') - file.write('\n\t\t\tProperty: "FieldOfView", "FieldOfView", "A+",%.6f' % math.degrees(data.angle)) + fw('\n\t\t\tProperty: "Roll", "Roll", "A+",0') + fw('\n\t\t\tProperty: "FieldOfView", "FieldOfView", "A+",%.6f' % math.degrees(data.angle)) - file.write('\n\t\t\tProperty: "FieldOfViewX", "FieldOfView", "A+",1' - '\n\t\t\tProperty: "FieldOfViewY", "FieldOfView", "A+",1' - ) + fw('\n\t\t\tProperty: "FieldOfViewX", "FieldOfView", "A+",1' + '\n\t\t\tProperty: "FieldOfViewY", "FieldOfView", "A+",1' + ) - # file.write('\n\t\t\tProperty: "FocalLength", "Real", "A+",14.0323972702026') - file.write('\n\t\t\tProperty: "OpticalCenterX", "Real", "A+",%.6f' % data.shift_x) # not sure if this is in the correct units? - file.write('\n\t\t\tProperty: "OpticalCenterY", "Real", "A+",%.6f' % data.shift_y) # ditto + # fw('\n\t\t\tProperty: "FocalLength", "Real", "A+",14.0323972702026') + fw('\n\t\t\tProperty: "OpticalCenterX", "Real", "A+",%.6f' % data.shift_x) # not sure if this is in the correct units? + fw('\n\t\t\tProperty: "OpticalCenterY", "Real", "A+",%.6f' % data.shift_y) # ditto - file.write('\n\t\t\tProperty: "BackgroundColor", "Color", "A+",0,0,0' - '\n\t\t\tProperty: "TurnTable", "Real", "A+",0' - '\n\t\t\tProperty: "DisplayTurnTableIcon", "bool", "",1' - '\n\t\t\tProperty: "Motion Blur Intensity", "Real", "A+",1' - '\n\t\t\tProperty: "UseMotionBlur", "bool", "",0' - '\n\t\t\tProperty: "UseRealTimeMotionBlur", "bool", "",1' - '\n\t\t\tProperty: "ResolutionMode", "enum", "",0' - '\n\t\t\tProperty: "ApertureMode", "enum", "",2' - '\n\t\t\tProperty: "GateFit", "enum", "",2' - '\n\t\t\tProperty: "CameraFormat", "enum", "",0' - ) + fw('\n\t\t\tProperty: "BackgroundColor", "Color", "A+",0,0,0' + '\n\t\t\tProperty: "TurnTable", "Real", "A+",0' + '\n\t\t\tProperty: "DisplayTurnTableIcon", "bool", "",1' + '\n\t\t\tProperty: "Motion Blur Intensity", "Real", "A+",1' + '\n\t\t\tProperty: "UseMotionBlur", "bool", "",0' + '\n\t\t\tProperty: "UseRealTimeMotionBlur", "bool", "",1' + '\n\t\t\tProperty: "ResolutionMode", "enum", "",0' + '\n\t\t\tProperty: "ApertureMode", "enum", "",2' + '\n\t\t\tProperty: "GateFit", "enum", "",2' + '\n\t\t\tProperty: "CameraFormat", "enum", "",0' + ) - file.write('\n\t\t\tProperty: "AspectW", "double", "",%i' % width) - file.write('\n\t\t\tProperty: "AspectH", "double", "",%i' % height) + fw('\n\t\t\tProperty: "AspectW", "double", "",%i' % width) + fw('\n\t\t\tProperty: "AspectH", "double", "",%i' % height) '''Camera aspect ratio modes. 0 If the ratio mode is eWINDOW_SIZE, both width and height values aren't relevant. @@ -867,91 +871,91 @@ def save_single(operator, scene, filepath="", Definition at line 234 of file kfbxcamera.h. ''' - file.write('\n\t\t\tProperty: "PixelAspectRatio", "double", "",2' - '\n\t\t\tProperty: "UseFrameColor", "bool", "",0' - '\n\t\t\tProperty: "FrameColor", "ColorRGB", "",0.3,0.3,0.3' - '\n\t\t\tProperty: "ShowName", "bool", "",1' - '\n\t\t\tProperty: "ShowGrid", "bool", "",1' - '\n\t\t\tProperty: "ShowOpticalCenter", "bool", "",0' - '\n\t\t\tProperty: "ShowAzimut", "bool", "",1' - '\n\t\t\tProperty: "ShowTimeCode", "bool", "",0' - ) - - file.write('\n\t\t\tProperty: "NearPlane", "double", "",%.6f' % data.clip_start) - file.write('\n\t\t\tProperty: "FarPlane", "double", "",%.6f' % data.clip_end) - - file.write('\n\t\t\tProperty: "FilmWidth", "double", "",1.0' - '\n\t\t\tProperty: "FilmHeight", "double", "",1.0' - ) - - file.write('\n\t\t\tProperty: "FilmAspectRatio", "double", "",%.6f' % aspect) - - file.write('\n\t\t\tProperty: "FilmSqueezeRatio", "double", "",1' - '\n\t\t\tProperty: "FilmFormatIndex", "enum", "",0' - '\n\t\t\tProperty: "ViewFrustum", "bool", "",1' - '\n\t\t\tProperty: "ViewFrustumNearFarPlane", "bool", "",0' - '\n\t\t\tProperty: "ViewFrustumBackPlaneMode", "enum", "",2' - '\n\t\t\tProperty: "BackPlaneDistance", "double", "",100' - '\n\t\t\tProperty: "BackPlaneDistanceMode", "enum", "",0' - '\n\t\t\tProperty: "ViewCameraToLookAt", "bool", "",1' - '\n\t\t\tProperty: "LockMode", "bool", "",0' - '\n\t\t\tProperty: "LockInterestNavigation", "bool", "",0' - '\n\t\t\tProperty: "FitImage", "bool", "",0' - '\n\t\t\tProperty: "Crop", "bool", "",0' - '\n\t\t\tProperty: "Center", "bool", "",1' - '\n\t\t\tProperty: "KeepRatio", "bool", "",1' - '\n\t\t\tProperty: "BackgroundMode", "enum", "",0' - '\n\t\t\tProperty: "BackgroundAlphaTreshold", "double", "",0.5' - '\n\t\t\tProperty: "ForegroundTransparent", "bool", "",1' - '\n\t\t\tProperty: "DisplaySafeArea", "bool", "",0' - '\n\t\t\tProperty: "SafeAreaDisplayStyle", "enum", "",1' - ) - - file.write('\n\t\t\tProperty: "SafeAreaAspectRatio", "double", "",%.6f' % aspect) - - file.write('\n\t\t\tProperty: "Use2DMagnifierZoom", "bool", "",0' - '\n\t\t\tProperty: "2D Magnifier Zoom", "Real", "A+",100' - '\n\t\t\tProperty: "2D Magnifier X", "Real", "A+",50' - '\n\t\t\tProperty: "2D Magnifier Y", "Real", "A+",50' - '\n\t\t\tProperty: "CameraProjectionType", "enum", "",0' - '\n\t\t\tProperty: "UseRealTimeDOFAndAA", "bool", "",0' - '\n\t\t\tProperty: "UseDepthOfField", "bool", "",0' - '\n\t\t\tProperty: "FocusSource", "enum", "",0' - '\n\t\t\tProperty: "FocusAngle", "double", "",3.5' - '\n\t\t\tProperty: "FocusDistance", "double", "",200' - '\n\t\t\tProperty: "UseAntialiasing", "bool", "",0' - '\n\t\t\tProperty: "AntialiasingIntensity", "double", "",0.77777' - '\n\t\t\tProperty: "UseAccumulationBuffer", "bool", "",0' - '\n\t\t\tProperty: "FrameSamplingCount", "int", "",7' - ) - - file.write('\n\t\t}') - - file.write('\n\t\tMultiLayer: 0' - '\n\t\tMultiTake: 0' - '\n\t\tShading: Y' - '\n\t\tCulling: "CullingOff"' - '\n\t\tTypeFlags: "Camera"' - '\n\t\tGeometryVersion: 124' - ) - - file.write('\n\t\tPosition: %.6f,%.6f,%.6f' % loc) - file.write('\n\t\tUp: %.6f,%.6f,%.6f' % (matrix_rot * Vector((0.0, 1.0, 0.0)))[:]) - file.write('\n\t\tLookAt: %.6f,%.6f,%.6f' % (matrix_rot * Vector((0.0, 0.0, -1.0)))[:]) - - #file.write('\n\t\tUp: 0,0,0' ) - #file.write('\n\t\tLookAt: 0,0,0' ) - - file.write('\n\t\tShowInfoOnMoving: 1') - file.write('\n\t\tShowAudio: 0') - file.write('\n\t\tAudioColor: 0,1,0') - file.write('\n\t\tCameraOrthoZoom: 1') - file.write('\n\t}') + fw('\n\t\t\tProperty: "PixelAspectRatio", "double", "",2' + '\n\t\t\tProperty: "UseFrameColor", "bool", "",0' + '\n\t\t\tProperty: "FrameColor", "ColorRGB", "",0.3,0.3,0.3' + '\n\t\t\tProperty: "ShowName", "bool", "",1' + '\n\t\t\tProperty: "ShowGrid", "bool", "",1' + '\n\t\t\tProperty: "ShowOpticalCenter", "bool", "",0' + '\n\t\t\tProperty: "ShowAzimut", "bool", "",1' + '\n\t\t\tProperty: "ShowTimeCode", "bool", "",0' + ) + + fw('\n\t\t\tProperty: "NearPlane", "double", "",%.6f' % data.clip_start) + fw('\n\t\t\tProperty: "FarPlane", "double", "",%.6f' % data.clip_end) + + fw('\n\t\t\tProperty: "FilmWidth", "double", "",1.0' + '\n\t\t\tProperty: "FilmHeight", "double", "",1.0' + ) + + fw('\n\t\t\tProperty: "FilmAspectRatio", "double", "",%.6f' % aspect) + + fw('\n\t\t\tProperty: "FilmSqueezeRatio", "double", "",1' + '\n\t\t\tProperty: "FilmFormatIndex", "enum", "",0' + '\n\t\t\tProperty: "ViewFrustum", "bool", "",1' + '\n\t\t\tProperty: "ViewFrustumNearFarPlane", "bool", "",0' + '\n\t\t\tProperty: "ViewFrustumBackPlaneMode", "enum", "",2' + '\n\t\t\tProperty: "BackPlaneDistance", "double", "",100' + '\n\t\t\tProperty: "BackPlaneDistanceMode", "enum", "",0' + '\n\t\t\tProperty: "ViewCameraToLookAt", "bool", "",1' + '\n\t\t\tProperty: "LockMode", "bool", "",0' + '\n\t\t\tProperty: "LockInterestNavigation", "bool", "",0' + '\n\t\t\tProperty: "FitImage", "bool", "",0' + '\n\t\t\tProperty: "Crop", "bool", "",0' + '\n\t\t\tProperty: "Center", "bool", "",1' + '\n\t\t\tProperty: "KeepRatio", "bool", "",1' + '\n\t\t\tProperty: "BackgroundMode", "enum", "",0' + '\n\t\t\tProperty: "BackgroundAlphaTreshold", "double", "",0.5' + '\n\t\t\tProperty: "ForegroundTransparent", "bool", "",1' + '\n\t\t\tProperty: "DisplaySafeArea", "bool", "",0' + '\n\t\t\tProperty: "SafeAreaDisplayStyle", "enum", "",1' + ) + + fw('\n\t\t\tProperty: "SafeAreaAspectRatio", "double", "",%.6f' % aspect) + + fw('\n\t\t\tProperty: "Use2DMagnifierZoom", "bool", "",0' + '\n\t\t\tProperty: "2D Magnifier Zoom", "Real", "A+",100' + '\n\t\t\tProperty: "2D Magnifier X", "Real", "A+",50' + '\n\t\t\tProperty: "2D Magnifier Y", "Real", "A+",50' + '\n\t\t\tProperty: "CameraProjectionType", "enum", "",0' + '\n\t\t\tProperty: "UseRealTimeDOFAndAA", "bool", "",0' + '\n\t\t\tProperty: "UseDepthOfField", "bool", "",0' + '\n\t\t\tProperty: "FocusSource", "enum", "",0' + '\n\t\t\tProperty: "FocusAngle", "double", "",3.5' + '\n\t\t\tProperty: "FocusDistance", "double", "",200' + '\n\t\t\tProperty: "UseAntialiasing", "bool", "",0' + '\n\t\t\tProperty: "AntialiasingIntensity", "double", "",0.77777' + '\n\t\t\tProperty: "UseAccumulationBuffer", "bool", "",0' + '\n\t\t\tProperty: "FrameSamplingCount", "int", "",7' + ) + + fw('\n\t\t}') + + fw('\n\t\tMultiLayer: 0' + '\n\t\tMultiTake: 0' + '\n\t\tShading: Y' + '\n\t\tCulling: "CullingOff"' + '\n\t\tTypeFlags: "Camera"' + '\n\t\tGeometryVersion: 124' + ) + + fw('\n\t\tPosition: %.6f,%.6f,%.6f' % loc) + fw('\n\t\tUp: %.6f,%.6f,%.6f' % (matrix_rot * Vector((0.0, 1.0, 0.0)))[:]) + fw('\n\t\tLookAt: %.6f,%.6f,%.6f' % (matrix_rot * Vector((0.0, 0.0, -1.0)))[:]) + + #fw('\n\t\tUp: 0,0,0' ) + #fw('\n\t\tLookAt: 0,0,0' ) + + fw('\n\t\tShowInfoOnMoving: 1') + fw('\n\t\tShowAudio: 0') + fw('\n\t\tAudioColor: 0,1,0') + fw('\n\t\tCameraOrthoZoom: 1') + fw('\n\t}') def write_light(my_light): light = my_light.blenObject.data - file.write('\n\tModel: "Model::%s", "Light" {' % my_light.fbxName) - file.write('\n\t\tVersion: 232') + fw('\n\tModel: "Model::%s", "Light" {' % my_light.fbxName) + fw('\n\t\tVersion: 232') write_object_props(my_light.blenObject, None, my_light.parRelMatrix()) @@ -977,51 +981,51 @@ def save_single(operator, scene, filepath="", # scale = abs(global_matrix.to_scale()[0]) # scale is always uniform in this case # UNUSED - file.write('\n\t\t\tProperty: "LightType", "enum", "",%i' % light_type) - file.write('\n\t\t\tProperty: "CastLightOnObject", "bool", "",1') - file.write('\n\t\t\tProperty: "DrawVolumetricLight", "bool", "",1') - file.write('\n\t\t\tProperty: "DrawGroundProjection", "bool", "",1') - file.write('\n\t\t\tProperty: "DrawFrontFacingVolumetricLight", "bool", "",0') - file.write('\n\t\t\tProperty: "GoboProperty", "object", ""') - file.write('\n\t\t\tProperty: "Color", "Color", "A+",1,1,1') - file.write('\n\t\t\tProperty: "Intensity", "Intensity", "A+",%.2f' % (min(light.energy * 100.0, 200.0))) # clamp below 200 + fw('\n\t\t\tProperty: "LightType", "enum", "",%i' % light_type) + fw('\n\t\t\tProperty: "CastLightOnObject", "bool", "",1') + fw('\n\t\t\tProperty: "DrawVolumetricLight", "bool", "",1') + fw('\n\t\t\tProperty: "DrawGroundProjection", "bool", "",1') + fw('\n\t\t\tProperty: "DrawFrontFacingVolumetricLight", "bool", "",0') + fw('\n\t\t\tProperty: "GoboProperty", "object", ""') + fw('\n\t\t\tProperty: "Color", "Color", "A+",1,1,1') + fw('\n\t\t\tProperty: "Intensity", "Intensity", "A+",%.2f' % (min(light.energy * 100.0, 200.0))) # clamp below 200 if light.type == 'SPOT': - file.write('\n\t\t\tProperty: "Cone angle", "Cone angle", "A+",%.2f' % math.degrees(light.spot_size)) - file.write('\n\t\t\tProperty: "Fog", "Fog", "A+",50') - file.write('\n\t\t\tProperty: "Color", "Color", "A",%.2f,%.2f,%.2f' % tuple(light.color)) - - file.write('\n\t\t\tProperty: "Intensity", "Intensity", "A+",%.2f' % (min(light.energy * 100.0, 200.0))) # clamp below 200 - - file.write('\n\t\t\tProperty: "Fog", "Fog", "A+",50') - file.write('\n\t\t\tProperty: "LightType", "enum", "",%i' % light_type) - file.write('\n\t\t\tProperty: "CastLightOnObject", "bool", "",%i' % do_light) - file.write('\n\t\t\tProperty: "DrawGroundProjection", "bool", "",1') - file.write('\n\t\t\tProperty: "DrawFrontFacingVolumetricLight", "bool", "",0') - file.write('\n\t\t\tProperty: "DrawVolumetricLight", "bool", "",1') - file.write('\n\t\t\tProperty: "GoboProperty", "object", ""') - file.write('\n\t\t\tProperty: "DecayType", "enum", "",0') - file.write('\n\t\t\tProperty: "DecayStart", "double", "",%.2f' % light.distance) - - file.write('\n\t\t\tProperty: "EnableNearAttenuation", "bool", "",0' - '\n\t\t\tProperty: "NearAttenuationStart", "double", "",0' - '\n\t\t\tProperty: "NearAttenuationEnd", "double", "",0' - '\n\t\t\tProperty: "EnableFarAttenuation", "bool", "",0' - '\n\t\t\tProperty: "FarAttenuationStart", "double", "",0' - '\n\t\t\tProperty: "FarAttenuationEnd", "double", "",0' - ) - - file.write('\n\t\t\tProperty: "CastShadows", "bool", "",%i' % do_shadow) - file.write('\n\t\t\tProperty: "ShadowColor", "ColorRGBA", "",0,0,0,1') - file.write('\n\t\t}') - - file.write('\n\t\tMultiLayer: 0' - '\n\t\tMultiTake: 0' - '\n\t\tShading: Y' - '\n\t\tCulling: "CullingOff"' - '\n\t\tTypeFlags: "Light"' - '\n\t\tGeometryVersion: 124' - '\n\t}' - ) + fw('\n\t\t\tProperty: "Cone angle", "Cone angle", "A+",%.2f' % math.degrees(light.spot_size)) + fw('\n\t\t\tProperty: "Fog", "Fog", "A+",50') + fw('\n\t\t\tProperty: "Color", "Color", "A",%.2f,%.2f,%.2f' % tuple(light.color)) + + fw('\n\t\t\tProperty: "Intensity", "Intensity", "A+",%.2f' % (min(light.energy * 100.0, 200.0))) # clamp below 200 + + fw('\n\t\t\tProperty: "Fog", "Fog", "A+",50') + fw('\n\t\t\tProperty: "LightType", "enum", "",%i' % light_type) + fw('\n\t\t\tProperty: "CastLightOnObject", "bool", "",%i' % do_light) + fw('\n\t\t\tProperty: "DrawGroundProjection", "bool", "",1') + fw('\n\t\t\tProperty: "DrawFrontFacingVolumetricLight", "bool", "",0') + fw('\n\t\t\tProperty: "DrawVolumetricLight", "bool", "",1') + fw('\n\t\t\tProperty: "GoboProperty", "object", ""') + fw('\n\t\t\tProperty: "DecayType", "enum", "",0') + fw('\n\t\t\tProperty: "DecayStart", "double", "",%.2f' % light.distance) + + fw('\n\t\t\tProperty: "EnableNearAttenuation", "bool", "",0' + '\n\t\t\tProperty: "NearAttenuationStart", "double", "",0' + '\n\t\t\tProperty: "NearAttenuationEnd", "double", "",0' + '\n\t\t\tProperty: "EnableFarAttenuation", "bool", "",0' + '\n\t\t\tProperty: "FarAttenuationStart", "double", "",0' + '\n\t\t\tProperty: "FarAttenuationEnd", "double", "",0' + ) + + fw('\n\t\t\tProperty: "CastShadows", "bool", "",%i' % do_shadow) + fw('\n\t\t\tProperty: "ShadowColor", "ColorRGBA", "",0,0,0,1') + fw('\n\t\t}') + + fw('\n\t\tMultiLayer: 0' + '\n\t\tMultiTake: 0' + '\n\t\tShading: Y' + '\n\t\tCulling: "CullingOff"' + '\n\t\tTypeFlags: "Light"' + '\n\t\tGeometryVersion: 124' + '\n\t}' + ) # matrixOnly is not used at the moment def write_null(my_null=None, fbxName=None, fbxType="Null", fbxTypeFlags="Null"): @@ -1029,8 +1033,8 @@ def save_single(operator, scene, filepath="", if not fbxName: fbxName = my_null.fbxName - file.write('\n\tModel: "Model::%s", "%s" {' % (fbxName, fbxType)) - file.write('\n\t\tVersion: 232') + fw('\n\tModel: "Model::%s", "%s" {' % (fbxName, fbxType)) + fw('\n\t\tVersion: 232') if my_null: poseMatrix = write_object_props(my_null.blenObject, None, my_null.parRelMatrix())[3] @@ -1039,15 +1043,15 @@ def save_single(operator, scene, filepath="", pose_items.append((fbxName, poseMatrix)) - file.write('\n\t\t}' - '\n\t\tMultiLayer: 0' - '\n\t\tMultiTake: 1' - '\n\t\tShading: Y' - '\n\t\tCulling: "CullingOff"' - ) + fw('\n\t\t}' + '\n\t\tMultiLayer: 0' + '\n\t\tMultiTake: 1' + '\n\t\tShading: Y' + '\n\t\tCulling: "CullingOff"' + ) - file.write('\n\t\tTypeFlags: "%s"' % fbxTypeFlags) - file.write('\n\t}') + fw('\n\t\tTypeFlags: "%s"' % fbxTypeFlags) + fw('\n\t}') # Material Settings if world: @@ -1056,7 +1060,7 @@ def save_single(operator, scene, filepath="", world_amb = 0.0, 0.0, 0.0 # default value def write_material(matname, mat): - file.write('\n\tMaterial: "Material::%s", "" {' % matname) + fw('\n\tMaterial: "Material::%s", "" {' % matname) # Todo, add more material Properties. if mat: @@ -1092,48 +1096,48 @@ def save_single(operator, scene, filepath="", mat_shadeless = False mat_shader = 'Phong' - file.write('\n\t\tVersion: 102') - file.write('\n\t\tShadingModel: "%s"' % mat_shader.lower()) - file.write('\n\t\tMultiLayer: 0') - - file.write('\n\t\tProperties60: {') - file.write('\n\t\t\tProperty: "ShadingModel", "KString", "", "%s"' % mat_shader) - file.write('\n\t\t\tProperty: "MultiLayer", "bool", "",0') - file.write('\n\t\t\tProperty: "EmissiveColor", "ColorRGB", "",%.4f,%.4f,%.4f' % mat_cold) # emit and diffuse color are he same in blender - file.write('\n\t\t\tProperty: "EmissiveFactor", "double", "",%.4f' % mat_emit) - - file.write('\n\t\t\tProperty: "AmbientColor", "ColorRGB", "",%.4f,%.4f,%.4f' % mat_colamb) - file.write('\n\t\t\tProperty: "AmbientFactor", "double", "",%.4f' % mat_amb) - file.write('\n\t\t\tProperty: "DiffuseColor", "ColorRGB", "",%.4f,%.4f,%.4f' % mat_cold) - file.write('\n\t\t\tProperty: "DiffuseFactor", "double", "",%.4f' % mat_dif) - file.write('\n\t\t\tProperty: "Bump", "Vector3D", "",0,0,0') - file.write('\n\t\t\tProperty: "TransparentColor", "ColorRGB", "",1,1,1') - file.write('\n\t\t\tProperty: "TransparencyFactor", "double", "",%.4f' % (1.0 - mat_alpha)) + fw('\n\t\tVersion: 102') + fw('\n\t\tShadingModel: "%s"' % mat_shader.lower()) + fw('\n\t\tMultiLayer: 0') + + fw('\n\t\tProperties60: {') + fw('\n\t\t\tProperty: "ShadingModel", "KString", "", "%s"' % mat_shader) + fw('\n\t\t\tProperty: "MultiLayer", "bool", "",0') + fw('\n\t\t\tProperty: "EmissiveColor", "ColorRGB", "",%.4f,%.4f,%.4f' % mat_cold) # emit and diffuse color are he same in blender + fw('\n\t\t\tProperty: "EmissiveFactor", "double", "",%.4f' % mat_emit) + + fw('\n\t\t\tProperty: "AmbientColor", "ColorRGB", "",%.4f,%.4f,%.4f' % mat_colamb) + fw('\n\t\t\tProperty: "AmbientFactor", "double", "",%.4f' % mat_amb) + fw('\n\t\t\tProperty: "DiffuseColor", "ColorRGB", "",%.4f,%.4f,%.4f' % mat_cold) + fw('\n\t\t\tProperty: "DiffuseFactor", "double", "",%.4f' % mat_dif) + fw('\n\t\t\tProperty: "Bump", "Vector3D", "",0,0,0') + fw('\n\t\t\tProperty: "TransparentColor", "ColorRGB", "",1,1,1') + fw('\n\t\t\tProperty: "TransparencyFactor", "double", "",%.4f' % (1.0 - mat_alpha)) if not mat_shadeless: - file.write('\n\t\t\tProperty: "SpecularColor", "ColorRGB", "",%.4f,%.4f,%.4f' % mat_cols) - file.write('\n\t\t\tProperty: "SpecularFactor", "double", "",%.4f' % mat_spec) - file.write('\n\t\t\tProperty: "ShininessExponent", "double", "",80.0') - file.write('\n\t\t\tProperty: "ReflectionColor", "ColorRGB", "",0,0,0') - file.write('\n\t\t\tProperty: "ReflectionFactor", "double", "",1') - file.write('\n\t\t\tProperty: "Emissive", "ColorRGB", "",0,0,0') - file.write('\n\t\t\tProperty: "Ambient", "ColorRGB", "",%.1f,%.1f,%.1f' % mat_colamb) - file.write('\n\t\t\tProperty: "Diffuse", "ColorRGB", "",%.1f,%.1f,%.1f' % mat_cold) + fw('\n\t\t\tProperty: "SpecularColor", "ColorRGB", "",%.4f,%.4f,%.4f' % mat_cols) + fw('\n\t\t\tProperty: "SpecularFactor", "double", "",%.4f' % mat_spec) + fw('\n\t\t\tProperty: "ShininessExponent", "double", "",80.0') + fw('\n\t\t\tProperty: "ReflectionColor", "ColorRGB", "",0,0,0') + fw('\n\t\t\tProperty: "ReflectionFactor", "double", "",1') + fw('\n\t\t\tProperty: "Emissive", "ColorRGB", "",0,0,0') + fw('\n\t\t\tProperty: "Ambient", "ColorRGB", "",%.1f,%.1f,%.1f' % mat_colamb) + fw('\n\t\t\tProperty: "Diffuse", "ColorRGB", "",%.1f,%.1f,%.1f' % mat_cold) if not mat_shadeless: - file.write('\n\t\t\tProperty: "Specular", "ColorRGB", "",%.1f,%.1f,%.1f' % mat_cols) - file.write('\n\t\t\tProperty: "Shininess", "double", "",%.1f' % mat_hard) - file.write('\n\t\t\tProperty: "Opacity", "double", "",%.1f' % mat_alpha) + fw('\n\t\t\tProperty: "Specular", "ColorRGB", "",%.1f,%.1f,%.1f' % mat_cols) + fw('\n\t\t\tProperty: "Shininess", "double", "",%.1f' % mat_hard) + fw('\n\t\t\tProperty: "Opacity", "double", "",%.1f' % mat_alpha) if not mat_shadeless: - file.write('\n\t\t\tProperty: "Reflectivity", "double", "",0') + fw('\n\t\t\tProperty: "Reflectivity", "double", "",0') - file.write('\n\t\t}') - file.write('\n\t}') + fw('\n\t\t}') + fw('\n\t}') # tex is an Image (Arystan) def write_video(texname, tex): # Same as texture really! - file.write('\n\tVideo: "Video::%s", "Clip" {' % texname) + fw('\n\tVideo: "Video::%s", "Clip" {' % texname) - file.write(''' + fw(''' Type: "Clip" Properties60: { Property: "FrameRate", "double", "",0 @@ -1146,9 +1150,9 @@ def save_single(operator, scene, filepath="", else: fname_strip = fname_rel = "" - file.write('\n\t\t\tProperty: "Path", "charptr", "", "%s"' % fname_strip) + fw('\n\t\t\tProperty: "Path", "charptr", "", "%s"' % fname_strip) - file.write(''' + fw(''' Property: "StartFrame", "int", "",0 Property: "StopFrame", "int", "",0 Property: "PlaySpeed", "double", "",1 @@ -1160,27 +1164,27 @@ def save_single(operator, scene, filepath="", } UseMipMap: 0''') - file.write('\n\t\tFilename: "%s"' % fname_strip) - file.write('\n\t\tRelativeFilename: "%s"' % fname_rel) # make relative - file.write('\n\t}') + fw('\n\t\tFilename: "%s"' % fname_strip) + fw('\n\t\tRelativeFilename: "%s"' % fname_rel) # make relative + fw('\n\t}') def write_texture(texname, tex, num): # if tex is None then this is a dummy tex - file.write('\n\tTexture: "Texture::%s", "TextureVideoClip" {' % texname) - file.write('\n\t\tType: "TextureVideoClip"') - file.write('\n\t\tVersion: 202') + fw('\n\tTexture: "Texture::%s", "TextureVideoClip" {' % texname) + fw('\n\t\tType: "TextureVideoClip"') + fw('\n\t\tVersion: 202') # TODO, rare case _empty_ exists as a name. - file.write('\n\t\tTextureName: "Texture::%s"' % texname) + fw('\n\t\tTextureName: "Texture::%s"' % texname) - file.write(''' + fw(''' Properties60: { Property: "Translation", "Vector", "A+",0,0,0 Property: "Rotation", "Vector", "A+",0,0,0 Property: "Scaling", "Vector", "A+",1,1,1''') - file.write('\n\t\t\tProperty: "Texture alpha", "Number", "A+",%i' % num) + fw('\n\t\t\tProperty: "Texture alpha", "Number", "A+",%i' % num) # WrapModeU/V 0==rep, 1==clamp, TODO add support - file.write(''' + fw(''' Property: "TextureTypeUse", "enum", "",0 Property: "CurrentTextureBlendMode", "enum", "",1 Property: "UseMaterial", "bool", "",0 @@ -1188,16 +1192,16 @@ def save_single(operator, scene, filepath="", Property: "CurrentMappingType", "enum", "",0 Property: "UVSwap", "bool", "",0''') - file.write('\n\t\t\tProperty: "WrapModeU", "enum", "",%i' % tex.use_clamp_x) - file.write('\n\t\t\tProperty: "WrapModeV", "enum", "",%i' % tex.use_clamp_y) + fw('\n\t\t\tProperty: "WrapModeU", "enum", "",%i' % tex.use_clamp_x) + fw('\n\t\t\tProperty: "WrapModeV", "enum", "",%i' % tex.use_clamp_y) - file.write(''' + fw(''' Property: "TextureRotationPivot", "Vector3D", "",0,0,0 Property: "TextureScalingPivot", "Vector3D", "",0,0,0 Property: "VideoProperty", "object", "" }''') - file.write('\n\t\tMedia: "Video::%s"' % texname) + fw('\n\t\tMedia: "Video::%s"' % texname) if tex: fname_rel = bpy_extras.io_utils.path_reference(tex.filepath, base_src, base_dst, path_mode, "", copy_set) @@ -1205,10 +1209,10 @@ def save_single(operator, scene, filepath="", else: fname_strip = fname_rel = "" - file.write('\n\t\tFileName: "%s"' % fname_strip) - file.write('\n\t\tRelativeFilename: "%s"' % fname_rel) # need some make relative command + fw('\n\t\tFileName: "%s"' % fname_strip) + fw('\n\t\tRelativeFilename: "%s"' % fname_rel) # need some make relative command - file.write(''' + fw(''' ModelUVTranslation: 0,0 ModelUVScaling: 1,1 Texture_Alpha_Source: "None" @@ -1219,8 +1223,8 @@ def save_single(operator, scene, filepath="", ''' Each mesh has its own deformer ''' - file.write('\n\tDeformer: "Deformer::Skin %s", "Skin" {' % obname) - file.write(''' + fw('\n\tDeformer: "Deformer::Skin %s", "Skin" {' % obname) + fw(''' Version: 100 MultiLayer: 0 Type: "Skin" @@ -1239,9 +1243,9 @@ def save_single(operator, scene, filepath="", Its possible that there is no matching vgroup in this mesh, in that case no verts are in the subdeformer, a but silly but dosnt really matter ''' - file.write('\n\tDeformer: "SubDeformer::Cluster %s %s", "Cluster" {' % (my_mesh.fbxName, my_bone.fbxName)) + fw('\n\tDeformer: "SubDeformer::Cluster %s %s", "Cluster" {' % (my_mesh.fbxName, my_bone.fbxName)) - file.write(''' + fw(''' Version: 100 MultiLayer: 0 Type: "Cluster" @@ -1271,31 +1275,31 @@ def save_single(operator, scene, filepath="", else: vgroup_data = [] - file.write('\n\t\tIndexes: ') + fw('\n\t\tIndexes: ') i = -1 for vg in vgroup_data: if i == -1: - file.write('%i' % vg[0]) + fw('%i' % vg[0]) i = 0 else: if i == 23: - file.write('\n\t\t') + fw('\n\t\t') i = 0 - file.write(',%i' % vg[0]) + fw(',%i' % vg[0]) i += 1 - file.write('\n\t\tWeights: ') + fw('\n\t\tWeights: ') i = -1 for vg in vgroup_data: if i == -1: - file.write('%.8f' % vg[1]) + fw('%.8f' % vg[1]) i = 0 else: if i == 38: - file.write('\n\t\t') + fw('\n\t\t') i = 0 - file.write(',%.8f' % vg[1]) + fw(',%.8f' % vg[1]) i += 1 if my_mesh.fbxParent: @@ -1309,9 +1313,9 @@ def save_single(operator, scene, filepath="", matstr = mat4x4str(m) matstr_i = mat4x4str(m.inverted()) - file.write('\n\t\tTransform: %s' % matstr_i) # THIS IS __NOT__ THE GLOBAL MATRIX AS DOCUMENTED :/ - file.write('\n\t\tTransformLink: %s' % matstr) - file.write('\n\t}') + fw('\n\t\tTransform: %s' % matstr_i) # THIS IS __NOT__ THE GLOBAL MATRIX AS DOCUMENTED :/ + fw('\n\t\tTransformLink: %s' % matstr) + fw('\n\t}') def write_mesh(my_mesh): @@ -1322,8 +1326,8 @@ def save_single(operator, scene, filepath="", do_textures = bool(my_mesh.blenTextures) do_uvs = bool(me.uv_textures) - file.write('\n\tModel: "Model::%s", "Mesh" {' % my_mesh.fbxName) - file.write('\n\t\tVersion: 232') # newline is added in write_object_props + fw('\n\tModel: "Model::%s", "Mesh" {' % my_mesh.fbxName) + fw('\n\t\tVersion: 232') # newline is added in write_object_props # convert into lists once. me_vertices = me.vertices[:] @@ -1333,28 +1337,30 @@ def save_single(operator, scene, filepath="", poseMatrix = write_object_props(my_mesh.blenObject, None, my_mesh.parRelMatrix())[3] pose_items.append((my_mesh.fbxName, poseMatrix)) - file.write('\n\t\t}') - file.write('\n\t\tMultiLayer: 0') - file.write('\n\t\tMultiTake: 1') - file.write('\n\t\tShading: Y') - file.write('\n\t\tCulling: "CullingOff"') + fw('\n\t\t}') + + fw('\n\t\tMultiLayer: 0' + '\n\t\tMultiTake: 1' + '\n\t\tShading: Y' + '\n\t\tCulling: "CullingOff"' + ) # Write the Real Mesh data here - file.write('\n\t\tVertices: ') + fw('\n\t\tVertices: ') i = -1 for v in me_vertices: if i == -1: - file.write('%.6f,%.6f,%.6f' % v.co[:]) + fw('%.6f,%.6f,%.6f' % v.co[:]) i = 0 else: if i == 7: - file.write('\n\t\t') + fw('\n\t\t') i = 0 - file.write(',%.6f,%.6f,%.6f' % v.co[:]) + fw(',%.6f,%.6f,%.6f' % v.co[:]) i += 1 - file.write('\n\t\tPolygonVertexIndex: ') + fw('\n\t\tPolygonVertexIndex: ') i = -1 for f in me_faces: fi = f.vertices[:] @@ -1362,18 +1368,18 @@ def save_single(operator, scene, filepath="", # last index XORd w. -1 indicates end of face if i == -1: if len(fi) == 3: - file.write('%i,%i,%i' % (fi[0], fi[1], fi[2] ^ -1)) + fw('%i,%i,%i' % (fi[0], fi[1], fi[2] ^ -1)) else: - file.write('%i,%i,%i,%i' % (fi[0], fi[1], fi[2], fi[3] ^ -1)) + fw('%i,%i,%i,%i' % (fi[0], fi[1], fi[2], fi[3] ^ -1)) i = 0 else: if i == 13: - file.write('\n\t\t') + fw('\n\t\t') i = 0 if len(fi) == 3: - file.write(',%i,%i,%i' % (fi[0], fi[1], fi[2] ^ -1)) + fw(',%i,%i,%i' % (fi[0], fi[1], fi[2] ^ -1)) else: - file.write(',%i,%i,%i,%i' % (fi[0], fi[1], fi[2], fi[3] ^ -1)) + fw(',%i,%i,%i,%i' % (fi[0], fi[1], fi[2], fi[3] ^ -1)) i += 1 # write loose edges as faces. @@ -1383,31 +1389,31 @@ def save_single(operator, scene, filepath="", ed_val = ed_val[0], ed_val[-1] ^ -1 if i == -1: - file.write('%i,%i' % ed_val) + fw('%i,%i' % ed_val) i = 0 else: if i == 13: - file.write('\n\t\t') + fw('\n\t\t') i = 0 - file.write(',%i,%i' % ed_val) + fw(',%i,%i' % ed_val) i += 1 - file.write('\n\t\tEdges: ') + fw('\n\t\tEdges: ') i = -1 for ed in me_edges: if i == -1: - file.write('%i,%i' % (ed.vertices[0], ed.vertices[1])) + fw('%i,%i' % (ed.vertices[0], ed.vertices[1])) i = 0 else: if i == 13: - file.write('\n\t\t') + fw('\n\t\t') i = 0 - file.write(',%i,%i' % (ed.vertices[0], ed.vertices[1])) + fw(',%i,%i' % (ed.vertices[0], ed.vertices[1])) i += 1 - file.write('\n\t\tGeometryVersion: 124') + fw('\n\t\tGeometryVersion: 124') - file.write(''' + fw(''' LayerElementNormal: 0 { Version: 101 Name: "" @@ -1418,19 +1424,19 @@ def save_single(operator, scene, filepath="", i = -1 for v in me_vertices: if i == -1: - file.write('%.15f,%.15f,%.15f' % v.normal[:]) + fw('%.15f,%.15f,%.15f' % v.normal[:]) i = 0 else: if i == 2: - file.write('\n\t\t\t ') + fw('\n\t\t\t ') i = 0 - file.write(',%.15f,%.15f,%.15f' % v.normal[:]) + fw(',%.15f,%.15f,%.15f' % v.normal[:]) i += 1 - file.write('\n\t\t}') + fw('\n\t\t}') # Write Face Smoothing if mesh_smooth_type == 'FACE': - file.write(''' + fw(''' LayerElementSmoothing: 0 { Version: 102 Name: "" @@ -1441,20 +1447,20 @@ def save_single(operator, scene, filepath="", i = -1 for f in me_faces: if i == -1: - file.write('%i' % f.use_smooth) + fw('%i' % f.use_smooth) i = 0 else: if i == 54: - file.write('\n\t\t\t ') + fw('\n\t\t\t ') i = 0 - file.write(',%i' % f.use_smooth) + fw(',%i' % f.use_smooth) i += 1 - file.write('\n\t\t}') + fw('\n\t\t}') elif mesh_smooth_type == 'EDGE': # Write Edge Smoothing - file.write(''' + fw(''' LayerElementSmoothing: 0 { Version: 101 Name: "" @@ -1465,16 +1471,16 @@ def save_single(operator, scene, filepath="", i = -1 for ed in me_edges: if i == -1: - file.write('%i' % (ed.use_edge_sharp)) + fw('%i' % (ed.use_edge_sharp)) i = 0 else: if i == 54: - file.write('\n\t\t\t ') + fw('\n\t\t\t ') i = 0 - file.write(',%i' % (ed.use_edge_sharp)) + fw(',%i' % ed.use_edge_sharp) i += 1 - file.write('\n\t\t}') + fw('\n\t\t}') elif mesh_smooth_type == 'OFF': pass else: @@ -1486,11 +1492,11 @@ def save_single(operator, scene, filepath="", if len(me.vertex_colors): collayers = me.vertex_colors for colindex, collayer in enumerate(collayers): - file.write('\n\t\tLayerElementColor: %i {' % colindex) - file.write('\n\t\t\tVersion: 101') - file.write('\n\t\t\tName: "%s"' % collayer.name) + fw('\n\t\tLayerElementColor: %i {' % colindex) + fw('\n\t\t\tVersion: 101') + fw('\n\t\t\tName: "%s"' % collayer.name) - file.write(''' + fw(''' MappingInformationType: "ByPolygonVertex" ReferenceInformationType: "IndexToDirect" Colors: ''') @@ -1506,41 +1512,41 @@ def save_single(operator, scene, filepath="", for col in colors: if i == -1: - file.write('%.4f,%.4f,%.4f,1' % col) + fw('%.4f,%.4f,%.4f,1' % col) i = 0 else: if i == 7: - file.write('\n\t\t\t\t') + fw('\n\t\t\t\t') i = 0 - file.write(',%.4f,%.4f,%.4f,1' % col) + fw(',%.4f,%.4f,%.4f,1' % col) i += 1 ii += 1 # One more Color - file.write('\n\t\t\tColorIndex: ') + fw('\n\t\t\tColorIndex: ') i = -1 for j in range(ii): if i == -1: - file.write('%i' % j) + fw('%i' % j) i = 0 else: if i == 55: - file.write('\n\t\t\t\t') + fw('\n\t\t\t\t') i = 0 - file.write(',%i' % j) + fw(',%i' % j) i += 1 - file.write('\n\t\t}') + fw('\n\t\t}') # Write UV and texture layers. uvlayers = [] if do_uvs: uvlayers = me.uv_textures for uvindex, uvlayer in enumerate(me.uv_textures): - file.write('\n\t\tLayerElementUV: %i {' % uvindex) - file.write('\n\t\t\tVersion: 101') - file.write('\n\t\t\tName: "%s"' % uvlayer.name) + fw('\n\t\tLayerElementUV: %i {' % uvindex) + fw('\n\t\t\tVersion: 101') + fw('\n\t\t\tName: "%s"' % uvlayer.name) - file.write(''' + fw(''' MappingInformationType: "ByPolygonVertex" ReferenceInformationType: "IndexToDirect" UV: ''') @@ -1552,48 +1558,48 @@ def save_single(operator, scene, filepath="", # workaround, since uf.uv iteration is wrong atm for uv in uf.uv: if i == -1: - file.write('%.6f,%.6f' % uv[:]) + fw('%.6f,%.6f' % uv[:]) i = 0 else: if i == 7: - file.write('\n\t\t\t ') + fw('\n\t\t\t ') i = 0 - file.write(',%.6f,%.6f' % uv[:]) + fw(',%.6f,%.6f' % uv[:]) i += 1 ii += 1 # One more UV - file.write('\n\t\t\tUVIndex: ') + fw('\n\t\t\tUVIndex: ') i = -1 for j in range(ii): if i == -1: - file.write('%i' % j) + fw('%i' % j) i = 0 else: if i == 55: - file.write('\n\t\t\t\t') + fw('\n\t\t\t\t') i = 0 - file.write(',%i' % j) + fw(',%i' % j) i += 1 - file.write('\n\t\t}') + fw('\n\t\t}') if do_textures: - file.write('\n\t\tLayerElementTexture: %i {' % uvindex) - file.write('\n\t\t\tVersion: 101') - file.write('\n\t\t\tName: "%s"' % uvlayer.name) + fw('\n\t\tLayerElementTexture: %i {' % uvindex) + fw('\n\t\t\tVersion: 101') + fw('\n\t\t\tName: "%s"' % uvlayer.name) if len(my_mesh.blenTextures) == 1: - file.write('\n\t\t\tMappingInformationType: "AllSame"') + fw('\n\t\t\tMappingInformationType: "AllSame"') else: - file.write('\n\t\t\tMappingInformationType: "ByPolygon"') + fw('\n\t\t\tMappingInformationType: "ByPolygon"') - file.write('\n\t\t\tReferenceInformationType: "IndexToDirect"') - file.write('\n\t\t\tBlendMode: "Translucent"') - file.write('\n\t\t\tTextureAlpha: 1') - file.write('\n\t\t\tTextureId: ') + fw('\n\t\t\tReferenceInformationType: "IndexToDirect"') + fw('\n\t\t\tBlendMode: "Translucent"') + fw('\n\t\t\tTextureAlpha: 1') + fw('\n\t\t\tTextureId: ') if len(my_mesh.blenTextures) == 1: - file.write('0') + fw('0') else: texture_mapping_local = {None: -1} @@ -1609,17 +1615,17 @@ def save_single(operator, scene, filepath="", if i == -1: i = 0 - file.write('%s' % texture_mapping_local[img_key]) + fw('%s' % texture_mapping_local[img_key]) else: if i == 55: - file.write('\n ') + fw('\n ') i = 0 - file.write(',%s' % texture_mapping_local[img_key]) + fw(',%s' % texture_mapping_local[img_key]) i += 1 else: - file.write(''' + fw(''' LayerElementTexture: 0 { Version: 101 Name: "" @@ -1628,24 +1634,24 @@ def save_single(operator, scene, filepath="", BlendMode: "Translucent" TextureAlpha: 1 TextureId: ''') - file.write('\n\t\t}') + fw('\n\t\t}') # Done with UV/textures. if do_materials: - file.write('\n\t\tLayerElementMaterial: 0 {') - file.write('\n\t\t\tVersion: 101') - file.write('\n\t\t\tName: ""') + fw('\n\t\tLayerElementMaterial: 0 {') + fw('\n\t\t\tVersion: 101') + fw('\n\t\t\tName: ""') if len(my_mesh.blenMaterials) == 1: - file.write('\n\t\t\tMappingInformationType: "AllSame"') + fw('\n\t\t\tMappingInformationType: "AllSame"') else: - file.write('\n\t\t\tMappingInformationType: "ByPolygon"') + fw('\n\t\t\tMappingInformationType: "ByPolygon"') - file.write('\n\t\t\tReferenceInformationType: "IndexToDirect"') - file.write('\n\t\t\tMaterials: ') + fw('\n\t\t\tReferenceInformationType: "IndexToDirect"') + fw('\n\t\t\tMaterials: ') if len(my_mesh.blenMaterials) == 1: - file.write('0') + fw('0') else: # Build a material mapping for this material_mapping_local = {} # local-mat & tex : global index. @@ -1674,18 +1680,18 @@ def save_single(operator, scene, filepath="", if i == -1: i = 0 - file.write('%s' % (material_mapping_local[mat, tex])) # None for mat or tex is ok + fw('%s' % material_mapping_local[mat, tex]) # None for mat or tex is ok else: if i == 55: - file.write('\n\t\t\t\t') + fw('\n\t\t\t\t') i = 0 - file.write(',%s' % (material_mapping_local[mat, tex])) + fw(',%s' % material_mapping_local[mat, tex]) i += 1 - file.write('\n\t\t}') + fw('\n\t\t}') - file.write(''' + fw(''' Layer: 0 { Version: 100 LayerElement: { @@ -1694,7 +1700,7 @@ def save_single(operator, scene, filepath="", }''') if do_materials: - file.write(''' + fw(''' LayerElement: { Type: "LayerElementMaterial" TypedIndex: 0 @@ -1702,7 +1708,7 @@ def save_single(operator, scene, filepath="", # Smoothing info if mesh_smooth_type != 'OFF': - file.write(''' + fw(''' LayerElement: { Type: "LayerElementSmoothing" TypedIndex: 0 @@ -1710,51 +1716,51 @@ def save_single(operator, scene, filepath="", # Always write this if do_textures: - file.write(''' + fw(''' LayerElement: { Type: "LayerElementTexture" TypedIndex: 0 }''') if me.vertex_colors: - file.write(''' + fw(''' LayerElement: { Type: "LayerElementColor" TypedIndex: 0 }''') if do_uvs: # same as me.faceUV - file.write(''' + fw(''' LayerElement: { Type: "LayerElementUV" TypedIndex: 0 }''') - file.write('\n\t\t}') + fw('\n\t\t}') if len(uvlayers) > 1: for i in range(1, len(uvlayers)): - file.write('\n\t\tLayer: %i {' % i) - file.write('\n\t\t\tVersion: 100') + fw('\n\t\tLayer: %i {' % i) + fw('\n\t\t\tVersion: 100') - file.write(''' + fw(''' LayerElement: { Type: "LayerElementUV"''') - file.write('\n\t\t\t\tTypedIndex: %i' % i) - file.write('\n\t\t\t}') + fw('\n\t\t\t\tTypedIndex: %i' % i) + fw('\n\t\t\t}') if do_textures: - file.write(''' + fw(''' LayerElement: { Type: "LayerElementTexture"''') - file.write('\n\t\t\t\tTypedIndex: %i' % i) - file.write('\n\t\t\t}') + fw('\n\t\t\t\tTypedIndex: %i' % i) + fw('\n\t\t\t}') - file.write('\n\t\t}') + fw('\n\t\t}') if len(collayers) > 1: # Take into account any UV layers @@ -1763,22 +1769,22 @@ def save_single(operator, scene, filepath="", layer_offset = len(uvlayers) - 1 for i in range(layer_offset, len(collayers) + layer_offset): - file.write('\n\t\tLayer: %i {' % i) - file.write('\n\t\t\tVersion: 100') + fw('\n\t\tLayer: %i {' % i) + fw('\n\t\t\tVersion: 100') - file.write(''' + fw(''' LayerElement: { Type: "LayerElementColor"''') - file.write('\n\t\t\t\tTypedIndex: %i' % i) - file.write('\n\t\t\t}') - file.write('\n\t\t}') - file.write('\n\t}') + fw('\n\t\t\t\tTypedIndex: %i' % i) + fw('\n\t\t\t}') + fw('\n\t\t}') + fw('\n\t}') def write_group(name): - file.write('\n\tGroupSelection: "GroupSelection::%s", "Default" {' % name) + fw('\n\tGroupSelection: "GroupSelection::%s", "Default" {' % name) - file.write(''' + fw(''' Properties60: { Property: "MultiLayer", "bool", "",0 Property: "Pickable", "bool", "",1 @@ -2099,7 +2105,7 @@ def save_single(operator, scene, filepath="", import traceback traceback.print_exc() - file.write(''' + fw(''' ; Object definitions ;------------------------------------------------------------------ @@ -2120,7 +2126,7 @@ Definitions: { del bone_deformer_count - file.write(''' + fw(''' ObjectType: "Model" { Count: %i }''' % ( @@ -2132,23 +2138,23 @@ Definitions: { len(ob_null) + len(ob_bones))) - file.write(''' + fw(''' ObjectType: "Geometry" { Count: %i }''' % len(ob_meshes)) if materials: - file.write(''' + fw(''' ObjectType: "Material" { Count: %i }''' % len(materials)) if textures: - file.write(''' + fw(''' ObjectType: "Texture" { Count: %i }''' % len(textures)) # add 1 for an empty tex - file.write(''' + fw(''' ObjectType: "Video" { Count: %i }''' % len(textures)) # add 1 for an empty tex @@ -2164,31 +2170,31 @@ Definitions: { tmp += len(my_bone.blenMeshes) if tmp: - file.write(''' + fw(''' ObjectType: "Deformer" { Count: %i }''' % tmp) del tmp # Bind pose is essential for XNA if the 'MESH' is included (JCB) - file.write(''' + fw(''' ObjectType: "Pose" { Count: 1 }''') if groups: - file.write(''' + fw(''' ObjectType: "GroupSelection" { Count: %i }''' % len(groups)) - file.write(''' + fw(''' ObjectType: "GlobalSettings" { Count: 1 } }''') - file.write(''' + fw(''' ; Object properties ;------------------------------------------------------------------ @@ -2260,26 +2266,26 @@ Objects: {''') # each by themselves do not need pose data. For now only pose meshes and bones # Bind pose is essential for XNA if the 'MESH' is included (JCB) - file.write(''' + fw(''' Pose: "Pose::BIND_POSES", "BindPose" { Type: "BindPose" Version: 100 Properties60: { } NbPoseNodes: ''') - file.write(str(len(pose_items))) + fw(str(len(pose_items))) for fbxName, matrix in pose_items: - file.write('\n\t\tPoseNode: {') - file.write('\n\t\t\tNode: "Model::%s"' % fbxName) - file.write('\n\t\t\tMatrix: %s' % mat4x4str(matrix if matrix else Matrix())) - file.write('\n\t\t}') + fw('\n\t\tPoseNode: {') + fw('\n\t\t\tNode: "Model::%s"' % fbxName) + fw('\n\t\t\tMatrix: %s' % mat4x4str(matrix if matrix else Matrix())) + fw('\n\t\t}') - file.write('\n\t}') + fw('\n\t}') # Finish Writing Objects # Write global settings - file.write(''' + fw(''' GlobalSettings: { Version: 1000 Properties60: { @@ -2293,9 +2299,9 @@ Objects: {''') } } ''') - file.write('}') + fw('}') - file.write(''' + fw(''' ; Object relations ;------------------------------------------------------------------ @@ -2305,28 +2311,28 @@ Relations: {''') # Nulls are likely to cause problems for XNA for my_null in ob_null: - file.write('\n\tModel: "Model::%s", "Null" {\n\t}' % my_null.fbxName) + fw('\n\tModel: "Model::%s", "Null" {\n\t}' % my_null.fbxName) # Armature must be a Limb for XNA # Note, 2.58 and previous wrote these as normal empties and it worked mostly (except for XNA) for my_arm in ob_arms: - file.write('\n\tModel: "Model::%s", "Limb" {\n\t}' % my_arm.fbxName) + fw('\n\tModel: "Model::%s", "Limb" {\n\t}' % my_arm.fbxName) for my_mesh in ob_meshes: - file.write('\n\tModel: "Model::%s", "Mesh" {\n\t}' % my_mesh.fbxName) + fw('\n\tModel: "Model::%s", "Mesh" {\n\t}' % my_mesh.fbxName) # TODO - limbs can have the same name for multiple armatures, should prefix. #for bonename, bone, obname, me, armob in ob_bones: for my_bone in ob_bones: - file.write('\n\tModel: "Model::%s", "Limb" {\n\t}' % my_bone.fbxName) + fw('\n\tModel: "Model::%s", "Limb" {\n\t}' % my_bone.fbxName) for my_cam in ob_cameras: - file.write('\n\tModel: "Model::%s", "Camera" {\n\t}' % my_cam.fbxName) + fw('\n\tModel: "Model::%s", "Camera" {\n\t}' % my_cam.fbxName) for my_light in ob_lights: - file.write('\n\tModel: "Model::%s", "Light" {\n\t}' % my_light.fbxName) + fw('\n\tModel: "Model::%s", "Light" {\n\t}' % my_light.fbxName) - file.write(''' + fw(''' Model: "Model::Producer Perspective", "Camera" { } Model: "Model::Producer Top", "Camera" { @@ -2345,33 +2351,33 @@ Relations: {''') }''') for matname, (mat, tex) in materials: - file.write('\n\tMaterial: "Material::%s", "" {\n\t}' % matname) + fw('\n\tMaterial: "Material::%s", "" {\n\t}' % matname) if textures: for texname, tex in textures: - file.write('\n\tTexture: "Texture::%s", "TextureVideoClip" {\n\t}' % texname) + fw('\n\tTexture: "Texture::%s", "TextureVideoClip" {\n\t}' % texname) for texname, tex in textures: - file.write('\n\tVideo: "Video::%s", "Clip" {\n\t}' % texname) + fw('\n\tVideo: "Video::%s", "Clip" {\n\t}' % texname) # deformers - modifiers for my_mesh in ob_meshes: if my_mesh.fbxArm: - file.write('\n\tDeformer: "Deformer::Skin %s", "Skin" {\n\t}' % my_mesh.fbxName) + fw('\n\tDeformer: "Deformer::Skin %s", "Skin" {\n\t}' % my_mesh.fbxName) #for bonename, bone, obname, me, armob in ob_bones: for my_bone in ob_bones: for fbxMeshObName in my_bone.blenMeshes: # .keys() - fbxMeshObName # is this bone effecting a mesh? - file.write('\n\tDeformer: "SubDeformer::Cluster %s %s", "Cluster" {\n\t}' % (fbxMeshObName, my_bone.fbxName)) + fw('\n\tDeformer: "SubDeformer::Cluster %s %s", "Cluster" {\n\t}' % (fbxMeshObName, my_bone.fbxName)) # This should be at the end - # file.write('\n\tPose: "Pose::BIND_POSES", "BindPose" {\n\t}') + # fw('\n\tPose: "Pose::BIND_POSES", "BindPose" {\n\t}') for groupname, group in groups: - file.write('\n\tGroupSelection: "GroupSelection::%s", "Default" {\n\t}' % groupname) + fw('\n\tGroupSelection: "GroupSelection::%s", "Default" {\n\t}' % groupname) - file.write('\n}') - file.write(''' + fw('\n}') + fw(''' ; Object connections ;------------------------------------------------------------------ @@ -2386,9 +2392,9 @@ Connections: {''') for my_ob in ob_generic: # for deformed meshes, don't have any parents or they can get twice transformed. if my_ob.fbxParent and (not my_ob.fbxArm): - file.write('\n\tConnect: "OO", "Model::%s", "Model::%s"' % (my_ob.fbxName, my_ob.fbxParent.fbxName)) + fw('\n\tConnect: "OO", "Model::%s", "Model::%s"' % (my_ob.fbxName, my_ob.fbxParent.fbxName)) else: - file.write('\n\tConnect: "OO", "Model::%s", "Model::Scene"' % my_ob.fbxName) + fw('\n\tConnect: "OO", "Model::%s", "Model::Scene"' % my_ob.fbxName) if materials: for my_mesh in ob_meshes: @@ -2397,55 +2403,55 @@ Connections: {''') mat_name = mat.name if mat else None tex_name = tex.name if tex else None - file.write('\n\tConnect: "OO", "Material::%s", "Model::%s"' % (sane_name_mapping_mat[mat_name, tex_name], my_mesh.fbxName)) + fw('\n\tConnect: "OO", "Material::%s", "Model::%s"' % (sane_name_mapping_mat[mat_name, tex_name], my_mesh.fbxName)) if textures: for my_mesh in ob_meshes: if my_mesh.blenTextures: - # file.write('\n\tConnect: "OO", "Texture::_empty_", "Model::%s"' % my_mesh.fbxName) + # fw('\n\tConnect: "OO", "Texture::_empty_", "Model::%s"' % my_mesh.fbxName) for tex in my_mesh.blenTextures: if tex: - file.write('\n\tConnect: "OO", "Texture::%s", "Model::%s"' % (sane_name_mapping_tex[tex.name], my_mesh.fbxName)) + fw('\n\tConnect: "OO", "Texture::%s", "Model::%s"' % (sane_name_mapping_tex[tex.name], my_mesh.fbxName)) for texname, tex in textures: - file.write('\n\tConnect: "OO", "Video::%s", "Texture::%s"' % (texname, texname)) + fw('\n\tConnect: "OO", "Video::%s", "Texture::%s"' % (texname, texname)) if 'MESH' in object_types: for my_mesh in ob_meshes: if my_mesh.fbxArm: - file.write('\n\tConnect: "OO", "Deformer::Skin %s", "Model::%s"' % (my_mesh.fbxName, my_mesh.fbxName)) + fw('\n\tConnect: "OO", "Deformer::Skin %s", "Model::%s"' % (my_mesh.fbxName, my_mesh.fbxName)) for my_bone in ob_bones: for fbxMeshObName in my_bone.blenMeshes: # .keys() - file.write('\n\tConnect: "OO", "SubDeformer::Cluster %s %s", "Deformer::Skin %s"' % (fbxMeshObName, my_bone.fbxName, fbxMeshObName)) + fw('\n\tConnect: "OO", "SubDeformer::Cluster %s %s", "Deformer::Skin %s"' % (fbxMeshObName, my_bone.fbxName, fbxMeshObName)) # limbs -> deformers for my_bone in ob_bones: for fbxMeshObName in my_bone.blenMeshes: # .keys() - file.write('\n\tConnect: "OO", "Model::%s", "SubDeformer::Cluster %s %s"' % (my_bone.fbxName, fbxMeshObName, my_bone.fbxName)) + fw('\n\tConnect: "OO", "Model::%s", "SubDeformer::Cluster %s %s"' % (my_bone.fbxName, fbxMeshObName, my_bone.fbxName)) #for bonename, bone, obname, me, armob in ob_bones: for my_bone in ob_bones: # Always parent to armature now if my_bone.parent: - file.write('\n\tConnect: "OO", "Model::%s", "Model::%s"' % (my_bone.fbxName, my_bone.parent.fbxName)) + fw('\n\tConnect: "OO", "Model::%s", "Model::%s"' % (my_bone.fbxName, my_bone.parent.fbxName)) else: # the armature object is written as an empty and all root level bones connect to it - file.write('\n\tConnect: "OO", "Model::%s", "Model::%s"' % (my_bone.fbxName, my_bone.fbxArm.fbxName)) + fw('\n\tConnect: "OO", "Model::%s", "Model::%s"' % (my_bone.fbxName, my_bone.fbxArm.fbxName)) # groups if groups: for ob_generic in ob_all_typegroups: for ob_base in ob_generic: for fbxGroupName in ob_base.fbxGroupNames: - file.write('\n\tConnect: "OO", "Model::%s", "GroupSelection::%s"' % (ob_base.fbxName, fbxGroupName)) + fw('\n\tConnect: "OO", "Model::%s", "GroupSelection::%s"' % (ob_base.fbxName, fbxGroupName)) # I think the following always duplicates the armature connection because it is also in ob_all_typegroups above! (JCB) # for my_arm in ob_arms: - # file.write('\n\tConnect: "OO", "Model::%s", "Model::Scene"' % my_arm.fbxName) + # fw('\n\tConnect: "OO", "Model::%s", "Model::Scene"' % my_arm.fbxName) - file.write('\n}') + fw('\n}') # Needed for scene footer as well as animation render = scene.render @@ -2527,16 +2533,16 @@ Connections: {''') if use_default_take: tmp_actions.insert(0, None) # None is the default action - file.write(''' + fw(''' ;Takes and animation section ;---------------------------------------------------- Takes: {''') if blenActionDefault and not use_default_take: - file.write('\n\tCurrent: "%s"' % sane_takename(blenActionDefault)) + fw('\n\tCurrent: "%s"' % sane_takename(blenActionDefault)) else: - file.write('\n\tCurrent: "Default Take"') + fw('\n\tCurrent: "Default Take"') for blenAction in tmp_actions: # we have tagged all actious that are used be selected armatures @@ -2569,12 +2575,12 @@ Takes: {''') my_arm.blenObject.animation_data.action = blenAction # Use the action name as the take name and the take filename (JCB) - file.write('\n\tTake: "%s" {' % take_name) - file.write('\n\t\tFileName: "%s.tak"' % take_name.replace(" ", "_")) - file.write('\n\t\tLocalTime: %i,%i' % (fbx_time(act_start - 1), fbx_time(act_end - 1))) # ??? - not sure why this is needed - file.write('\n\t\tReferenceTime: %i,%i' % (fbx_time(act_start - 1), fbx_time(act_end - 1))) # ??? - not sure why this is needed + fw('\n\tTake: "%s" {' % take_name) + fw('\n\t\tFileName: "%s.tak"' % take_name.replace(" ", "_")) + fw('\n\t\tLocalTime: %i,%i' % (fbx_time(act_start - 1), fbx_time(act_end - 1))) # ??? - not sure why this is needed + fw('\n\t\tReferenceTime: %i,%i' % (fbx_time(act_start - 1), fbx_time(act_end - 1))) # ??? - not sure why this is needed - file.write(''' + fw(''' ;Models animation ;----------------------------------------------------''') @@ -2609,9 +2615,9 @@ Takes: {''') pass else: - file.write('\n\t\tModel: "Model::%s" {' % my_ob.fbxName) # ??? - not sure why this is needed - file.write('\n\t\t\tVersion: 1.1') - file.write('\n\t\t\tChannel: "Transform" {') + fw('\n\t\tModel: "Model::%s" {' % my_ob.fbxName) # ??? - not sure why this is needed + fw('\n\t\t\tVersion: 1.1') + fw('\n\t\t\tChannel: "Transform" {') context_bone_anim_mats = [(my_ob.getAnimParRelMatrix(frame), my_ob.getAnimParRelMatrixRot(frame)) for frame in range(act_start, act_end + 1)] @@ -2637,26 +2643,26 @@ Takes: {''') prev_eul = mtx[1].to_euler() context_bone_anim_vecs.append(tuple_rad_to_deg(prev_eul)) - file.write('\n\t\t\t\tChannel: "%s" {' % TX_CHAN) # translation + fw('\n\t\t\t\tChannel: "%s" {' % TX_CHAN) # translation for i in range(3): # Loop on each axis of the bone - file.write('\n\t\t\t\t\tChannel: "%s" {' % ('XYZ'[i])) # translation - file.write('\n\t\t\t\t\t\tDefault: %.15f' % context_bone_anim_vecs[0][i]) - file.write('\n\t\t\t\t\t\tKeyVer: 4005') + fw('\n\t\t\t\t\tChannel: "%s" {' % ('XYZ'[i])) # translation + fw('\n\t\t\t\t\t\tDefault: %.15f' % context_bone_anim_vecs[0][i]) + fw('\n\t\t\t\t\t\tKeyVer: 4005') if not use_anim_optimize: # Just write all frames, simple but in-eficient - file.write('\n\t\t\t\t\t\tKeyCount: %i' % (1 + act_end - act_start)) - file.write('\n\t\t\t\t\t\tKey: ') + fw('\n\t\t\t\t\t\tKeyCount: %i' % (1 + act_end - act_start)) + fw('\n\t\t\t\t\t\tKey: ') frame = act_start while frame <= act_end: if frame != act_start: - file.write(',') + fw(',') # Curve types are 'C,n' for constant, 'L' for linear # C,n is for bezier? - linear is best for now so we can do simple keyframe removal - file.write('\n\t\t\t\t\t\t\t%i,%.15f,L' % (fbx_time(frame - 1), context_bone_anim_vecs[frame - act_start][i])) + fw('\n\t\t\t\t\t\t\t%i,%.15f,L' % (fbx_time(frame - 1), context_bone_anim_vecs[frame - act_start][i])) frame += 1 else: # remove unneeded keys, j is the frame, needed when some frames are removed. @@ -2697,37 +2703,37 @@ Takes: {''') # pass # better write one, otherwise we loose poses with no animation - file.write('\n\t\t\t\t\t\tKeyCount: 1') - file.write('\n\t\t\t\t\t\tKey: ') - file.write('\n\t\t\t\t\t\t\t%i,%.15f,L' % (fbx_time(start), context_bone_anim_keys[0][0])) + fw('\n\t\t\t\t\t\tKeyCount: 1') + fw('\n\t\t\t\t\t\tKey: ') + fw('\n\t\t\t\t\t\t\t%i,%.15f,L' % (fbx_time(start), context_bone_anim_keys[0][0])) else: # We only need to write these if there is at least one - file.write('\n\t\t\t\t\t\tKeyCount: %i' % len(context_bone_anim_keys)) - file.write('\n\t\t\t\t\t\tKey: ') + fw('\n\t\t\t\t\t\tKeyCount: %i' % len(context_bone_anim_keys)) + fw('\n\t\t\t\t\t\tKey: ') for val, frame in context_bone_anim_keys: if frame != context_bone_anim_keys[0][1]: # not the first - file.write(',') + fw(',') # frame is already one less then blenders frame - file.write('\n\t\t\t\t\t\t\t%i,%.15f,L' % (fbx_time(frame), val)) + fw('\n\t\t\t\t\t\t\t%i,%.15f,L' % (fbx_time(frame), val)) if i == 0: - file.write('\n\t\t\t\t\t\tColor: 1,0,0') + fw('\n\t\t\t\t\t\tColor: 1,0,0') elif i == 1: - file.write('\n\t\t\t\t\t\tColor: 0,1,0') + fw('\n\t\t\t\t\t\tColor: 0,1,0') elif i == 2: - file.write('\n\t\t\t\t\t\tColor: 0,0,1') + fw('\n\t\t\t\t\t\tColor: 0,0,1') - file.write('\n\t\t\t\t\t}') - file.write('\n\t\t\t\t\tLayerType: %i' % (TX_LAYER + 1)) - file.write('\n\t\t\t\t}') + fw('\n\t\t\t\t\t}') + fw('\n\t\t\t\t\tLayerType: %i' % (TX_LAYER + 1)) + fw('\n\t\t\t\t}') # --------------- - file.write('\n\t\t\t}') - file.write('\n\t\t}') + fw('\n\t\t\t}') + fw('\n\t\t}') # end the take - file.write('\n\t}') + fw('\n\t}') # end action loop. set original actions # do this after every loop incase actions effect eachother. @@ -2735,18 +2741,18 @@ Takes: {''') if my_arm.blenObject.animation_data: my_arm.blenObject.animation_data.action = my_arm.blenAction - file.write('\n}') + fw('\n}') scene.frame_set(frame_orig) else: # no animation - file.write('\n;Takes and animation section') - file.write('\n;----------------------------------------------------') - file.write('\n') - file.write('\nTakes: {') - file.write('\n\tCurrent: ""') - file.write('\n}') + fw('\n;Takes and animation section') + fw('\n;----------------------------------------------------') + fw('\n') + fw('\nTakes: {') + fw('\n\tCurrent: ""') + fw('\n}') # write meshes animation #for obname, ob, mtx, me, mats, arm, armname in ob_meshes: @@ -2768,36 +2774,36 @@ Takes: {''') has_mist = mist_intense = mist_start = mist_end = 0 world_hor = 0, 0, 0 - file.write('\n;Version 5 settings') - file.write('\n;------------------------------------------------------------------') - file.write('\n') - file.write('\nVersion5: {') - file.write('\n\tAmbientRenderSettings: {') - file.write('\n\t\tVersion: 101') - file.write('\n\t\tAmbientLightColor: %.1f,%.1f,%.1f,0' % tuple(world_amb)) - file.write('\n\t}') - file.write('\n\tFogOptions: {') - file.write('\n\t\tFlogEnable: %i' % has_mist) - file.write('\n\t\tFogMode: 0') - file.write('\n\t\tFogDensity: %.3f' % mist_intense) - file.write('\n\t\tFogStart: %.3f' % mist_start) - file.write('\n\t\tFogEnd: %.3f' % mist_end) - file.write('\n\t\tFogColor: %.1f,%.1f,%.1f,1' % tuple(world_hor)) - file.write('\n\t}') - file.write('\n\tSettings: {') - file.write('\n\t\tFrameRate: "%i"' % int(fps)) - file.write('\n\t\tTimeFormat: 1') - file.write('\n\t\tSnapOnFrames: 0') - file.write('\n\t\tReferenceTimeIndex: -1') - file.write('\n\t\tTimeLineStartTime: %i' % fbx_time(start - 1)) - file.write('\n\t\tTimeLineStopTime: %i' % fbx_time(end - 1)) - file.write('\n\t}') - file.write('\n\tRendererSetting: {') - file.write('\n\t\tDefaultCamera: "Producer Perspective"') - file.write('\n\t\tDefaultViewingMode: 0') - file.write('\n\t}') - file.write('\n}') - file.write('\n') + fw('\n;Version 5 settings') + fw('\n;------------------------------------------------------------------') + fw('\n') + fw('\nVersion5: {') + fw('\n\tAmbientRenderSettings: {') + fw('\n\t\tVersion: 101') + fw('\n\t\tAmbientLightColor: %.1f,%.1f,%.1f,0' % tuple(world_amb)) + fw('\n\t}') + fw('\n\tFogOptions: {') + fw('\n\t\tFlogEnable: %i' % has_mist) + fw('\n\t\tFogMode: 0') + fw('\n\t\tFogDensity: %.3f' % mist_intense) + fw('\n\t\tFogStart: %.3f' % mist_start) + fw('\n\t\tFogEnd: %.3f' % mist_end) + fw('\n\t\tFogColor: %.1f,%.1f,%.1f,1' % tuple(world_hor)) + fw('\n\t}') + fw('\n\tSettings: {') + fw('\n\t\tFrameRate: "%i"' % int(fps)) + fw('\n\t\tTimeFormat: 1') + fw('\n\t\tSnapOnFrames: 0') + fw('\n\t\tReferenceTimeIndex: -1') + fw('\n\t\tTimeLineStartTime: %i' % fbx_time(start - 1)) + fw('\n\t\tTimeLineStopTime: %i' % fbx_time(end - 1)) + fw('\n\t}') + fw('\n\tRendererSetting: {') + fw('\n\t\tDefaultCamera: "Producer Perspective"') + fw('\n\t\tDefaultViewingMode: 0') + fw('\n\t}') + fw('\n}') + fw('\n') # XXX, shouldnt be global! for mapping in (sane_name_mapping_ob,