mirror of
https://github.com/LucasDower/ObjToSchematic.git
synced 2024-12-21 03:09:14 +08:00
Rewrote mesh rendering, disabled debug views
This commit is contained in:
parent
ec49e863c8
commit
c58a03e70c
@ -136,11 +136,20 @@ export class AppContext {
|
|||||||
const uiElements = this._ui.layout.import.elements;
|
const uiElements = this._ui.layout.import.elements;
|
||||||
const filePath = uiElements.input.getCachedValue();
|
const filePath = uiElements.input.getCachedValue();
|
||||||
|
|
||||||
const importer = new ObjImporter();
|
TIME_START('Load Mesh');
|
||||||
importer.parseFile(filePath);
|
{
|
||||||
this._loadedMesh = importer.toMesh();
|
const importer = new ObjImporter();
|
||||||
this._loadedMesh.processMesh();
|
importer.parseFile(filePath);
|
||||||
Renderer.Get.useMesh(this._loadedMesh);
|
this._loadedMesh = importer.toMesh();
|
||||||
|
this._loadedMesh.processMesh();
|
||||||
|
}
|
||||||
|
TIME_END('Load Mesh');
|
||||||
|
|
||||||
|
TIME_START('Render Mesh');
|
||||||
|
{
|
||||||
|
Renderer.Get.useMesh(this._loadedMesh);
|
||||||
|
}
|
||||||
|
TIME_END('Render Mesh');
|
||||||
}
|
}
|
||||||
|
|
||||||
private _simplify() {
|
private _simplify() {
|
||||||
|
113
src/renderer.ts
113
src/renderer.ts
@ -44,13 +44,14 @@ export class Renderer {
|
|||||||
private _modelsAvailable: number;
|
private _modelsAvailable: number;
|
||||||
|
|
||||||
private _materialBuffers: Array<{
|
private _materialBuffers: Array<{
|
||||||
buffer: RenderBuffer,
|
buffer: twgl.BufferInfo,
|
||||||
material: (SolidMaterial | (TexturedMaterial & { texture: WebGLTexture }))
|
material: (SolidMaterial | (TexturedMaterial & { texture: WebGLTexture }))
|
||||||
|
numElements: number,
|
||||||
}>;
|
}>;
|
||||||
public _voxelBuffer?: twgl.BufferInfo;
|
public _voxelBuffer?: twgl.BufferInfo;
|
||||||
public _voxelBufferRaw?: {[attribute: string]: { numComponents: number, data: Float32Array | Uint32Array }};
|
public _voxelBufferRaw?: {[attribute: string]: { numComponents: number, data: Float32Array | Uint32Array }};
|
||||||
private _blockBuffer?: twgl.BufferInfo;
|
private _blockBuffer?: twgl.BufferInfo;
|
||||||
private _debugBuffers: { [meshType: string]: { [bufferComponent: string]: RenderBuffer } };
|
// private _debugBuffers: { [meshType: string]: { [bufferComponent: string]: RenderBuffer } };
|
||||||
private _axisBuffer: RenderBuffer;
|
private _axisBuffer: RenderBuffer;
|
||||||
|
|
||||||
private _isGridComponentEnabled: { [bufferComponent: string]: boolean };
|
private _isGridComponentEnabled: { [bufferComponent: string]: boolean };
|
||||||
@ -70,11 +71,13 @@ export class Renderer {
|
|||||||
this._modelsAvailable = 0;
|
this._modelsAvailable = 0;
|
||||||
this._materialBuffers = [];
|
this._materialBuffers = [];
|
||||||
|
|
||||||
|
/*
|
||||||
this._debugBuffers = {};
|
this._debugBuffers = {};
|
||||||
this._debugBuffers[MeshType.None] = {};
|
this._debugBuffers[MeshType.None] = {};
|
||||||
this._debugBuffers[MeshType.TriangleMesh] = {};
|
this._debugBuffers[MeshType.TriangleMesh] = {};
|
||||||
this._debugBuffers[MeshType.VoxelMesh] = {};
|
this._debugBuffers[MeshType.VoxelMesh] = {};
|
||||||
this._debugBuffers[MeshType.BlockMesh] = {};
|
this._debugBuffers[MeshType.BlockMesh] = {};
|
||||||
|
*/
|
||||||
|
|
||||||
this._isGridComponentEnabled = {};
|
this._isGridComponentEnabled = {};
|
||||||
this._isGridComponentEnabled[EDebugBufferComponents.Grid] = false;
|
this._isGridComponentEnabled[EDebugBufferComponents.Grid] = false;
|
||||||
@ -142,6 +145,17 @@ export class Renderer {
|
|||||||
EventManager.Get.broadcast(EAppEvent.onDevViewEnabledChanged, isEnabled);
|
EventManager.Get.broadcast(EAppEvent.onDevViewEnabledChanged, isEnabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public clearMesh() {
|
||||||
|
EventManager.Get.broadcast(EAppEvent.onModelAvailableChanged, MeshType.TriangleMesh, false);
|
||||||
|
EventManager.Get.broadcast(EAppEvent.onModelAvailableChanged, MeshType.VoxelMesh, false);
|
||||||
|
EventManager.Get.broadcast(EAppEvent.onModelAvailableChanged, MeshType.BlockMesh, false);
|
||||||
|
|
||||||
|
this._materialBuffers = [];
|
||||||
|
|
||||||
|
this._modelsAvailable = 0;
|
||||||
|
this.setModelToUse(MeshType.None);
|
||||||
|
}
|
||||||
|
|
||||||
public useMesh(mesh: Mesh) {
|
public useMesh(mesh: Mesh) {
|
||||||
EventManager.Get.broadcast(EAppEvent.onModelAvailableChanged, MeshType.TriangleMesh, false);
|
EventManager.Get.broadcast(EAppEvent.onModelAvailableChanged, MeshType.TriangleMesh, false);
|
||||||
EventManager.Get.broadcast(EAppEvent.onModelAvailableChanged, MeshType.VoxelMesh, false);
|
EventManager.Get.broadcast(EAppEvent.onModelAvailableChanged, MeshType.VoxelMesh, false);
|
||||||
@ -149,32 +163,78 @@ export class Renderer {
|
|||||||
|
|
||||||
LOG('Using mesh');
|
LOG('Using mesh');
|
||||||
this._materialBuffers = [];
|
this._materialBuffers = [];
|
||||||
|
|
||||||
for (const materialName in mesh.getMaterials()) {
|
const materialTriangleCount = new Map<string, number>();
|
||||||
const materialBuffer = new RenderBuffer([
|
for (let triIndex = 0; triIndex < mesh.getTriangleCount(); ++triIndex) {
|
||||||
{ name: 'position', numComponents: 3 },
|
const materialName = mesh.getMaterialByTriangle(triIndex);
|
||||||
{ name: 'texcoord', numComponents: 2 },
|
const triangleCount = materialTriangleCount.get(materialName) ?? 0;
|
||||||
{ name: 'normal', numComponents: 3 },
|
materialTriangleCount.set(materialName, triangleCount + 1);
|
||||||
]);
|
}
|
||||||
|
|
||||||
|
materialTriangleCount.forEach((triangleCount: number, materialName: string) => {
|
||||||
|
const materialBuffer = {
|
||||||
|
'position': {
|
||||||
|
numComponents: 3,
|
||||||
|
data: new Float32Array(triangleCount * 3 * 3),
|
||||||
|
},
|
||||||
|
'texcoord': {
|
||||||
|
numComponents: 2,
|
||||||
|
data: new Float32Array(triangleCount * 3 * 2),
|
||||||
|
},
|
||||||
|
'normal': {
|
||||||
|
numComponents: 3,
|
||||||
|
data: new Float32Array(triangleCount * 3 * 3),
|
||||||
|
},
|
||||||
|
'indices': {
|
||||||
|
numComponents: 3,
|
||||||
|
data: new Uint32Array(triangleCount * 3),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
let insertIndex = 0;
|
||||||
for (let triIndex = 0; triIndex < mesh.getTriangleCount(); ++triIndex) {
|
for (let triIndex = 0; triIndex < mesh.getTriangleCount(); ++triIndex) {
|
||||||
const material = mesh.getMaterialByTriangle(triIndex);
|
const material = mesh.getMaterialByTriangle(triIndex);
|
||||||
if (material === materialName) {
|
if (material === materialName) {
|
||||||
const uvTri = mesh.getUVTriangle(triIndex);
|
const uiTriangle = mesh.getUVTriangle(triIndex);
|
||||||
const triGeom = GeometryTemplates.getTriangleBufferData(uvTri);
|
// const tmp = GeometryTemplates.getTriangleBufferData(uiTriangle);
|
||||||
materialBuffer.add(triGeom);
|
|
||||||
|
materialBuffer.position.data.set(uiTriangle.v0.toArray(), insertIndex * 9 + 0);
|
||||||
|
materialBuffer.position.data.set(uiTriangle.v1.toArray(), insertIndex * 9 + 3);
|
||||||
|
materialBuffer.position.data.set(uiTriangle.v2.toArray(), insertIndex * 9 + 6);
|
||||||
|
|
||||||
|
materialBuffer.texcoord.data.set([uiTriangle.uv0.u, uiTriangle.uv0.v], insertIndex * 6 + 0);
|
||||||
|
materialBuffer.texcoord.data.set([uiTriangle.uv1.u, uiTriangle.uv1.v], insertIndex * 6 + 2);
|
||||||
|
materialBuffer.texcoord.data.set([uiTriangle.uv2.u, uiTriangle.uv2.v], insertIndex * 6 + 4);
|
||||||
|
|
||||||
|
const normalArray = uiTriangle.getNormal().toArray();
|
||||||
|
materialBuffer.normal.data.set(normalArray, insertIndex * 9 + 0);
|
||||||
|
materialBuffer.normal.data.set(normalArray, insertIndex * 9 + 3);
|
||||||
|
materialBuffer.normal.data.set(normalArray, insertIndex * 9 + 6);
|
||||||
|
|
||||||
|
// materialBuffer.position.data.set(tmp.custom['position'], insertIndex * 9);
|
||||||
|
// materialBuffer.normal.data.set(tmp.custom['normal'], insertIndex * 9);
|
||||||
|
// materialBuffer.texcoord.data.set(tmp.custom['texcoord'], insertIndex * 6);
|
||||||
|
|
||||||
|
materialBuffer.indices.data.set([
|
||||||
|
insertIndex * 3 + 0,
|
||||||
|
insertIndex * 3 + 1,
|
||||||
|
insertIndex * 3 + 2,
|
||||||
|
], insertIndex * 3);
|
||||||
|
|
||||||
|
++insertIndex;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const material = mesh.getMaterialByName(materialName);
|
const material = mesh.getMaterialByName(materialName);
|
||||||
if (material.type === MaterialType.solid) {
|
if (material.type === MaterialType.solid) {
|
||||||
this._materialBuffers.push({
|
this._materialBuffers.push({
|
||||||
buffer: materialBuffer,
|
buffer: twgl.createBufferInfoFromArrays(this._gl, materialBuffer),
|
||||||
material: material,
|
material: material,
|
||||||
|
numElements: materialBuffer.indices.data.length,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this._materialBuffers.push({
|
this._materialBuffers.push({
|
||||||
buffer: materialBuffer,
|
buffer: twgl.createBufferInfoFromArrays(this._gl, materialBuffer),
|
||||||
material: {
|
material: {
|
||||||
type: MaterialType.textured,
|
type: MaterialType.textured,
|
||||||
path: material.path,
|
path: material.path,
|
||||||
@ -183,15 +243,18 @@ export class Renderer {
|
|||||||
mag: this._gl.LINEAR,
|
mag: this._gl.LINEAR,
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
|
numElements: materialBuffer.indices.data.length,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
const dimensions = mesh.getBounds().getDimensions();
|
const dimensions = mesh.getBounds().getDimensions();
|
||||||
this._debugBuffers[MeshType.TriangleMesh][EDebugBufferComponents.Grid] = DebugGeometryTemplates.grid(dimensions);
|
this._debugBuffers[MeshType.TriangleMesh][EDebugBufferComponents.Grid] = DebugGeometryTemplates.grid(dimensions);
|
||||||
this._debugBuffers[MeshType.TriangleMesh][EDebugBufferComponents.Wireframe] = DebugGeometryTemplates.meshWireframe(mesh, new RGB(0.18, 0.52, 0.89).toRGBA());
|
this._debugBuffers[MeshType.TriangleMesh][EDebugBufferComponents.Wireframe] = DebugGeometryTemplates.meshWireframe(mesh, new RGB(0.18, 0.52, 0.89).toRGBA());
|
||||||
this._debugBuffers[MeshType.TriangleMesh][EDebugBufferComponents.Normals] = DebugGeometryTemplates.meshNormals(mesh, new RGB(0.89, 0.52, 0.18).toRGBA());
|
this._debugBuffers[MeshType.TriangleMesh][EDebugBufferComponents.Normals] = DebugGeometryTemplates.meshNormals(mesh, new RGB(0.89, 0.52, 0.18).toRGBA());
|
||||||
delete this._debugBuffers[MeshType.TriangleMesh][EDebugBufferComponents.Dev];
|
delete this._debugBuffers[MeshType.TriangleMesh][EDebugBufferComponents.Dev];
|
||||||
|
*/
|
||||||
|
|
||||||
this._modelsAvailable = 1;
|
this._modelsAvailable = 1;
|
||||||
this.setModelToUse(MeshType.TriangleMesh);
|
this.setModelToUse(MeshType.TriangleMesh);
|
||||||
@ -218,8 +281,10 @@ export class Renderer {
|
|||||||
);
|
);
|
||||||
dimensions.add(1);
|
dimensions.add(1);
|
||||||
|
|
||||||
|
/*
|
||||||
this._debugBuffers[MeshType.VoxelMesh][EDebugBufferComponents.Grid] = DebugGeometryTemplates.grid(Vector3.mulScalar(dimensions, voxelSize), voxelSize);
|
this._debugBuffers[MeshType.VoxelMesh][EDebugBufferComponents.Grid] = DebugGeometryTemplates.grid(Vector3.mulScalar(dimensions, voxelSize), voxelSize);
|
||||||
this._debugBuffers[MeshType.VoxelMesh][EDebugBufferComponents.Wireframe] = DebugGeometryTemplates.voxelMeshWireframe(voxelMesh, new RGB(0.18, 0.52, 0.89).toRGBA(), this._voxelSize);
|
this._debugBuffers[MeshType.VoxelMesh][EDebugBufferComponents.Wireframe] = DebugGeometryTemplates.voxelMeshWireframe(voxelMesh, new RGB(0.18, 0.52, 0.89).toRGBA(), this._voxelSize);
|
||||||
|
*/
|
||||||
|
|
||||||
this._modelsAvailable = 2;
|
this._modelsAvailable = 2;
|
||||||
this.setModelToUse(MeshType.VoxelMesh);
|
this.setModelToUse(MeshType.VoxelMesh);
|
||||||
@ -239,7 +304,9 @@ export class Renderer {
|
|||||||
mag: this._gl.NEAREST,
|
mag: this._gl.NEAREST,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
this._debugBuffers[MeshType.BlockMesh][EDebugBufferComponents.Grid] = this._debugBuffers[MeshType.VoxelMesh][EDebugBufferComponents.Grid];
|
this._debugBuffers[MeshType.BlockMesh][EDebugBufferComponents.Grid] = this._debugBuffers[MeshType.VoxelMesh][EDebugBufferComponents.Grid];
|
||||||
|
*/
|
||||||
|
|
||||||
this._modelsAvailable = 3;
|
this._modelsAvailable = 3;
|
||||||
this.setModelToUse(MeshType.BlockMesh);
|
this.setModelToUse(MeshType.BlockMesh);
|
||||||
@ -250,6 +317,7 @@ export class Renderer {
|
|||||||
// /////////////////////////////////////////////////////////////////////////
|
// /////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
private _drawDebug() {
|
private _drawDebug() {
|
||||||
|
/*
|
||||||
const debugComponents = [EDebugBufferComponents.Grid, EDebugBufferComponents.Wireframe, EDebugBufferComponents.Normals, EDebugBufferComponents.Dev];
|
const debugComponents = [EDebugBufferComponents.Grid, EDebugBufferComponents.Wireframe, EDebugBufferComponents.Normals, EDebugBufferComponents.Dev];
|
||||||
for (const debugComp of debugComponents) {
|
for (const debugComp of debugComponents) {
|
||||||
if (this._isGridComponentEnabled[debugComp]) {
|
if (this._isGridComponentEnabled[debugComp]) {
|
||||||
@ -274,19 +342,20 @@ export class Renderer {
|
|||||||
});
|
});
|
||||||
this._gl.enable(this._gl.DEPTH_TEST);
|
this._gl.enable(this._gl.DEPTH_TEST);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
private _drawMesh() {
|
private _drawMesh() {
|
||||||
for (const materialBuffer of this._materialBuffers) {
|
for (const materialBuffer of this._materialBuffers) {
|
||||||
if (materialBuffer.material.type === MaterialType.textured) {
|
if (materialBuffer.material.type === MaterialType.textured) {
|
||||||
this._drawRegister(materialBuffer.buffer, ShaderManager.Get.textureTriProgram, {
|
this._drawMeshBuffer(materialBuffer.buffer, materialBuffer.numElements, ShaderManager.Get.textureTriProgram, {
|
||||||
u_lightWorldPos: ArcballCamera.Get.getCameraPosition(0.0, 0.0),
|
u_lightWorldPos: ArcballCamera.Get.getCameraPosition(0.0, 0.0),
|
||||||
u_worldViewProjection: ArcballCamera.Get.getWorldViewProjection(),
|
u_worldViewProjection: ArcballCamera.Get.getWorldViewProjection(),
|
||||||
u_worldInverseTranspose: ArcballCamera.Get.getWorldInverseTranspose(),
|
u_worldInverseTranspose: ArcballCamera.Get.getWorldInverseTranspose(),
|
||||||
u_texture: materialBuffer.material.texture,
|
u_texture: materialBuffer.material.texture,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this._drawRegister(materialBuffer.buffer, ShaderManager.Get.solidTriProgram, {
|
this._drawMeshBuffer(materialBuffer.buffer, materialBuffer.numElements, ShaderManager.Get.solidTriProgram, {
|
||||||
u_lightWorldPos: ArcballCamera.Get.getCameraPosition(0.0, 0.0),
|
u_lightWorldPos: ArcballCamera.Get.getCameraPosition(0.0, 0.0),
|
||||||
u_worldViewProjection: ArcballCamera.Get.getWorldViewProjection(),
|
u_worldViewProjection: ArcballCamera.Get.getWorldViewProjection(),
|
||||||
u_worldInverseTranspose: ArcballCamera.Get.getWorldInverseTranspose(),
|
u_worldInverseTranspose: ArcballCamera.Get.getWorldInverseTranspose(),
|
||||||
@ -330,8 +399,8 @@ export class Renderer {
|
|||||||
|
|
||||||
// /////////////////////////////////////////////////////////////////////////
|
// /////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
private _drawRegister(register: RenderBuffer, shaderProgram: twgl.ProgramInfo, uniforms: any) {
|
private _drawMeshBuffer(register: twgl.BufferInfo, numElements: number, shaderProgram: twgl.ProgramInfo, uniforms: any) {
|
||||||
this._drawBuffer(this._gl.TRIANGLES, register.getWebGLBuffer(), shaderProgram, uniforms);
|
this._drawBuffer(this._gl.TRIANGLES, { buffer: register, numElements: numElements }, shaderProgram, uniforms);
|
||||||
}
|
}
|
||||||
|
|
||||||
public setModelToUse(meshType: MeshType) {
|
public setModelToUse(meshType: MeshType) {
|
||||||
|
@ -266,6 +266,7 @@ export class UI {
|
|||||||
groups: {
|
groups: {
|
||||||
'debug': {
|
'debug': {
|
||||||
elements: {
|
elements: {
|
||||||
|
/*
|
||||||
'wireframe': new ToolbarItemElement('wireframe', () => {
|
'wireframe': new ToolbarItemElement('wireframe', () => {
|
||||||
Renderer.Get.toggleIsWireframeEnabled();
|
Renderer.Get.toggleIsWireframeEnabled();
|
||||||
}, EAppEvent.onWireframeEnabledChanged, (...args: any[]) => {
|
}, EAppEvent.onWireframeEnabledChanged, (...args: any[]) => {
|
||||||
@ -294,8 +295,9 @@ export class UI {
|
|||||||
const devBufferAvailable = Renderer.Get.getModelsAvailable() >= 2;
|
const devBufferAvailable = Renderer.Get.getModelsAvailable() >= 2;
|
||||||
return modelUsed === MeshType.TriangleMesh && devBufferAvailable;
|
return modelUsed === MeshType.TriangleMesh && devBufferAvailable;
|
||||||
}),
|
}),
|
||||||
|
*/
|
||||||
},
|
},
|
||||||
elementsOrder: ['wireframe', 'normals', 'dev'],
|
elementsOrder: [], // ['wireframe', 'normals', 'dev'],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
groupsOrder: ['debug'],
|
groupsOrder: ['debug'],
|
||||||
|
Loading…
Reference in New Issue
Block a user