Loading app/src/components/viewports/ChromatinViewport.tsx +53 −15 Original line number Diff line number Diff line Loading @@ -63,6 +63,8 @@ export function ChromatinViewport(props: { const [isShiftPressed, setShiftPressed] = useState(false); const [sasaGlobalValues, setSasaGlobalValues] = useState<number[][] | null>(null); //~ Labeling let labels: GraphicsModule.Label[] = []; Loading Loading @@ -223,6 +225,45 @@ export function ChromatinViewport(props: { }) }, [viewport, closestIntersection]); // Compute SASA values useEffect(() => { if (!viewport || !configuration.data) { return; } const newSasa: number[][] = []; for (const [configurationDatumIndex, configurationDatum] of configuration.data.entries()) { const datum: Data | undefined = data.data.find(d => d.id === configurationDatum.id); if (!datum) { continue; } const datumPositions = datum.values as Positions3D; const chromatinPart = viewport.getChromatinPartByDataId(configurationDatumIndex); if (!datumPositions || !chromatinPart) { continue; } const positions = datumPositions.positions; if (!positions) { return; } const globalSasaValues = sasa(positions, { method: "constant", probe_size: configuration.sasa.probeSize, }, configuration.sasa.accuracy); newSasa.push(globalSasaValues); } setSasaGlobalValues(_ => newSasa); }, [viewport, data.data, configuration.data, configuration.sasa.probeSize, configuration.sasa.accuracy]); // Calculate/Cache Colors (1D Data Mapping + Selections) useEffect(() => { if (!viewport || !configuration.data) { Loading Loading @@ -296,19 +337,19 @@ export function ChromatinViewport(props: { throw "Not implemented"; } if (!sasaGlobalValues || !sasaGlobalValues[configurationDatumIndex]) { continue; } //TODO: per chromosome or whole chromosome const globalSasaValues = sasa(positions, { method: configuration.sasa.method, probe_size: configuration.sasa.probeSize, }, configuration.sasa.accuracy); //TODO: fix underlying bug where the something sometimes don't contain last bin of the chromosome // if (globalSasaValues.length < chromatinPart.values.length) { // globalSasaValues.push(globalSasaValues.reduce((a, b) => a + b, 0) / globalSasaValues.length); // } // const globalSasaValues = sasa(positions, { // method: configuration.sasa.method, // probe_size: configuration.sasa.probeSize, // }, configuration.sasa.accuracy); const colorScale = chroma.scale(['#fcfdfd', '#010a4e']); newColors[configurationDatumIndex] = chromatinPart.cacheColorArray(mapScaleToChromatin(chromatinPart, globalSasaValues, colorScale)); newColors[configurationDatumIndex] = chromatinPart.cacheColorArray(mapScaleToChromatin(chromatinPart, sasaGlobalValues[configurationDatumIndex], colorScale)); } else if (configurationDatum.colorMappingMode == "1d-density") { const data1d: Array<{ chromosome: string, from: number, to: number }> | null = data.data.find(d => d.id == isoDataID.wrap(configurationDatum.mapValues.id))?.values as Sparse1DTextData | Sparse1DNumericData | null; Loading Loading @@ -360,14 +401,12 @@ export function ChromatinViewport(props: { const numbers = [...Array(binsAmount).keys()]; console.log(numbers); newColors[configurationDatumIndex] = chromatinPart.cacheColorArray(mapScaleToChromatin(chromatinPart, numbers, colorScale)); } } setColors(() => newColors); }, [viewport, globalSelections.selections, configuration.data, configuration.sasa, data.data, configuration.chromosomes, configuration.density]); }, [viewport, globalSelections.selections, configuration.data, configuration.sasa, data.data, configuration.chromosomes, configuration.density, sasaGlobalValues]); // Calculate cullable bins useEffect(() => { Loading Loading @@ -456,7 +495,6 @@ export function ChromatinViewport(props: { } if (tool.type == ChromatinViewportToolType.PointSelection) { console.log('bin is: ', closestIntersection.binIndex); closestIntersection.chromatinPart.setBinColor(closestIntersection.binIndex, { r: selection.color.r, g: selection.color.g, b: selection.color.b, a: 1.0 }); } else if (tool.type == ChromatinViewportToolType.SphereSelection && configuration.data[selectedDatum].selectedSelectionID) { // Only find position in space where the ray intersects Loading Loading @@ -710,10 +748,10 @@ export function ChromatinViewport(props: { const selection = globalSelections.selections.find(s => s.id == selectionId); if (!selection) { throw "No global selection found with local selection ID " + selectionId; throw new Error("No global selection found with local selection ID " + selectionId); } const binPositions = data.data.filter(d => d.id == datum.id)[0] as BinPositionsData; // const binPositions = data.data.filter(d => d.id == datum.id)[0] as BinPositionsData; const newBins: Uint16Array = selection.bins.slice(); if (tool.type == ChromatinViewportToolType.PointSelection) { Loading app/src/modules/storage/models/selections.ts +4 −1 Original line number Diff line number Diff line Loading @@ -100,6 +100,9 @@ export function selectionReducer(state: SelectionState, action: SelectionAction) } const newSelections = [...state.selections]; newSelections[selectionIndex] = { ...state.selections[selectionIndex] }; if (action.name) newSelections[selectionIndex].name = action.name; if (action.color) newSelections[selectionIndex].color = action.color; Loading libs/graphics/src/shaders/postprocess/ssao.wgsl +5 −1 Original line number Diff line number Diff line Loading @@ -65,8 +65,12 @@ main(@builtin(global_invocation_id) GlobalInvocationID let bitangent = cross(viewSpaceNormal, tangent); let TBN = mat3x3<f32>(tangent, bitangent, viewSpaceNormal); if (depth == 0.0) { return; } var occlusion = 0.0; let numberOfSamples = 32; let numberOfSamples = 8; for (var i = 0; i < numberOfSamples; i = i + 1) { // get sample position var samplePos = TBN * globals.noiseSamples[i].xyz; // from tangent to view-space Loading libs/graphics/src/viewports/3d_viewport.ts +23 −23 Original line number Diff line number Diff line Loading @@ -546,30 +546,30 @@ export class Viewport3D { gBufferRasterizeOpaquePass.end(); // commandEncoder.writeTimestamp(this.timestampsQuerySet, 1); // const gBufferRasterizeTransparentPass = commandEncoder.beginRenderPass({ // label: "G-Buffer Rasterization Transparent Pass", // colorAttachments: [ // { // view: this.gBuffer.colorsTransparent.createView(), // clearValue: { r: 0.0, g: 0.0, b: 0.0, a: 0.0 }, // loadOp: 'clear', // storeOp: 'store', // } // ] // }); const gBufferRasterizeTransparentPass = commandEncoder.beginRenderPass({ label: "G-Buffer Rasterization Transparent Pass", colorAttachments: [ { view: this.gBuffer.colorsTransparent.createView(), clearValue: { r: 0.0, g: 0.0, b: 0.0, a: 0.0 }, loadOp: 'clear', storeOp: 'store', } ] }); // gBufferRasterizeTransparentPass.setBindGroup(0, device.createBindGroup({ // label: "Camera BG", // layout: bindGroupLayouts.camera, // entries: [ // { // binding: 0, resource: { buffer: this._camera.bufferGPU, offset: 0 } // }, // ] // })); // gBufferRasterizeTransparentPass.setBindGroup(2, cullObjectsBindGroup); // this.scene.renderRasterization(gBufferRasterizeTransparentPass, this._camera, RenderObjects.Transparent, this.depthTexture.createView()); // gBufferRasterizeTransparentPass.end(); gBufferRasterizeTransparentPass.setBindGroup(0, device.createBindGroup({ label: "Camera BG", layout: bindGroupLayouts.camera, entries: [ { binding: 0, resource: { buffer: this._camera.bufferGPU, offset: 0 } }, ] })); gBufferRasterizeTransparentPass.setBindGroup(2, cullObjectsBindGroup); this.scene.renderRasterization(gBufferRasterizeTransparentPass, this._camera, RenderObjects.Transparent, this.depthTexture.createView()); gBufferRasterizeTransparentPass.end(); //#endregion Loading Loading
app/src/components/viewports/ChromatinViewport.tsx +53 −15 Original line number Diff line number Diff line Loading @@ -63,6 +63,8 @@ export function ChromatinViewport(props: { const [isShiftPressed, setShiftPressed] = useState(false); const [sasaGlobalValues, setSasaGlobalValues] = useState<number[][] | null>(null); //~ Labeling let labels: GraphicsModule.Label[] = []; Loading Loading @@ -223,6 +225,45 @@ export function ChromatinViewport(props: { }) }, [viewport, closestIntersection]); // Compute SASA values useEffect(() => { if (!viewport || !configuration.data) { return; } const newSasa: number[][] = []; for (const [configurationDatumIndex, configurationDatum] of configuration.data.entries()) { const datum: Data | undefined = data.data.find(d => d.id === configurationDatum.id); if (!datum) { continue; } const datumPositions = datum.values as Positions3D; const chromatinPart = viewport.getChromatinPartByDataId(configurationDatumIndex); if (!datumPositions || !chromatinPart) { continue; } const positions = datumPositions.positions; if (!positions) { return; } const globalSasaValues = sasa(positions, { method: "constant", probe_size: configuration.sasa.probeSize, }, configuration.sasa.accuracy); newSasa.push(globalSasaValues); } setSasaGlobalValues(_ => newSasa); }, [viewport, data.data, configuration.data, configuration.sasa.probeSize, configuration.sasa.accuracy]); // Calculate/Cache Colors (1D Data Mapping + Selections) useEffect(() => { if (!viewport || !configuration.data) { Loading Loading @@ -296,19 +337,19 @@ export function ChromatinViewport(props: { throw "Not implemented"; } if (!sasaGlobalValues || !sasaGlobalValues[configurationDatumIndex]) { continue; } //TODO: per chromosome or whole chromosome const globalSasaValues = sasa(positions, { method: configuration.sasa.method, probe_size: configuration.sasa.probeSize, }, configuration.sasa.accuracy); //TODO: fix underlying bug where the something sometimes don't contain last bin of the chromosome // if (globalSasaValues.length < chromatinPart.values.length) { // globalSasaValues.push(globalSasaValues.reduce((a, b) => a + b, 0) / globalSasaValues.length); // } // const globalSasaValues = sasa(positions, { // method: configuration.sasa.method, // probe_size: configuration.sasa.probeSize, // }, configuration.sasa.accuracy); const colorScale = chroma.scale(['#fcfdfd', '#010a4e']); newColors[configurationDatumIndex] = chromatinPart.cacheColorArray(mapScaleToChromatin(chromatinPart, globalSasaValues, colorScale)); newColors[configurationDatumIndex] = chromatinPart.cacheColorArray(mapScaleToChromatin(chromatinPart, sasaGlobalValues[configurationDatumIndex], colorScale)); } else if (configurationDatum.colorMappingMode == "1d-density") { const data1d: Array<{ chromosome: string, from: number, to: number }> | null = data.data.find(d => d.id == isoDataID.wrap(configurationDatum.mapValues.id))?.values as Sparse1DTextData | Sparse1DNumericData | null; Loading Loading @@ -360,14 +401,12 @@ export function ChromatinViewport(props: { const numbers = [...Array(binsAmount).keys()]; console.log(numbers); newColors[configurationDatumIndex] = chromatinPart.cacheColorArray(mapScaleToChromatin(chromatinPart, numbers, colorScale)); } } setColors(() => newColors); }, [viewport, globalSelections.selections, configuration.data, configuration.sasa, data.data, configuration.chromosomes, configuration.density]); }, [viewport, globalSelections.selections, configuration.data, configuration.sasa, data.data, configuration.chromosomes, configuration.density, sasaGlobalValues]); // Calculate cullable bins useEffect(() => { Loading Loading @@ -456,7 +495,6 @@ export function ChromatinViewport(props: { } if (tool.type == ChromatinViewportToolType.PointSelection) { console.log('bin is: ', closestIntersection.binIndex); closestIntersection.chromatinPart.setBinColor(closestIntersection.binIndex, { r: selection.color.r, g: selection.color.g, b: selection.color.b, a: 1.0 }); } else if (tool.type == ChromatinViewportToolType.SphereSelection && configuration.data[selectedDatum].selectedSelectionID) { // Only find position in space where the ray intersects Loading Loading @@ -710,10 +748,10 @@ export function ChromatinViewport(props: { const selection = globalSelections.selections.find(s => s.id == selectionId); if (!selection) { throw "No global selection found with local selection ID " + selectionId; throw new Error("No global selection found with local selection ID " + selectionId); } const binPositions = data.data.filter(d => d.id == datum.id)[0] as BinPositionsData; // const binPositions = data.data.filter(d => d.id == datum.id)[0] as BinPositionsData; const newBins: Uint16Array = selection.bins.slice(); if (tool.type == ChromatinViewportToolType.PointSelection) { Loading
app/src/modules/storage/models/selections.ts +4 −1 Original line number Diff line number Diff line Loading @@ -100,6 +100,9 @@ export function selectionReducer(state: SelectionState, action: SelectionAction) } const newSelections = [...state.selections]; newSelections[selectionIndex] = { ...state.selections[selectionIndex] }; if (action.name) newSelections[selectionIndex].name = action.name; if (action.color) newSelections[selectionIndex].color = action.color; Loading
libs/graphics/src/shaders/postprocess/ssao.wgsl +5 −1 Original line number Diff line number Diff line Loading @@ -65,8 +65,12 @@ main(@builtin(global_invocation_id) GlobalInvocationID let bitangent = cross(viewSpaceNormal, tangent); let TBN = mat3x3<f32>(tangent, bitangent, viewSpaceNormal); if (depth == 0.0) { return; } var occlusion = 0.0; let numberOfSamples = 32; let numberOfSamples = 8; for (var i = 0; i < numberOfSamples; i = i + 1) { // get sample position var samplePos = TBN * globals.noiseSamples[i].xyz; // from tangent to view-space Loading
libs/graphics/src/viewports/3d_viewport.ts +23 −23 Original line number Diff line number Diff line Loading @@ -546,30 +546,30 @@ export class Viewport3D { gBufferRasterizeOpaquePass.end(); // commandEncoder.writeTimestamp(this.timestampsQuerySet, 1); // const gBufferRasterizeTransparentPass = commandEncoder.beginRenderPass({ // label: "G-Buffer Rasterization Transparent Pass", // colorAttachments: [ // { // view: this.gBuffer.colorsTransparent.createView(), // clearValue: { r: 0.0, g: 0.0, b: 0.0, a: 0.0 }, // loadOp: 'clear', // storeOp: 'store', // } // ] // }); const gBufferRasterizeTransparentPass = commandEncoder.beginRenderPass({ label: "G-Buffer Rasterization Transparent Pass", colorAttachments: [ { view: this.gBuffer.colorsTransparent.createView(), clearValue: { r: 0.0, g: 0.0, b: 0.0, a: 0.0 }, loadOp: 'clear', storeOp: 'store', } ] }); // gBufferRasterizeTransparentPass.setBindGroup(0, device.createBindGroup({ // label: "Camera BG", // layout: bindGroupLayouts.camera, // entries: [ // { // binding: 0, resource: { buffer: this._camera.bufferGPU, offset: 0 } // }, // ] // })); // gBufferRasterizeTransparentPass.setBindGroup(2, cullObjectsBindGroup); // this.scene.renderRasterization(gBufferRasterizeTransparentPass, this._camera, RenderObjects.Transparent, this.depthTexture.createView()); // gBufferRasterizeTransparentPass.end(); gBufferRasterizeTransparentPass.setBindGroup(0, device.createBindGroup({ label: "Camera BG", layout: bindGroupLayouts.camera, entries: [ { binding: 0, resource: { buffer: this._camera.bufferGPU, offset: 0 } }, ] })); gBufferRasterizeTransparentPass.setBindGroup(2, cullObjectsBindGroup); this.scene.renderRasterization(gBufferRasterizeTransparentPass, this._camera, RenderObjects.Transparent, this.depthTexture.createView()); gBufferRasterizeTransparentPass.end(); //#endregion Loading