|
@@ -42,12 +42,13 @@ const IsosurfaceSchema = {
|
|
|
|
|
|
dPackedGroup: DefineSpec('boolean'),
|
|
dPackedGroup: DefineSpec('boolean'),
|
|
dAxisOrder: DefineSpec('string', ['012', '021', '102', '120', '201', '210']),
|
|
dAxisOrder: DefineSpec('string', ['012', '021', '102', '120', '201', '210']),
|
|
|
|
+ dConstantGroup: DefineSpec('boolean'),
|
|
};
|
|
};
|
|
type IsosurfaceValues = Values<typeof IsosurfaceSchema>
|
|
type IsosurfaceValues = Values<typeof IsosurfaceSchema>
|
|
|
|
|
|
const IsosurfaceName = 'isosurface';
|
|
const IsosurfaceName = 'isosurface';
|
|
|
|
|
|
-function getIsosurfaceRenderable(ctx: WebGLContext, activeVoxelsPyramid: Texture, activeVoxelsBase: Texture, volumeData: Texture, gridDim: Vec3, gridTexDim: Vec3, transform: Mat4, isoValue: number, levels: number, scale: Vec2, count: number, invert: boolean, packedGroup: boolean, axisOrder: Vec3): ComputeRenderable<IsosurfaceValues> {
|
|
|
|
|
|
+function getIsosurfaceRenderable(ctx: WebGLContext, activeVoxelsPyramid: Texture, activeVoxelsBase: Texture, volumeData: Texture, gridDim: Vec3, gridTexDim: Vec3, transform: Mat4, isoValue: number, levels: number, scale: Vec2, count: number, invert: boolean, packedGroup: boolean, axisOrder: Vec3, constantGroup: boolean): ComputeRenderable<IsosurfaceValues> {
|
|
if (ctx.namedComputeRenderables[IsosurfaceName]) {
|
|
if (ctx.namedComputeRenderables[IsosurfaceName]) {
|
|
const v = ctx.namedComputeRenderables[IsosurfaceName].values as IsosurfaceValues;
|
|
const v = ctx.namedComputeRenderables[IsosurfaceName].values as IsosurfaceValues;
|
|
|
|
|
|
@@ -66,17 +67,18 @@ function getIsosurfaceRenderable(ctx: WebGLContext, activeVoxelsPyramid: Texture
|
|
ValueCell.update(v.uGridTransform, transform);
|
|
ValueCell.update(v.uGridTransform, transform);
|
|
ValueCell.update(v.uScale, scale);
|
|
ValueCell.update(v.uScale, scale);
|
|
|
|
|
|
- ValueCell.update(v.dPackedGroup, packedGroup);
|
|
|
|
|
|
+ ValueCell.updateIfChanged(v.dPackedGroup, packedGroup);
|
|
ValueCell.updateIfChanged(v.dAxisOrder, axisOrder.join(''));
|
|
ValueCell.updateIfChanged(v.dAxisOrder, axisOrder.join(''));
|
|
|
|
+ ValueCell.updateIfChanged(v.dConstantGroup, constantGroup);
|
|
|
|
|
|
ctx.namedComputeRenderables[IsosurfaceName].update();
|
|
ctx.namedComputeRenderables[IsosurfaceName].update();
|
|
} else {
|
|
} else {
|
|
- ctx.namedComputeRenderables[IsosurfaceName] = createIsosurfaceRenderable(ctx, activeVoxelsPyramid, activeVoxelsBase, volumeData, gridDim, gridTexDim, transform, isoValue, levels, scale, count, invert, packedGroup, axisOrder);
|
|
|
|
|
|
+ ctx.namedComputeRenderables[IsosurfaceName] = createIsosurfaceRenderable(ctx, activeVoxelsPyramid, activeVoxelsBase, volumeData, gridDim, gridTexDim, transform, isoValue, levels, scale, count, invert, packedGroup, axisOrder, constantGroup);
|
|
}
|
|
}
|
|
return ctx.namedComputeRenderables[IsosurfaceName];
|
|
return ctx.namedComputeRenderables[IsosurfaceName];
|
|
}
|
|
}
|
|
|
|
|
|
-function createIsosurfaceRenderable(ctx: WebGLContext, activeVoxelsPyramid: Texture, activeVoxelsBase: Texture, volumeData: Texture, gridDim: Vec3, gridTexDim: Vec3, transform: Mat4, isoValue: number, levels: number, scale: Vec2, count: number, invert: boolean, packedGroup: boolean, axisOrder: Vec3) {
|
|
|
|
|
|
+function createIsosurfaceRenderable(ctx: WebGLContext, activeVoxelsPyramid: Texture, activeVoxelsBase: Texture, volumeData: Texture, gridDim: Vec3, gridTexDim: Vec3, transform: Mat4, isoValue: number, levels: number, scale: Vec2, count: number, invert: boolean, packedGroup: boolean, axisOrder: Vec3, constantGroup: boolean) {
|
|
// console.log('uSize', Math.pow(2, levels))
|
|
// console.log('uSize', Math.pow(2, levels))
|
|
const values: IsosurfaceValues = {
|
|
const values: IsosurfaceValues = {
|
|
...QuadValues,
|
|
...QuadValues,
|
|
@@ -99,6 +101,7 @@ function createIsosurfaceRenderable(ctx: WebGLContext, activeVoxelsPyramid: Text
|
|
|
|
|
|
dPackedGroup: ValueCell.create(packedGroup),
|
|
dPackedGroup: ValueCell.create(packedGroup),
|
|
dAxisOrder: ValueCell.create(axisOrder.join('')),
|
|
dAxisOrder: ValueCell.create(axisOrder.join('')),
|
|
|
|
+ dConstantGroup: ValueCell.create(constantGroup),
|
|
};
|
|
};
|
|
|
|
|
|
const schema = { ...IsosurfaceSchema };
|
|
const schema = { ...IsosurfaceSchema };
|
|
@@ -119,7 +122,7 @@ function setRenderingDefaults(ctx: WebGLContext) {
|
|
state.clearColor(0, 0, 0, 0);
|
|
state.clearColor(0, 0, 0, 0);
|
|
}
|
|
}
|
|
|
|
|
|
-export function createIsosurfaceBuffers(ctx: WebGLContext, activeVoxelsBase: Texture, volumeData: Texture, histogramPyramid: HistogramPyramid, gridDim: Vec3, gridTexDim: Vec3, transform: Mat4, isoValue: number, invert: boolean, packedGroup: boolean, axisOrder: Vec3, vertexTexture?: Texture, groupTexture?: Texture, normalTexture?: Texture) {
|
|
|
|
|
|
+export function createIsosurfaceBuffers(ctx: WebGLContext, activeVoxelsBase: Texture, volumeData: Texture, histogramPyramid: HistogramPyramid, gridDim: Vec3, gridTexDim: Vec3, transform: Mat4, isoValue: number, invert: boolean, packedGroup: boolean, axisOrder: Vec3, constantGroup: boolean, vertexTexture?: Texture, groupTexture?: Texture, normalTexture?: Texture) {
|
|
const { drawBuffers } = ctx.extensions;
|
|
const { drawBuffers } = ctx.extensions;
|
|
if (!drawBuffers) throw new Error('need WebGL draw buffers');
|
|
if (!drawBuffers) throw new Error('need WebGL draw buffers');
|
|
|
|
|
|
@@ -178,7 +181,7 @@ export function createIsosurfaceBuffers(ctx: WebGLContext, activeVoxelsBase: Tex
|
|
groupTexture.attachFramebuffer(framebuffer, 1);
|
|
groupTexture.attachFramebuffer(framebuffer, 1);
|
|
normalTexture.attachFramebuffer(framebuffer, 2);
|
|
normalTexture.attachFramebuffer(framebuffer, 2);
|
|
|
|
|
|
- const renderable = getIsosurfaceRenderable(ctx, pyramidTex, activeVoxelsBase, volumeData, gridDim, gridTexDim, transform, isoValue, levels, scale, count, invert, packedGroup, axisOrder);
|
|
|
|
|
|
+ const renderable = getIsosurfaceRenderable(ctx, pyramidTex, activeVoxelsBase, volumeData, gridDim, gridTexDim, transform, isoValue, levels, scale, count, invert, packedGroup, axisOrder, constantGroup);
|
|
ctx.state.currentRenderItemId = -1;
|
|
ctx.state.currentRenderItemId = -1;
|
|
|
|
|
|
framebuffer.bind();
|
|
framebuffer.bind();
|
|
@@ -210,11 +213,11 @@ export function createIsosurfaceBuffers(ctx: WebGLContext, activeVoxelsBase: Tex
|
|
*
|
|
*
|
|
* Implementation based on http://www.miaumiau.cat/2016/10/stream-compaction-in-webgl/
|
|
* Implementation based on http://www.miaumiau.cat/2016/10/stream-compaction-in-webgl/
|
|
*/
|
|
*/
|
|
-export function extractIsosurface(ctx: WebGLContext, volumeData: Texture, gridDim: Vec3, gridTexDim: Vec3, gridTexScale: Vec2, transform: Mat4, isoValue: number, invert: boolean, packedGroup: boolean, axisOrder: Vec3, vertexTexture?: Texture, groupTexture?: Texture, normalTexture?: Texture) {
|
|
|
|
|
|
+export function extractIsosurface(ctx: WebGLContext, volumeData: Texture, gridDim: Vec3, gridTexDim: Vec3, gridTexScale: Vec2, transform: Mat4, isoValue: number, invert: boolean, packedGroup: boolean, axisOrder: Vec3, constantGroup: boolean, vertexTexture?: Texture, groupTexture?: Texture, normalTexture?: Texture) {
|
|
if (isTimingMode) ctx.timer.mark('extractIsosurface');
|
|
if (isTimingMode) ctx.timer.mark('extractIsosurface');
|
|
const activeVoxelsTex = calcActiveVoxels(ctx, volumeData, gridDim, gridTexDim, isoValue, gridTexScale);
|
|
const activeVoxelsTex = calcActiveVoxels(ctx, volumeData, gridDim, gridTexDim, isoValue, gridTexScale);
|
|
const compacted = createHistogramPyramid(ctx, activeVoxelsTex, gridTexScale, gridTexDim);
|
|
const compacted = createHistogramPyramid(ctx, activeVoxelsTex, gridTexScale, gridTexDim);
|
|
- const gv = createIsosurfaceBuffers(ctx, activeVoxelsTex, volumeData, compacted, gridDim, gridTexDim, transform, isoValue, invert, packedGroup, axisOrder, vertexTexture, groupTexture, normalTexture);
|
|
|
|
|
|
+ const gv = createIsosurfaceBuffers(ctx, activeVoxelsTex, volumeData, compacted, gridDim, gridTexDim, transform, isoValue, invert, packedGroup, axisOrder, constantGroup, vertexTexture, groupTexture, normalTexture);
|
|
if (isTimingMode) ctx.timer.markEnd('extractIsosurface');
|
|
if (isTimingMode) ctx.timer.markEnd('extractIsosurface');
|
|
|
|
|
|
return gv;
|
|
return gv;
|