未验证 提交 6d5e6fcb 编写于 作者: M Mr.doob 提交者: GitHub

Merge pull request #13566 from donmccurdy/feat-gltfexporter-unlit

GLTFExporter: Support KHR_materials_unlit.
......@@ -100,6 +100,7 @@ THREE.GLTFExporter.prototype = {
var pending = [];
var nodeMap = {};
var skins = [];
var extensionsUsed = {};
var cachedData = {
materials: new Map(),
......@@ -640,20 +641,13 @@ THREE.GLTFExporter.prototype = {
}
if ( material instanceof THREE.ShaderMaterial ) {
if ( material.isShaderMaterial ) {
console.warn( 'GLTFExporter: THREE.ShaderMaterial not supported.' );
return null;
}
if ( ! ( material instanceof THREE.MeshStandardMaterial ) ) {
console.warn( 'GLTFExporter: Currently just THREE.MeshStandardMaterial is supported. Material conversion may lose information.' );
}
// @QUESTION Should we avoid including any attribute that has the default value?
var gltfMaterial = {
......@@ -661,6 +655,18 @@ THREE.GLTFExporter.prototype = {
};
if ( material.isMeshBasicMaterial ) {
gltfMaterial.extensions = { KHR_materials_unlit: {} };
extensionsUsed[ 'KHR_materials_unlit' ] = true;
} else if ( ! material.isMeshStandardMaterial ) {
console.warn( 'GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.' );
}
// pbrMetallicRoughness.baseColorFactor
var color = material.color.toArray().concat( [ material.opacity ] );
......@@ -670,11 +676,16 @@ THREE.GLTFExporter.prototype = {
}
if ( material instanceof THREE.MeshStandardMaterial ) {
if ( material.isMeshStandardMaterial ) {
gltfMaterial.pbrMetallicRoughness.metallicFactor = material.metalness;
gltfMaterial.pbrMetallicRoughness.roughnessFactor = material.roughness;
} else if ( material.isMeshBasicMaterial ) {
gltfMaterial.pbrMetallicRoughness.metallicFactor = 0.0;
gltfMaterial.pbrMetallicRoughness.roughnessFactor = 0.9;
} else {
gltfMaterial.pbrMetallicRoughness.metallicFactor = 0.5;
......@@ -712,9 +723,9 @@ THREE.GLTFExporter.prototype = {
}
if ( material instanceof THREE.MeshBasicMaterial ||
material instanceof THREE.LineBasicMaterial ||
material instanceof THREE.PointsMaterial ) {
if ( material.isMeshBasicMaterial ||
material.isLineBasicMaterial ||
material.isPointsMaterial ) {
} else {
......@@ -834,19 +845,19 @@ THREE.GLTFExporter.prototype = {
var mode;
// Use the correct mode
if ( mesh instanceof THREE.LineSegments ) {
if ( mesh.isLineSegments ) {
mode = WEBGL_CONSTANTS.LINES;
} else if ( mesh instanceof THREE.LineLoop ) {
} else if ( mesh.isLineLoop ) {
mode = WEBGL_CONSTANTS.LINE_LOOP;
} else if ( mesh instanceof THREE.Line ) {
} else if ( mesh.isLine ) {
mode = WEBGL_CONSTANTS.LINE_STRIP;
} else if ( mesh instanceof THREE.Points ) {
} else if ( mesh.isPoints ) {
mode = WEBGL_CONSTANTS.POINTS;
......@@ -1047,7 +1058,7 @@ THREE.GLTFExporter.prototype = {
}
var isOrtho = camera instanceof THREE.OrthographicCamera;
var isOrtho = camera.isOrthographicCamera;
var gltfCamera = {
......@@ -1254,7 +1265,7 @@ THREE.GLTFExporter.prototype = {
*/
function processNode( object ) {
if ( object instanceof THREE.Light ) {
if ( object.isLight ) {
console.warn( 'GLTFExporter: Unsupported node type:', object.constructor.name );
return null;
......@@ -1325,19 +1336,17 @@ THREE.GLTFExporter.prototype = {
}
if ( object instanceof THREE.Mesh ||
object instanceof THREE.Line ||
object instanceof THREE.Points ) {
if ( object.isMesh || object.isLine || object.isPoints ) {
gltfNode.mesh = processMesh( object );
} else if ( object instanceof THREE.Camera ) {
} else if ( object.isCamera ) {
gltfNode.camera = processCamera( object );
}
if ( object instanceof THREE.SkinnedMesh ) {
if ( object.isSkinnedMesh ) {
skins.push( object );
......@@ -1505,6 +1514,10 @@ THREE.GLTFExporter.prototype = {
// Merge buffers.
var blob = new Blob( buffers, { type: 'application/octet-stream' } );
// Declare extensions.
var extensionsUsedList = Object.keys( extensionsUsed );
if ( extensionsUsedList.length > 0 ) outputJSON.extensionsUsed = extensionsUsedList;
if ( outputJSON.buffers && outputJSON.buffers.length > 0 ) {
// Update bytelength of the single buffer.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册