Commit 699f0b90 authored by MatusT's avatar MatusT
Browse files

Less SSAO samples. Transparency fix. Constant recomputation of SASA fix.

parent 263f03d1
Loading
Loading
Loading
Loading
Loading
+53 −15
Original line number Diff line number Diff line
@@ -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[] = [];

@@ -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) {
@@ -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;

@@ -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(() => {
@@ -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
@@ -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) {
+4 −1
Original line number Diff line number Diff line
@@ -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;
+5 −1
Original line number Diff line number Diff line
@@ -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
+23 −23
Original line number Diff line number Diff line
@@ -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