From e4a46ae56f089b825b9c05d52c77586d7c11f7e9 Mon Sep 17 00:00:00 2001 From: bdysvik Date: Mon, 19 Dec 2016 15:23:14 +0100 Subject: [PATCH] Added Line and LineSegments support for the Three.js glTF loader. Includes two examples: snowFlake and SnowFlakes where snowFlake is a THREE.Line object and snowFlakes a THREE.LineSegments object. Both examples are based on the geometry in the bufferedgeometry/lines/indexed demo. --- examples/js/loaders/GLTFLoader.js | 76 ++++++++- examples/models/gltf/snowflake/line_frag.glsl | 8 + examples/models/gltf/snowflake/line_vert.glsl | 17 ++ examples/models/gltf/snowflake/snowFlake.bin | Bin 0 -> 6168 bytes examples/models/gltf/snowflake/snowFlake.gltf | 133 ++++++++++++++++ .../models/gltf/snowflakes/line_frag.glsl | 8 + .../models/gltf/snowflakes/line_vert.glsl | 17 ++ .../models/gltf/snowflakes/snowFlakes.bin | Bin 0 -> 38464 bytes .../models/gltf/snowflakes/snowFlakes.gltf | 150 ++++++++++++++++++ examples/webgl_loader_gltf.html | 21 ++- 10 files changed, 425 insertions(+), 5 deletions(-) create mode 100644 examples/models/gltf/snowflake/line_frag.glsl create mode 100644 examples/models/gltf/snowflake/line_vert.glsl create mode 100644 examples/models/gltf/snowflake/snowFlake.bin create mode 100644 examples/models/gltf/snowflake/snowFlake.gltf create mode 100644 examples/models/gltf/snowflakes/line_frag.glsl create mode 100644 examples/models/gltf/snowflakes/line_vert.glsl create mode 100644 examples/models/gltf/snowflakes/snowFlakes.bin create mode 100644 examples/models/gltf/snowflakes/snowFlakes.gltf diff --git a/examples/js/loaders/GLTFLoader.js b/examples/js/loaders/GLTFLoader.js index 6878e9bd62..78587542cd 100644 --- a/examples/js/loaders/GLTFLoader.js +++ b/examples/js/loaders/GLTFLoader.js @@ -301,6 +301,7 @@ THREE.GLTFLoader = ( function () { REPEAT: 10497, SAMPLER_2D: 35678, TRIANGLES: 4, + LINES: 1, UNSIGNED_BYTE: 5121, UNSIGNED_SHORT: 5123, @@ -1227,14 +1228,76 @@ THREE.GLTFLoader = ( function () { var meshNode = new THREE.Mesh( geometry, material ); meshNode.castShadow = true; + + if ( primitive.extras ) meshNode.userData = primitive.extras; + + group.add( meshNode ); + + } + + else if ( primitive.mode === WEBGL_CONSTANTS.LINES) { + + var geometry = new THREE.BufferGeometry(); + + var attributes = primitive.attributes; + + _each( attributes, function( attributeEntry, attributeId ) { + + if ( !attributeEntry ) { + + return; + + } + + var bufferAttribute = dependencies.accessors[ attributeEntry ]; + + switch ( attributeId ) { + + case 'POSITION': + geometry.addAttribute( 'position', bufferAttribute ); + break; + + case 'COLOR': + geometry.addAttribute( 'color', bufferAttribute ); + break; + + } + + }); + + if ( primitive.indices ) { + + var indexArray = dependencies.accessors[ primitive.indices ]; + + if(indexArray) { + + geometry.setIndex(indexArray); + + var offset = { + start: 0, + index: 0, + count: indexArray.count + }; + + geometry.groups.push(offset); + geometry.computeBoundingSphere(); + } + } + + var material = dependencies.materials[ primitive.material ]; + + var meshNode = new THREE.Line( geometry, material ); + if ( primitive.indices ) meshNode = new THREE.LineSegments( geometry, material ); if ( primitive.extras ) meshNode.userData = primitive.extras; group.add( meshNode ); - } else { + } + + else { - console.warn( "Non-triangular primitives are not supported" ); + console.warn( "Only triangular and line primitives are supported" ); } @@ -1474,8 +1537,13 @@ THREE.GLTFLoader = ( function () { material = originalMaterial; } - - child = new THREE.Mesh( originalGeometry, material ); + if(child.type=="Line") { + child = new THREE.Line(originalGeometry, material); + } + else if(child.type=="LineSegments") { + child = new THREE.LineSegments(originalGeometry, material); + } + else child = new THREE.Mesh( originalGeometry, material ); child.castShadow = true; child.userData = originalUserData; diff --git a/examples/models/gltf/snowflake/line_frag.glsl b/examples/models/gltf/snowflake/line_frag.glsl new file mode 100644 index 0000000000..b3b1579fd2 --- /dev/null +++ b/examples/models/gltf/snowflake/line_frag.glsl @@ -0,0 +1,8 @@ +precision highp float; +varying vec3 vertexColor; + +void main(void) { + + gl_FragColor = vec4(vertexColor.r, vertexColor.g, vertexColor.b, 1.0);; + +} diff --git a/examples/models/gltf/snowflake/line_vert.glsl b/examples/models/gltf/snowflake/line_vert.glsl new file mode 100644 index 0000000000..f74e0094b0 --- /dev/null +++ b/examples/models/gltf/snowflake/line_vert.glsl @@ -0,0 +1,17 @@ +precision highp float; + +attribute vec3 position; +attribute vec3 color; + +uniform mat4 modelViewMatrix; +uniform mat4 projectionMatrix; + +varying vec3 vertexColor; + +void main(void) { + + vec4 pos = modelViewMatrix * vec4(position,1.0); + vertexColor = vec3(color.x, color.y, color.y); + gl_Position = projectionMatrix * pos; + +} \ No newline at end of file diff --git a/examples/models/gltf/snowflake/snowFlake.bin b/examples/models/gltf/snowflake/snowFlake.bin new file mode 100644 index 0000000000000000000000000000000000000000..d71c78fb2c5976e1ed7ab43a20537cb294cd8170 GIT binary patch literal 6168 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 literal 0 HcmV?d00001 diff --git a/examples/models/gltf/snowflake/snowFlake.gltf b/examples/models/gltf/snowflake/snowFlake.gltf new file mode 100644 index 0000000000..ff8ed60eb1 --- /dev/null +++ b/examples/models/gltf/snowflake/snowFlake.gltf @@ -0,0 +1,133 @@ +{ + "accessors": { + "VertexAccessor": { + "bufferView": "VertexBuffer", + "byteOffset": 0, + "byteStride": 12, + "componentType": 5126, + "count": 257, + "type": "VEC3", + "name": "VertexAccessor" + }, + "ColorAccessor": { + "bufferView": "ColorView", + "byteOffset": 0, + "byteStride": 12, + "componentType": 5126, + "count": 257, + "type": "VEC3", + "name": "ColorAccessor" + } + }, + "buffers": { + "Buffer": { + "uri": "snowFlake.bin", + "byteLength": 6168, + "type": "arraybuffer", + "name": "Buffer", + "extensions": {} + } + }, + "bufferViews": { + "VertexBuffer": { + "buffer": "Buffer", + "byteOffset": 0, + "byteLength": 3084, + "target": 34962, + "name": "VertexBuffer" + }, + "ColorView": { + "buffer": "Buffer", + "byteOffset": 3084, + "byteLength": 3084, + "target": 34962, + "name": "ColorView" + } + }, + "images": {}, + "materials": { + "meshMaterial": { + "technique": "meshTechnique", + "values": {}, + "name": "meshMaterial" + } + }, + "meshes": { + "mesh": { + "primitives": [ + { + "attributes": { + "POSITION": "VertexAccessor", + "COLOR": "ColorAccessor" + }, + "material": "meshMaterial", + "mode": 1 + } + ], + "name": "mesh" + } + }, + "nodes": { + "node1": { + "children": [], + "meshes": [ + "mesh" + ], + "name": "node1" + } + }, + "programs": { + "meshProgram": { + "attributes": [ + "VertexAccessor", + "ColorAccessor" + ], + "fragmentShader": "fragmentShader", + "vertexShader": "vertexShader", + "name": "shader" + } + }, + "samplers": {}, + "scene": "default scene", + "scenes": { + "default scene": { + "nodes": [ + "node1" + ], + "name": "default scene" + } + }, + "shaders": { + "fragmentShader": { + "uri": "line_frag.glsl", + "type": 35632, + "name": "fragmentShader" + }, + "vertexShader": { + "uri": "line_vert.glsl", + "type": 35633, + "name": "vertexShader" + } + }, + "techniques": { + "meshTechnique": { + "parameters": { + "color": { + "type": 35665, + "semantic": "color" + } + }, + "attributes": {}, + "program": "meshProgram", + "uniforms": {}, + "states": { + "enable": [ + 3042, + 2929 + ] + }, + "name": "meshTechnique" + } + }, + "textures": {} +} \ No newline at end of file diff --git a/examples/models/gltf/snowflakes/line_frag.glsl b/examples/models/gltf/snowflakes/line_frag.glsl new file mode 100644 index 0000000000..b3b1579fd2 --- /dev/null +++ b/examples/models/gltf/snowflakes/line_frag.glsl @@ -0,0 +1,8 @@ +precision highp float; +varying vec3 vertexColor; + +void main(void) { + + gl_FragColor = vec4(vertexColor.r, vertexColor.g, vertexColor.b, 1.0);; + +} diff --git a/examples/models/gltf/snowflakes/line_vert.glsl b/examples/models/gltf/snowflakes/line_vert.glsl new file mode 100644 index 0000000000..f74e0094b0 --- /dev/null +++ b/examples/models/gltf/snowflakes/line_vert.glsl @@ -0,0 +1,17 @@ +precision highp float; + +attribute vec3 position; +attribute vec3 color; + +uniform mat4 modelViewMatrix; +uniform mat4 projectionMatrix; + +varying vec3 vertexColor; + +void main(void) { + + vec4 pos = modelViewMatrix * vec4(position,1.0); + vertexColor = vec3(color.x, color.y, color.y); + gl_Position = projectionMatrix * pos; + +} \ No newline at end of file diff --git a/examples/models/gltf/snowflakes/snowFlakes.bin b/examples/models/gltf/snowflakes/snowFlakes.bin new file mode 100644 index 0000000000000000000000000000000000000000..13d5228418dddf41788ff719291d2ae164e4ad4f GIT binary patch literal 38464 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 literal 0 HcmV?d00001 diff --git a/examples/models/gltf/snowflakes/snowFlakes.gltf b/examples/models/gltf/snowflakes/snowFlakes.gltf new file mode 100644 index 0000000000..a7096a4326 --- /dev/null +++ b/examples/models/gltf/snowflakes/snowFlakes.gltf @@ -0,0 +1,150 @@ +{ + "accessors": { + "VertexAccessor": { + "bufferView": "VertexBuffer", + "byteOffset": 0, + "byteStride": 12, + "componentType": 5126, + "count": 1376, + "type": "VEC3", + "name": "VertexAccessor" + }, + "TriangleAccessor": { + "bufferView": "Lines", + "byteOffset": 0, + "byteStride": 2, + "componentType": 5123, + "count": 2720, + "type": "SCALAR", + "name": "TriangleAccessor" + }, + "ColorAccessor": { + "bufferView": "ColorView", + "byteOffset": 0, + "byteStride": 12, + "componentType": 5126, + "count": 1376, + "type": "VEC3", + "name": "ColorAccessor" + } + }, + "buffers": { + "Buffer": { + "uri": "snowFlakes.bin", + "byteLength": 38464, + "type": "arraybuffer", + "name": "Buffer", + "extensions": {} + } + }, + "bufferViews": { + "VertexBuffer": { + "buffer": "Buffer", + "byteOffset": 0, + "byteLength": 16512, + "target": 34962, + "name": "VertexBuffer" + }, + "Lines": { + "buffer": "Buffer", + "byteOffset": 16512, + "byteLength": 5440, + "target": 34962, + "name": "Lines" + }, + "ColorView": { + "buffer": "Buffer", + "byteOffset": 21952, + "byteLength": 16512, + "target": 34962, + "name": "ColorView" + } + }, + "images": {}, + "materials": { + "meshMaterial": { + "technique": "meshTechnique", + "values": {}, + "name": "meshMaterial" + } + }, + "meshes": { + "mesh": { + "primitives": [ + { + "attributes": { + "POSITION": "VertexAccessor", + "COLOR": "ColorAccessor" + }, + "indices": "TriangleAccessor", + "material": "meshMaterial", + "mode": 1 + } + ], + "name": "mesh" + } + }, + "nodes": { + "node1": { + "children": [], + "meshes": [ + "mesh" + ], + "name": "node1" + } + }, + "programs": { + "meshProgram": { + "attributes": [ + "VertexAccessor", + "ColorAccessor" + ], + "fragmentShader": "fragmentShader", + "vertexShader": "vertexShader", + "name": "shader" + } + }, + "samplers": {}, + "scene": "default scene", + "scenes": { + "default scene": { + "nodes": [ + "node1" + ], + "name": "default scene" + } + }, + "shaders": { + "fragmentShader": { + "uri": "line_frag.glsl", + "type": 35632, + "name": "fragmentShader" + }, + "vertexShader": { + "uri": "line_vert.glsl", + "type": 35633, + "name": "vertexShader" + } + }, + "techniques": { + "meshTechnique": { + "parameters": { + "color": { + "type": 35665, + "semantic": "color" + } + }, + "attributes": {}, + "program": "meshProgram", + "uniforms": {}, + "states": { + "enable": [ + 3042, + 2929 + ] + }, + "name": "meshTechnique" + } + }, + "textures": {} +} \ No newline at end of file diff --git a/examples/webgl_loader_gltf.html b/examples/webgl_loader_gltf.html index 45589d3ca6..0c7c524b30 100644 --- a/examples/webgl_loader_gltf.html +++ b/examples/webgl_loader_gltf.html @@ -94,7 +94,7 @@ glTF loader -
monster by 3drt - - COLLADA duck by Sony - other models courtesy Cesium + COLLADA duck by Sony - Cesium models courtesy Cesium
@@ -429,6 +429,25 @@ addLights:true, addGround:true, shadows:true + }, + { + name : "Snowflake", + url : "./models/gltf/snowflake/snowFlake.gltf", + objectScale: new THREE.Vector3(4, 4, 1), + cameraPos: new THREE.Vector3(0, 100, 5000), + objectPosition: new THREE.Vector3(0, 0, 0), + addLights:false, + addGround:false, + shadows:false + }, + { + name : "Snowflakes", + url : "./models/gltf/snowflakes/snowFlakes.gltf", + cameraPos: new THREE.Vector3(0, 100, 5000), + objectPosition: new THREE.Vector3(-1200, -1200, 0), + addLights:false, + addGround:false, + shadows:false } ]; -- GitLab