From 144500d7e87539401b1b663cfec3e2e9648597f6 Mon Sep 17 00:00:00 2001 From: badlogic Date: Wed, 17 Aug 2016 16:15:26 +0200 Subject: [PATCH] [ts] First attempt at interleaved rendering, no show --- spine-ts/threejs/src/SkeletonMesh.ts | 56 +++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/spine-ts/threejs/src/SkeletonMesh.ts b/spine-ts/threejs/src/SkeletonMesh.ts index 89ad728ef..0116dacb2 100644 --- a/spine-ts/threejs/src/SkeletonMesh.ts +++ b/spine-ts/threejs/src/SkeletonMesh.ts @@ -6,6 +6,8 @@ module spine.threejs { private _vertexBuffer: THREE.InterleavedBuffer; + static QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0]; + constructor (skeletonData: SkeletonData) { super(); @@ -42,10 +44,60 @@ module spine.threejs { private updateGeometry() { let geometry = this.geometry; + var numVertices = 0; + var verticesLength = 0; + var indicesLength = 0; + + let blendMode: BlendMode = null; + + let vertices: ArrayLike = null; + let triangles: Array = null; + let drawOrder = this.skeleton.drawOrder; + for (let i = 0, n = drawOrder.length; i < n; i++) { + let slot = drawOrder[i]; + let attachment = slot.getAttachment(); + let texture: ThreeJsTexture = null; + if (attachment instanceof RegionAttachment) { + let region = attachment; + vertices = region.updateWorldVertices(slot, false); + triangles = SkeletonMesh.QUAD_TRIANGLES; + texture = (region.region.renderObject).texture; + + } else if (attachment instanceof MeshAttachment) { + let mesh = attachment; + vertices = mesh.updateWorldVertices(slot, false); + triangles = mesh.triangles; + texture = (mesh.region.renderObject).texture; + } else continue; + + if (texture != null) { + (this.material).map = texture.texture; + // FIXME + //let slotBlendMode = slot.data.blendMode; + //if (slotBlendMode != blendMode) { + // blendMode = slotBlendMode; + // batcher.setBlendMode(getSourceGLBlendMode(this._gl, blendMode, premultipliedAlpha), getDestGLBlendMode(this._gl, blendMode)); + //} + + let indexStart = verticesLength / 8; + (this._vertexBuffer.array).set(vertices, verticesLength); + verticesLength += vertices.length; + + let indicesArray = geometry.getIndex().array; + for (let i = indicesLength, j = 0; j < triangles.length; i++, j++) + indicesArray[i] = triangles[j] + indexStart; + indicesLength += triangles.length; + } + } + geometry.drawRange.start = 0; - geometry.drawRange.count = 0; - this._vertexBuffer.needsUpdate = true; + geometry.drawRange.count = indicesLength; + this._vertexBuffer.needsUpdate = true; + this._vertexBuffer.updateRange.offset = 0; + this._vertexBuffer.updateRange.count = verticesLength; geometry.getIndex().needsUpdate = true; + geometry.getIndex().updateRange.offset = 0; + geometry.getIndex().updateRange.count = indicesLength; } } } \ No newline at end of file