Comparing version 0.2.2 to 0.2.3
{ | ||
"name": "g3d", | ||
"version": "0.2.2", | ||
"version": "0.2.3", | ||
"description": "webgl render engine compatible with both browser and gcanvas", | ||
@@ -5,0 +5,0 @@ "main": "dist/g3d.min.js", |
import GL from './G3D.GL'; | ||
import { IWebGLEnum } from '../types/webgl'; | ||
import { IWebGLBuffer } from '../types/webgl'; | ||
interface IBufferConfig { | ||
data: Float32Array | Uint32Array, | ||
target: string | number | ||
data: Float32Array | ArrayBuffer | ||
} | ||
@@ -11,18 +10,23 @@ | ||
glBuffer; | ||
arrayBuffer: ArrayBuffer; | ||
glBuffer: IWebGLBuffer; | ||
constructor({ data, target }: IBufferConfig) { | ||
constructor({ data }: IBufferConfig) { | ||
const { gl, buffers } = GL; | ||
if (typeof target === 'string') { | ||
target = gl[target]; | ||
// create this.glBuffer | ||
this.glBuffer = gl.createBuffer(); | ||
gl.bindBuffer(gl.ARRAY_BUFFER, this.glBuffer); | ||
gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW); | ||
gl.bindBuffer(gl.ARRAY_BUFFER, null); | ||
// create this.arrayBuffer | ||
if (data instanceof Float32Array) { | ||
this.arrayBuffer = data.buffer; | ||
} else if (data instanceof ArrayBuffer) { | ||
this.arrayBuffer = data; | ||
} | ||
const glBuffer = this.glBuffer = gl.createBuffer(); | ||
gl.bindBuffer(target as IWebGLEnum, glBuffer); | ||
gl.bufferData(target as IWebGLEnum, data, gl.STATIC_DRAW); | ||
gl.bindBuffer(target as IWebGLEnum, null); | ||
// hook on GL | ||
buffers.push(this); | ||
@@ -32,5 +36,3 @@ } | ||
destructor(): void { | ||
const { gl } = GL; | ||
gl.deleteBuffer(this.glBuffer); | ||
@@ -37,0 +39,0 @@ } |
@@ -5,4 +5,4 @@ import Buffer from "./G3D.Buffer"; | ||
buffer: Buffer; | ||
stride?: number; | ||
offset?: number; | ||
byteStride?: number; | ||
byteOffset?: number; | ||
} | ||
@@ -13,11 +13,11 @@ | ||
buffer: Buffer; | ||
stride: number; | ||
offset: number; | ||
readonly buffer: Buffer; | ||
readonly byteStride: number; | ||
readonly byteOffset: number; | ||
constructor({ buffer, stride = 0, offset = 0 }: IBufferViewConfig) { | ||
constructor({ buffer, byteStride = 0, byteOffset = 0 }: IBufferViewConfig) { | ||
this.buffer = buffer; | ||
this.stride = stride; | ||
this.offset = offset; | ||
this.byteStride = byteStride; | ||
this.byteOffset = byteOffset; | ||
} | ||
@@ -24,0 +24,0 @@ |
import GL from './G3D.GL'; | ||
import ElementBuffer from './G3D.ElementBuffer'; | ||
import Buffer from './G3D.Buffer'; | ||
interface IElementBufferViewConfig { | ||
buffer: Buffer; | ||
buffer: ElementBuffer; | ||
mode?: string | number; | ||
count?: number; | ||
type?: string | number; | ||
offset?: number; | ||
byteOffset?: number; | ||
} | ||
@@ -15,9 +14,9 @@ | ||
buffer: Buffer; | ||
mode: number; | ||
count: number; | ||
type: number; | ||
offset: number; | ||
readonly buffer: ElementBuffer; | ||
readonly mode: number; | ||
readonly count: number; | ||
readonly type: number; | ||
readonly byteOffset: number; | ||
constructor({ buffer, mode = 'TRIANGLES', count = 0, type = 'UNSIGNED_INT', offset = 0 }: IElementBufferViewConfig) { | ||
constructor({ buffer, mode = 'TRIANGLES', count = 0, type = 'UNSIGNED_INT', byteOffset = 0 }: IElementBufferViewConfig) { | ||
@@ -39,3 +38,3 @@ const { gl } = GL; | ||
this.type = type; | ||
this.offset = offset; | ||
this.byteOffset = byteOffset; | ||
} | ||
@@ -42,0 +41,0 @@ |
@@ -8,2 +8,3 @@ import Scene from './scene/G3D.Scene'; | ||
import BufferView from './core/G3D.BufferView'; | ||
import ElementBuffer from './core/G3D.ElementBuffer'; | ||
import ElementBufferView from './core/G3D.ElementBufferView'; | ||
@@ -53,2 +54,3 @@ import Texture from './texture/G3D.Texture'; | ||
BufferView, | ||
ElementBuffer, | ||
ElementBufferView, | ||
@@ -55,0 +57,0 @@ Texture, |
import Buffer from '../core/G3D.Buffer'; | ||
import BufferView from "../core/G3D.BufferView"; | ||
import ElementBufferView from "../core/G3D.ElementBufferView"; | ||
import ElementBuffer from '../core/G3D.ElementBuffer'; | ||
import GL from '../core/G3D.GL'; | ||
@@ -20,2 +22,44 @@ interface IGeometryBufferViews { | ||
getBoundingBox() { | ||
let [minX, maxX, minY, maxY, minZ, maxZ] = [undefined, undefined, undefined, undefined, undefined, undefined]; | ||
const compare = (x, y, z) => { | ||
if (minX === undefined) { [minX, maxX, minY, maxY, minZ, maxZ] = [x, x, y, y, z, z]; } | ||
if (x < minX) { minX = x; } | ||
if (x > maxX) { maxX = x; } | ||
if (y < minY) { minY = y; } | ||
if (y > maxY) { maxY = y; } | ||
if (z < minZ) { minZ = z; } | ||
if (z > maxZ) { maxZ = z; } | ||
} | ||
const { gl } = GL; | ||
const { indices, vertices } = this.bufferViews; | ||
const verticesOffset = vertices.byteOffset / 4; | ||
const verticesStride = vertices.byteStride === 0 ? 3 : vertices.byteStride / 4; | ||
for (let key in indices) { | ||
const eleBufferView = indices[key]; | ||
const { count } = eleBufferView; | ||
const indexBytes = eleBufferView.type === gl.UNSIGNED_INT ? 4 : 2; | ||
const indexOffset = eleBufferView.byteOffset / indexBytes; | ||
const indexArray = eleBufferView.type === gl.UNSIGNED_INT ? | ||
new Uint32Array(eleBufferView.buffer.arrayBuffer) : | ||
new Uint16Array(eleBufferView.buffer.arrayBuffer); | ||
const verticeArray = new Float32Array(vertices.buffer.arrayBuffer); | ||
for (let i = 0; i < count; i++) { | ||
const j = indexArray[i + indexOffset] * verticesStride + verticesOffset; | ||
compare(verticeArray[j], verticeArray[j + 1], verticeArray[j + 2]); | ||
} | ||
} | ||
return [minX, maxX, minY, maxY, minZ, maxZ]; | ||
} | ||
protected createBufferView(data: number[] | BufferView | { [propName: string]: number[] | BufferView }): BufferView | { [propName: string]: BufferView } { | ||
@@ -27,4 +71,3 @@ | ||
buffer: new Buffer({ | ||
data: new Float32Array(data), | ||
target: 'ARRAY_BUFFER' | ||
data: new Float32Array(data) | ||
}) | ||
@@ -48,3 +91,3 @@ }); | ||
protected createELementBufferView(data: { [propName: string]: number[] | ElementBufferView }, line: boolean = false): { [propName: string]: ElementBufferView } { | ||
protected createElementBufferView(data: { [propName: string]: number[] | ElementBufferView }, line: boolean = false): { [propName: string]: ElementBufferView } { | ||
@@ -56,5 +99,4 @@ const elementBufferViews = {}; | ||
elementBufferViews[key] = Array.isArray(data[key]) ? new ElementBufferView({ | ||
buffer: new Buffer({ | ||
data: new Uint32Array(data[key] as number[]), | ||
target: 'ELEMENT_ARRAY_BUFFER' | ||
buffer: new ElementBuffer({ | ||
data: new Uint32Array(data[key] as number[]) | ||
}), | ||
@@ -64,3 +106,3 @@ mode: line ? 'LINES' : 'TRIANGLES', | ||
type: 'UNSIGNED_INT', | ||
offset: 0 | ||
byteOffset: 0 | ||
}) : data[key]; | ||
@@ -67,0 +109,0 @@ |
@@ -47,3 +47,3 @@ import Buffer from '../core/G3D.Buffer'; | ||
uvs: uvs ? this.createBufferView(uvs) : null, | ||
indices: this.createELementBufferView(indices) | ||
indices: this.createElementBufferView(indices) | ||
} | ||
@@ -50,0 +50,0 @@ } |
@@ -31,3 +31,3 @@ import BufferView from '../core/G3D.BufferView'; | ||
uvs: this.createBufferView(uvs), | ||
indices: this.createELementBufferView(indices, true), | ||
indices: this.createElementBufferView(indices, true), | ||
} | ||
@@ -34,0 +34,0 @@ |
@@ -12,2 +12,4 @@ import PBREnviroment from '../../../material/G3D.PBREnviroment'; | ||
import Geometry from '../../../geometry/G3D.Geometry'; | ||
import GL from '../../../core/G3D.GL'; | ||
import ElementBuffer from '../../../core/G3D.ElementBuffer'; | ||
@@ -19,2 +21,4 @@ const Mat4: any = Mat4_2; | ||
const { gl } = GL; | ||
const pbrEnv = new PBREnviroment({ diffuse, specular, brdfLUT: lut }); | ||
@@ -26,7 +30,11 @@ | ||
return new Buffer({ | ||
data: data.slice(bv.byteOffset, bv.byteOffset + bv.byteLength), | ||
target: bv.target | ||
}); | ||
if (bv.target === gl.ELEMENT_ARRAY_BUFFER) { | ||
return new ElementBuffer({ | ||
data: data.slice(bv.byteOffset, bv.byteOffset + bv.byteLength) | ||
}); | ||
} else { | ||
return new Buffer({ | ||
data: data.slice(bv.byteOffset, bv.byteOffset + bv.byteLength) | ||
}); | ||
} | ||
}); | ||
@@ -93,3 +101,2 @@ | ||
if (emissiveTexture) { | ||
@@ -157,4 +164,4 @@ material.emissiveTexture = gTextureCreators[emissiveTexture.index](true); | ||
buffer: gBuffers[accessor.bufferView], | ||
stride: accessor.byteStride || 0, | ||
offset: accessor.byteOffset || 0, | ||
byteStride: accessor.byteStride || 0, | ||
byteOffset: accessor.byteOffset || 0, | ||
}); | ||
@@ -170,3 +177,3 @@ | ||
buffer: gBuffers[accessor.bufferView], | ||
offset: accessor.byteOffset || 0, | ||
byteOffset: accessor.byteOffset || 0, | ||
count: accessor.count, | ||
@@ -173,0 +180,0 @@ mode: 'TRIANGLES', |
@@ -374,9 +374,9 @@ import Env from '../core/G3D.Env'; | ||
engine.attribute('aPosition', vertices.buffer.glBuffer, vertices.stride, vertices.offset); | ||
engine.attribute('aPosition', vertices.buffer.glBuffer, vertices.byteStride, vertices.byteOffset); | ||
if (uvs) { | ||
if (typeof uvs.stride === 'number') { | ||
if (typeof uvs.byteStride === 'number') { | ||
engine.attribute('aUV', uvs.buffer.glBuffer, uvs.stride, uvs.offset); | ||
engine.attribute('aUV', uvs.buffer.glBuffer, uvs.byteStride, uvs.byteOffset); | ||
@@ -386,4 +386,5 @@ } else { | ||
Object.keys(uvs).forEach(key => { | ||
engine.attribute(key, uvs[key].buffer.glBuffer, uvs[key].stride, uvs[key].offset); | ||
engine.attribute(key, uvs[key].buffer.glBuffer, uvs[key].byteStride, uvs[key].byteOffset); | ||
}) | ||
} | ||
@@ -393,3 +394,3 @@ } | ||
if (normals) { | ||
engine.attribute('aNormal', normals.buffer.glBuffer, normals.stride, normals.offset); | ||
engine.attribute('aNormal', normals.buffer.glBuffer, normals.byteStride, normals.byteOffset); | ||
} | ||
@@ -520,3 +521,3 @@ | ||
engine.draw(indices[key].mode, indices[key].count, indices[key].type, indices[key].offset); | ||
engine.draw(indices[key].mode, indices[key].count, indices[key].type, indices[key].byteOffset); | ||
} | ||
@@ -540,3 +541,3 @@ } | ||
engine.attribute('aPosition', vertices.buffer.glBuffer, vertices.stride, vertices.offset); | ||
engine.attribute('aPosition', vertices.buffer.glBuffer, vertices.byteStride, vertices.byteOffset); | ||
@@ -549,3 +550,3 @@ engine.uniform('uVMatrix', camera.getVMatrix()); | ||
engine.elements(indices[key].buffer.glBuffer); | ||
engine.draw(indices[key].mode, indices[key].count, indices[key].type, indices[key].offset); | ||
engine.draw(indices[key].mode, indices[key].count, indices[key].type, indices[key].byteOffset); | ||
} | ||
@@ -552,0 +553,0 @@ } |
@@ -94,2 +94,4 @@ export interface ICanvas { | ||
readonly STATIC_DRAW: IWebGLEnum; | ||
readonly UNSIGNED_INT: IWebGLEnum; | ||
readonly UNSIGNED_SHORT: IWebGLEnum; | ||
@@ -149,3 +151,3 @@ getExtension(name: string): any; | ||
createBuffer(): IWebGLBuffer; | ||
bufferData(target: IWebGLEnum, data: Float32Array | Uint32Array, usage: IWebGLEnum): void; | ||
bufferData(target: IWebGLEnum, data: Float32Array | Uint32Array | Uint16Array | ArrayBuffer, usage: IWebGLEnum): void; | ||
deleteBuffer(buffer: IWebGLBuffer): void; | ||
@@ -152,0 +154,0 @@ |
Sorry, the diff of this file is too big to display
401896
88
7220