提交 19f0b1f1 编写于 作者: A alteredq

Cleaning up Blender scene exporter and SceneLoader.

- removed not anymore existing ro.me specific remains (triggers, mesh colliders and shadow volumes)
- added custom properties for setting shadow map casting and receiving, depthWrite, depthTest, blending, doubleSided
- using Blender native "transparency" checkbox for setting out "transparent" property
- better handling of messed up texture slots
上级 619cbaa5
因为 它太大了无法显示 source diff 。你可以改为 查看blob
因为 它太大了无法显示 source diff 。你可以改为 查看blob
......@@ -194,16 +194,16 @@ THREE.Loader.prototype = {
if ( m.shading ) {
if ( m.shading == "Phong" ) mtype = "MeshPhongMaterial";
else if ( m.shading == "Basic" ) mtype = "MeshBasicMaterial";
var shading = m.shading.toLowerCase();
if ( shading === "phong" ) mtype = "MeshPhongMaterial";
else if ( shading === "basic" ) mtype = "MeshBasicMaterial";
}
if ( m.blending ) {
if ( m.blending !== undefined && THREE[ m.blending ] !== undefined ) {
if ( m.blending == "Additive" ) mpars.blending = THREE.AdditiveBlending;
else if ( m.blending == "Subtractive" ) mpars.blending = THREE.SubtractiveBlending;
else if ( m.blending == "Multiply" ) mpars.blending = THREE.MultiplyBlending;
mpars.blending = THREE[ m.blending ];
}
......@@ -219,6 +219,12 @@ THREE.Loader.prototype = {
}
if ( m.depthWrite !== undefined ) {
mpars.depthWrite = m.depthWrite;
}
if ( m.vertexColors !== undefined ) {
if ( m.vertexColors == "face" ) {
......
......@@ -81,7 +81,6 @@ THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url
cameras: {},
lights: {},
fogs: {},
triggers: {},
empties: {}
};
......@@ -101,8 +100,12 @@ THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url
if ( scale )
result.scene.scale.set( scale[ 0 ], scale[ 1 ], scale [ 2 ] );
if ( position || rotation || scale )
if ( position || rotation || scale ) {
result.scene.updateMatrix();
result.scene.updateMatrixWorld();
}
}
......@@ -192,37 +195,16 @@ THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url
}
object.scale.set( s[0], s[1], s[2] );
object.visible = o.visible;
object.doubleSided = o.doubleSided;
object.castShadow = o.castShadow;
object.receiveShadow = o.receiveShadow;
result.scene.add( object );
result.objects[ dd ] = object;
if ( o.castsShadow ) {
//object.visible = true;
//object.materials = [ new THREE.MeshBasicMaterial( { color: 0xff0000 } ) ];
var shadow = new THREE.ShadowVolume( geometry )
result.scene.add( shadow );
shadow.position = object.position;
shadow.rotation = object.rotation;
shadow.scale = object.scale;
}
if ( o.trigger && o.trigger.toLowerCase() != "none" ) {
var trigger = {
"type" : o.trigger,
"object" : o
};
result.triggers[ object.name ] = trigger;
}
}
// pure Object3D
......@@ -261,17 +243,6 @@ THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url
result.objects[ dd ] = object;
result.empties[ dd ] = object;
if ( o.trigger && o.trigger.toLowerCase() != "none" ) {
var trigger = {
"type" : o.trigger,
"object" : o
};
result.triggers[ object.name ] = trigger;
}
}
}
......@@ -525,7 +496,7 @@ THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url
var modelJson = data.embeds[ g.id ],
texture_path = "";
// Pass metadata along to jsonLoader so it knows the format version.
modelJson.metadata = data.metadata;
......
......@@ -24,7 +24,7 @@
bl_info = {
"name": "three.js format",
"author": "mrdoob, kikko, alteredq, remoe, pxf",
"version": (1, 2, 0),
"version": (1, 3, 0),
"blender": (2, 6, 0),
"api": 35622,
"location": "File > Import-Export",
......@@ -53,18 +53,23 @@ from bpy_extras.io_utils import ExportHelper, ImportHelper
# Custom properties
# ################################################################
bpy.types.Object.THREE_castsShadow = bpy.props.BoolProperty()
bpy.types.Object.THREE_meshCollider = bpy.props.BoolProperty()
bpy.types.Object.THREE_castShadow = bpy.props.BoolProperty()
bpy.types.Object.THREE_receiveShadow = bpy.props.BoolProperty()
bpy.types.Object.THREE_doubleSided = bpy.props.BoolProperty()
bpy.types.Object.THREE_exportGeometry = bpy.props.BoolProperty(default = True)
THREE_trigger_types = [("None", "None", "None"), ("Small", "Small", "Small"), ("Large", "Large", "Large")]
bpy.types.Object.THREE_triggerType = EnumProperty(name = "Trigger type", description = "Trigger type", items = THREE_trigger_types, default = "None")
bpy.types.Material.THREE_useVertexColors = bpy.props.BoolProperty()
bpy.types.Material.THREE_depthWrite = bpy.props.BoolProperty(default = True)
bpy.types.Material.THREE_depthTest = bpy.props.BoolProperty(default = True)
THREE_material_types = [("Basic", "Basic", "Basic"), ("Phong", "Phong", "Phong"), ("Lambert", "Lambert", "Lambert")]
bpy.types.Material.THREE_materialType = EnumProperty(name = "Material type", description = "Material type", items = THREE_material_types, default = "Lambert")
THREE_blending_types = [("NoBlending", "NoBlending", "NoBlending"), ("NormalBlending", "NormalBlending", "NormalBlending"),
("AdditiveBlending", "AdditiveBlending", "AdditiveBlending"), ("SubtractiveBlending", "SubtractiveBlending", "SubtractiveBlending"),
("MultiplyBlending", "MultiplyBlending", "MultiplyBlending"), ("AdditiveAlphaBlending", "AdditiveAlphaBlending", "AdditiveAlphaBlending")]
bpy.types.Material.THREE_blendingType = EnumProperty(name = "Blending type", description = "Blending type", items = THREE_blending_types, default = "NormalBlending")
class OBJECT_PT_hello( bpy.types.Panel ):
bl_label = "THREE"
......@@ -83,14 +88,13 @@ class OBJECT_PT_hello( bpy.types.Panel ):
row.prop( obj, "THREE_exportGeometry", text="Export geometry" )
row = layout.row()
row.prop( obj, "THREE_castsShadow", text="Casts shadow" )
row.prop( obj, "THREE_castShadow", text="Casts shadow" )
row = layout.row()
row.prop( obj, "THREE_meshCollider", text="Mesh collider" )
row.prop( obj, "THREE_receiveShadow", text="Receives shadow" )
row = layout.row()
row.prop( obj, "THREE_triggerType", text="Trigger type" )
row.prop( obj, "THREE_doubleSided", text="Double sided" )
class MATERIAL_PT_hello( bpy.types.Panel ):
......@@ -109,9 +113,18 @@ class MATERIAL_PT_hello( bpy.types.Panel ):
row = layout.row()
row.prop( mat, "THREE_materialType", text="Material type" )
row = layout.row()
row.prop( mat, "THREE_blendingType", text="Blending type" )
row = layout.row()
row.prop( mat, "THREE_useVertexColors", text="Use vertex colors" )
row = layout.row()
row.prop( mat, "THREE_depthWrite", text="Enable depth writing" )
row = layout.row()
row.prop( mat, "THREE_depthTest", text="Enable depth testing" )
# ################################################################
# Importer
......
......@@ -129,9 +129,9 @@ TEMPLATE_OBJECT = """\
"quaternion": %(quaternion)s,
"scale" : %(scale)s,
"visible" : %(visible)s,
"castsShadow" : %(castsShadow)s,
"meshCollider" : %(meshCollider)s,
"trigger" : %(trigger)s
"castShadow" : %(castShadow)s,
"receiveShadow" : %(receiveShadow)s,
"doubleSided" : %(doubleSided)s
}"""
TEMPLATE_EMPTY = """\
......@@ -140,8 +140,7 @@ TEMPLATE_EMPTY = """\
"position" : %(position)s,
"rotation" : %(rotation)s,
"quaternion": %(quaternion)s,
"scale" : %(scale)s,
"trigger" : %(trigger)s
"scale" : %(scale)s
}"""
TEMPLATE_GEOMETRY_LINK = """\
......@@ -779,6 +778,11 @@ def extract_materials(mesh, scene, option_colors, option_copy_textures, filepath
else:
material['shading'] = m.THREE_materialType
material['blending'] = m.THREE_blendingType
material['depthWrite'] = m.THREE_depthWrite
material['depthTest'] = m.THREE_depthTest
material['transparent'] = m.use_transparency
return materials
def generate_materials_string(mesh, scene, option_colors, draw_type, option_copy_textures, filepath, offset):
......@@ -1206,14 +1210,11 @@ def generate_objects(data):
if len(group_ids) > 0:
group_string = generate_string_list(group_ids)
castsShadow = obj.THREE_castsShadow
meshCollider = obj.THREE_meshCollider
triggerType = obj.THREE_triggerType
castShadow = obj.THREE_castShadow
receiveShadow = obj.THREE_receiveShadow
doubleSided = obj.THREE_doubleSided
visible = True
#if obj.draw_type in ["BOUNDS", "WIRE"] and (meshCollider or castsShadow):
if meshCollider or castsShadow:
visible = False
geometry_string = generate_string(geometry_id)
......@@ -1228,9 +1229,9 @@ def generate_objects(data):
"quaternion" : generate_vec4(quaternion),
"scale" : generate_vec3(scale),
"castsShadow" : generate_bool_property(castsShadow),
"meshCollider" : generate_bool_property(meshCollider),
"trigger" : generate_string(triggerType),
"castShadow" : generate_bool_property(castShadow),
"receiveShadow" : generate_bool_property(receiveShadow),
"doubleSided" : generate_bool_property(doubleSided),
"visible" : generate_bool_property(visible)
}
chunks.append(object_string)
......@@ -1247,8 +1248,6 @@ def generate_objects(data):
if len(group_ids) > 0:
group_string = generate_string_list(group_ids)
triggerType = obj.THREE_triggerType
object_string = TEMPLATE_EMPTY % {
"object_id" : generate_string(object_id),
"group_id" : group_string,
......@@ -1256,9 +1255,7 @@ def generate_objects(data):
"position" : generate_vec3(position),
"rotation" : generate_vec3(rotation),
"quaternion" : generate_vec4(quaternion),
"scale" : generate_vec3(scale),
"trigger" : generate_string(triggerType),
"scale" : generate_vec3(scale)
}
chunks.append(object_string)
......@@ -1432,6 +1429,10 @@ def extract_material_data(m, option_colors):
material['mapNormalFactor'] = textures['normal']['slot'].normal_factor
material['shading'] = m.THREE_materialType
material['blending'] = m.THREE_blendingType
material['depthWrite'] = m.THREE_depthWrite
material['depthTest'] = m.THREE_depthTest
material['transparent'] = m.use_transparency
return material
......@@ -1450,7 +1451,7 @@ def guess_material_textures(material):
slot = material.texture_slots[i]
if slot:
texture = slot.texture
if slot.use and texture.type == 'IMAGE':
if slot.use and texture and texture.type == 'IMAGE':
if texture.use_normal_map:
textures['normal'] = { "texture": texture, "slot": slot }
......@@ -1520,6 +1521,18 @@ def generate_material_string(material):
if material['vertexColors']:
parameters += ', "vertexColors": "vertex"'
if material['transparent']:
parameters += ', "transparent": true'
parameters += ', "blending": "%s"' % material['blending']
if not material['depthWrite']:
parameters += ', "depthWrite": false'
if not material['depthTest']:
parameters += ', "depthTest": false'
material_string = TEMPLATE_MATERIAL_SCENE % {
"material_id" : generate_string(material_id),
"type" : generate_string(material_type),
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册