Skip to content
Snippets Groups Projects
Commit d0b3b5ff authored by Alexander Rose's avatar Alexander Rose
Browse files

wip, theme refactor

parent e0da8587
No related branches found
No related tags found
No related merge requests found
Showing
with 254 additions and 173 deletions
...@@ -13,8 +13,8 @@ import Viewer from 'mol-view/viewer' ...@@ -13,8 +13,8 @@ import Viewer from 'mol-view/viewer'
// import { createColorTexture } from 'mol-gl/util'; // import { createColorTexture } from 'mol-gl/util';
// import Icosahedron from 'mol-geo/primitive/icosahedron' // import Icosahedron from 'mol-geo/primitive/icosahedron'
// import Box from 'mol-geo/primitive/box' // import Box from 'mol-geo/primitive/box'
import Spacefill from 'mol-geo/representation/structure/spacefill' import Spacefill, { SpacefillProps } from 'mol-geo/representation/structure/spacefill'
import Point from 'mol-geo/representation/structure/point' import Point, { PointProps } from 'mol-geo/representation/structure/point'
import { Run } from 'mol-task' import { Run } from 'mol-task'
import { Symmetry } from 'mol-model/structure' import { Symmetry } from 'mol-model/structure'
...@@ -48,11 +48,22 @@ export default class State { ...@@ -48,11 +48,22 @@ export default class State {
const struct = await Run(Symmetry.buildAssembly(structures[0], '1'), log, 100) const struct = await Run(Symmetry.buildAssembly(structures[0], '1'), log, 100)
const structPointRepr = StructureRepresentation(Point) const structPointRepr = StructureRepresentation(Point)
await Run(structPointRepr.create(struct), log, 100) const pointProps: PointProps = {
colorTheme: { name: 'uniform', value: 0xFF4411 },
sizeTheme: { name: 'uniform', value: 0.1 }
}
await Run(structPointRepr.create(struct, pointProps), log, 100)
structPointRepr.renderObjects.forEach(viewer.add) structPointRepr.renderObjects.forEach(viewer.add)
const structSpacefillRepr = StructureRepresentation(Spacefill) const structSpacefillRepr = StructureRepresentation(Spacefill)
await Run(structSpacefillRepr.create(struct, { detail: 2 }), log, 100) const spacefillProps: SpacefillProps = {
detail: 1,
// colorTheme: { name: 'uniform', value: 0xFF4411 },
// colorTheme: { name: 'instance-id' },
// colorTheme: { name: 'element-symbol' },
colorTheme: { name: 'atom-id' },
}
await Run(structSpacefillRepr.create(struct, spacefillProps), log, 100)
structSpacefillRepr.renderObjects.forEach(viewer.add) structSpacefillRepr.renderObjects.forEach(viewer.add)
viewer.requestDraw() viewer.requestDraw()
......
...@@ -7,86 +7,78 @@ ...@@ -7,86 +7,78 @@
import { ValueCell } from 'mol-util/value-cell' import { ValueCell } from 'mol-util/value-cell'
import { createPointRenderObject, RenderObject } from 'mol-gl/scene' import { createPointRenderObject, RenderObject } from 'mol-gl/scene'
import { Mat4 } from 'mol-math/linear-algebra'
import { OrderedSet } from 'mol-data/int' import { OrderedSet } from 'mol-data/int'
import { ChunkedArray } from 'mol-data/util';
import { Unit, ElementGroup } from 'mol-model/structure'; import { Unit, ElementGroup } from 'mol-model/structure';
import { RepresentationProps, UnitsRepresentation } from './index'; import { RepresentationProps, UnitsRepresentation } from './index';
import { Task } from 'mol-task' import { Task } from 'mol-task'
import { VdwRadius } from 'mol-model/structure/model/properties/atomic';
import { createUniformColor, createInstanceColor } from '../../color/data';
import { fillSerial } from 'mol-gl/renderable/util'; import { fillSerial } from 'mol-gl/renderable/util';
import { ColorScale } from '../../color/scale';
import { createUniformSize } from '../../size/data';
import { vdwSizeData } from '../../size/structure/vdw';
import VertexMap from '../../shape/vertex-map'; import VertexMap from '../../shape/vertex-map';
import { ColorTheme, SizeTheme } from '../../theme';
import { createTransforms, createColors, createSizes } from './utils';
export const DefaultPointProps = { export const DefaultPointProps = {
colorTheme: { name: 'instance-id' } as ColorTheme,
sizeTheme: { name: 'vdw' } as SizeTheme
} }
export type PointProps = Partial<typeof DefaultPointProps> export type PointProps = Partial<typeof DefaultPointProps>
export function createPointVertices(unit: Unit, elementGroup: ElementGroup) {
const elementCount = OrderedSet.size(elementGroup.elements)
const vertices = new Float32Array(elementCount * 3)
const { x, y, z } = unit.model.conformation
for (let i = 0; i < elementCount; i++) {
const e = OrderedSet.getAt(elementGroup.elements, i)
const i3 = i * 3
vertices[i3] = x[e]
vertices[i3 + 1] = y[e]
vertices[i3 + 2] = z[e]
}
return vertices
}
export default function Point(): UnitsRepresentation<PointProps> { export default function Point(): UnitsRepresentation<PointProps> {
const renderObjects: RenderObject[] = [] const renderObjects: RenderObject[] = []
const vertices = ChunkedArray.create(Float32Array, 3, 1024, 2048);
const sizes = ChunkedArray.create(Float32Array, 1, 1024, 2048);
return { return {
renderObjects, renderObjects,
create: (units: ReadonlyArray<Unit>, elementGroup: ElementGroup, props: PointProps = {}) => Task.create('Spacefill', async ctx => { create: (units: ReadonlyArray<Unit>, elementGroup: ElementGroup, props: PointProps = {}) => Task.create('Spacefill', async ctx => {
// const l = Element.Location(); const { colorTheme, sizeTheme } = { ...DefaultPointProps, ...props }
const { x, y, z } = units[0].model.conformation
const { type_symbol } = units[0].model.hierarchy.atoms
const elementCount = OrderedSet.size(elementGroup.elements) const elementCount = OrderedSet.size(elementGroup.elements)
for (let i = 0; i < elementCount; i++) { const unitCount = units.length
const e = OrderedSet.getAt(elementGroup.elements, i)
ChunkedArray.add3(vertices, x[e], y[e], z[e])
ChunkedArray.add(sizes, VdwRadius(type_symbol.value(e)))
if (i % 10000 === 0 && ctx.shouldUpdate) { const vertexMap = VertexMap.create(
await ctx.update({ message: 'Point', current: i, max: elementCount }); elementCount,
} elementCount + 1,
} fillSerial(new Uint32Array(elementCount)),
fillSerial(new Uint32Array(elementCount + 1))
)
const unitCount = units.length await ctx.update('Computing point vertices');
const transformArray = new Float32Array(unitCount * 16) const vertices = createPointVertices(units[0], elementGroup)
for (let i = 0; i < unitCount; i++) {
Mat4.toArray(units[i].operator.matrix, transformArray, i * 16)
}
// const color = createUniformColor({ value: 0xFF4411 })
const scale = ColorScale.create({ domain: [ 0, unitCount - 1 ] })
const color = createInstanceColor({
colorFn: scale.color,
unitCount
})
// const size = createUniformSize({ value: 1 }) await ctx.update('Computing point transforms');
const size = vdwSizeData({ const transforms = createTransforms(units)
units,
elementGroup, await ctx.update('Computing point colors');
vertexMap: VertexMap.create( const color = createColors(units, elementGroup, vertexMap, colorTheme)
elementCount,
elementCount + 1, await ctx.update('Computing point sizes');
fillSerial(new Uint32Array(elementCount)), const size = createSizes(units, elementGroup, vertexMap, sizeTheme)
fillSerial(new Uint32Array(elementCount + 1))
)
})
console.log(size)
const points = createPointRenderObject({ const points = createPointRenderObject({
objectId: 0, objectId: 0,
position: ValueCell.create(ChunkedArray.compact(vertices, true) as Float32Array), position: ValueCell.create(vertices),
id: ValueCell.create(fillSerial(new Float32Array(unitCount))), id: ValueCell.create(fillSerial(new Float32Array(unitCount))),
size, size,
color, color,
transform: ValueCell.create(transformArray), transform: ValueCell.create(transforms),
instanceCount: unitCount, instanceCount: unitCount,
elementCount, elementCount,
positionCount: vertices.elementCount, positionCount: vertices.length / 3,
usePointSizeAttenuation: true usePointSizeAttenuation: true
}) })
......
...@@ -15,86 +15,79 @@ import { RepresentationProps, UnitsRepresentation } from './index'; ...@@ -15,86 +15,79 @@ import { RepresentationProps, UnitsRepresentation } from './index';
import { Task } from 'mol-task' import { Task } from 'mol-task'
import { MeshBuilder } from '../../shape/mesh-builder'; import { MeshBuilder } from '../../shape/mesh-builder';
import { VdwRadius } from 'mol-model/structure/model/properties/atomic'; import { VdwRadius } from 'mol-model/structure/model/properties/atomic';
import { elementSymbolColorData } from '../../color/structure/element'; import { createTransforms, createColors } from './utils';
import { ColorData } from '../../color'; import { ColorTheme } from '../../theme';
import { createInstanceColor, createUniformColor, createElementInstanceColor } from '../../color/data'; import VertexMap from '../../shape/vertex-map';
import { ColorScale } from '../../color/scale';
export const DefaultSpacefillProps = { export const DefaultSpacefillProps = {
detail: 0 detail: 0,
colorTheme: { name: 'instance-id' } as ColorTheme,
} }
export type SpacefillProps = Partial<typeof DefaultSpacefillProps> export type SpacefillProps = Partial<typeof DefaultSpacefillProps>
function createSpacefillMesh(unit: Unit, elementGroup: ElementGroup, detail: number) {
return Task.create('Spacefill', async ctx => {
const meshBuilder = MeshBuilder.create()
const v = Vec3.zero()
const m = Mat4.identity()
const { x, y, z } = unit.model.conformation
const { type_symbol } = unit.model.hierarchy.atoms
const elementCount = OrderedSet.size(elementGroup.elements)
for (let i = 0; i < elementCount; i++) {
const e = OrderedSet.getAt(elementGroup.elements, i)
v[0] = x[e]
v[1] = y[e]
v[2] = z[e]
Mat4.setTranslation(m, v)
meshBuilder.setId(i)
meshBuilder.addIcosahedron(m, {
radius: VdwRadius(type_symbol.value(e)),
detail
})
if (i % 10000 === 0 && ctx.shouldUpdate) {
await ctx.update({ message: 'Spacefill', current: i, max: elementCount });
}
}
return meshBuilder.getMesh()
})
}
export default function Spacefill(): UnitsRepresentation<SpacefillProps> { export default function Spacefill(): UnitsRepresentation<SpacefillProps> {
const renderObjects: RenderObject[] = [] const renderObjects: RenderObject[] = []
return { return {
renderObjects, renderObjects,
create: (units: ReadonlyArray<Unit>, elementGroup: ElementGroup, props: SpacefillProps = {}) => Task.create('Spacefill', async ctx => { create: (units: ReadonlyArray<Unit>, elementGroup: ElementGroup, props: SpacefillProps = {}) => Task.create('Spacefill', async ctx => {
const { detail } = { ...DefaultSpacefillProps, ...props } const { detail, colorTheme } = { ...DefaultSpacefillProps, ...props }
const meshBuilder = MeshBuilder.create()
const v = Vec3.zero() const unitCount = units.length
const m = Mat4.identity()
const { x, y, z } = units[0].model.conformation
const { type_symbol } = units[0].model.hierarchy.atoms
const elementCount = OrderedSet.size(elementGroup.elements) const elementCount = OrderedSet.size(elementGroup.elements)
for (let i = 0; i < elementCount; i++) {
const e = OrderedSet.getAt(elementGroup.elements, i)
v[0] = x[e]
v[1] = y[e]
v[2] = z[e]
Mat4.setTranslation(m, v)
meshBuilder.setId(i)
meshBuilder.addIcosahedron(m, {
radius: VdwRadius(type_symbol.value(e)),
detail
})
if (i % 10000 === 0 && ctx.shouldUpdate) {
await ctx.update({ message: 'Spacefill', current: i, max: elementCount });
}
}
const mesh = meshBuilder.getMesh() await ctx.update('Computing spacefill mesh');
const mesh = await ctx.runChild(createSpacefillMesh(units[0], elementGroup, detail))
// console.log(mesh) // console.log(mesh)
const unitCount = units.length const vertexMap = VertexMap.fromMesh(mesh)
const transformArray = new Float32Array(unitCount * 16)
for (let i = 0; i < unitCount; i++) {
Mat4.toArray(units[i].operator.matrix, transformArray, i * 16)
}
// console.log({ unitCount, elementCount })
// const color = createUniformColor({ value: 0xFF4411 }) await ctx.update('Computing spacefill transforms');
const transforms = createTransforms(units)
// const color = elementSymbolColorData({ units, elementGroup, mesh })
const scale = ColorScale.create({ domain: [ 0, unitCount - 1 ] })
const color = createInstanceColor({
colorFn: scale.color,
unitCount
})
// const scale = ColorScale.create({ domain: [ 0, unitCount * elementCount - 1 ] }) await ctx.update('Computing spacefill colors');
// const color = createElementInstanceColor({ const color = createColors(units, elementGroup, vertexMap, colorTheme)
// colorFn: (unitIdx, elementIdx) => scale.color(unitIdx * elementCount + elementIdx),
// unitCount,
// offsetCount: mesh.offsetCount,
// offsets: mesh.offsetBuffer as any
// })
const spheres = createMeshRenderObject({ const spheres = createMeshRenderObject({
objectId: 0, objectId: 0,
position: mesh.vertexBuffer, position: mesh.vertexBuffer,
normal: mesh.normalBuffer as ValueCell<Float32Array>, normal: mesh.normalBuffer as ValueCell<Float32Array>,
color: color as ColorData, color: color,
id: mesh.idBuffer as ValueCell<Float32Array>, id: mesh.idBuffer as ValueCell<Float32Array>,
transform: ValueCell.create(transformArray), transform: ValueCell.create(transforms),
index: mesh.indexBuffer, index: mesh.indexBuffer,
instanceCount: unitCount, instanceCount: unitCount,
......
/**
* Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
import { Unit, ElementGroup } from 'mol-model/structure';
import { Mat4 } from 'mol-math/linear-algebra'
import { ColorScale } from 'mol-util/color';
import { createUniformColor, createInstanceColor, createElementInstanceColor } from '../../util/color-data';
import { createUniformSize } from '../../util/size-data';
import { vdwSizeData } from '../../theme/structure/size/vdw';
import VertexMap from '../../shape/vertex-map';
import { ColorTheme, SizeTheme } from '../../theme';
import { elementSymbolColorData } from '../../theme/structure/color/element';
import { OrderedSet } from 'mol-data/int';
export function createTransforms(units: ReadonlyArray<Unit>) {
const unitCount = units.length
const transforms = new Float32Array(unitCount * 16)
for (let i = 0; i < unitCount; i++) {
Mat4.toArray(units[i].operator.matrix, transforms, i * 16)
}
return transforms
}
export function createColors(units: ReadonlyArray<Unit>, elementGroup: ElementGroup, vertexMap: VertexMap, props: ColorTheme) {
const instanceCount = units.length
const elementCount = OrderedSet.size(elementGroup.elements)
switch (props.name) {
case 'uniform':
return createUniformColor(props)
case 'instance-id':
const instanceDomain = props.domain ? props.domain : [ 0, instanceCount - 1 ]
const instanceScale = ColorScale.create({ domain: instanceDomain })
return createInstanceColor({ colorFn: instanceScale.color, instanceCount })
case 'atom-id':
const atomDomain = props.domain ? props.domain : [ 0, instanceCount * elementCount - 1 ]
const atomScale = ColorScale.create({ domain: atomDomain })
return createElementInstanceColor({
colorFn: (unitIdx, elementIdx) => atomScale.color(unitIdx * elementCount + elementIdx),
instanceCount,
vertexMap
})
case 'element-symbol':
return elementSymbolColorData({ units, elementGroup, vertexMap })
}
}
export function createSizes(units: ReadonlyArray<Unit>, elementGroup: ElementGroup, vertexMap: VertexMap, props: SizeTheme) {
switch (props.name) {
case 'uniform':
return createUniformSize(props)
case 'vdw':
return vdwSizeData({ units, elementGroup, vertexMap })
}
}
\ No newline at end of file
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
* @author Alexander Rose <alexander.rose@weirdbyte.de> * @author Alexander Rose <alexander.rose@weirdbyte.de>
*/ */
import { ChunkedArray } from 'mol-data/util';
import { Mesh } from './mesh'; import { Mesh } from './mesh';
/** Mapping between vertices and ids */ /** Mapping between vertices and ids */
...@@ -11,15 +12,26 @@ interface VertexMap { ...@@ -11,15 +12,26 @@ interface VertexMap {
idCount: number, idCount: number,
offsetCount: number, offsetCount: number,
ids: Helpers.NumberArray | undefined ids: Helpers.NumberArray | undefined
offsets: Helpers.NumberArray, offsets: Uint32Array,
} }
function createOffsets(ids: Helpers.NumberArray | undefined) { function createOffsets(idCount: number, ids: Helpers.NumberArray | undefined) {
return [] if (!ids) return new Uint32Array(0)
const offsets = ChunkedArray.create(Uint32Array, 1, 1024, 2048);
let prevId = ids[0]
ChunkedArray.add(offsets, 0)
for (let i = 1; i < idCount; ++i) {
if (prevId !== ids[i]) {
prevId = ids[i]
ChunkedArray.add(offsets, i)
}
}
ChunkedArray.add(offsets, idCount)
return ChunkedArray.compact(offsets, false) as Uint32Array
} }
namespace VertexMap { namespace VertexMap {
export function create(idCount: number, offsetCount: number, ids: Helpers.NumberArray | undefined, offsets: Helpers.NumberArray): VertexMap { export function create(idCount: number, offsetCount: number, ids: Helpers.NumberArray | undefined, offsets: Uint32Array): VertexMap {
return { return {
idCount, idCount,
offsetCount, offsetCount,
...@@ -30,7 +42,7 @@ namespace VertexMap { ...@@ -30,7 +42,7 @@ namespace VertexMap {
export function fromMesh(mesh: Mesh) { export function fromMesh(mesh: Mesh) {
const ids = mesh.idBuffer.ref.value const ids = mesh.idBuffer.ref.value
const offsets = createOffsets(ids) const offsets = createOffsets(mesh.vertexCount, ids)
return create(mesh.vertexCount, offsets.length, ids, offsets) return create(mesh.vertexCount, offsets.length, ids, offsets)
} }
......
/**
* Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
import { SizeData } from './data'
export { SizeData }
\ No newline at end of file
/**
* Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
import { Color } from 'mol-util/color';
export interface UniformColorTheme {
name: 'uniform'
value: Color
}
export interface ScaleColorTheme {
name: 'instance-id' | 'element-symbol' | 'atom-id'
domain?: [number, number]
}
export type ColorTheme = UniformColorTheme | ScaleColorTheme
export interface UniformSizeTheme {
name: 'uniform',
value: number
}
export interface ScaleSizeTheme {
name: 'vdw'
}
export type SizeTheme = UniformSizeTheme | ScaleSizeTheme
\ No newline at end of file
...@@ -5,10 +5,10 @@ ...@@ -5,10 +5,10 @@
*/ */
import { ElementSymbol } from 'mol-model/structure/model/types'; import { ElementSymbol } from 'mol-model/structure/model/types';
import Color from '../color'; import { Color } from 'mol-util/color';
import { createAttributeOrElementColor } from '../data';
import { StructureColorDataProps } from '.'; import { StructureColorDataProps } from '.';
import { OrderedSet } from 'mol-data/int'; import { OrderedSet } from 'mol-data/int';
import { createAttributeOrElementColor } from '../../../util/color-data';
// from Jmol http://jmol.sourceforge.net/jscolors/ (or 0xFFFFFF) // from Jmol http://jmol.sourceforge.net/jscolors/ (or 0xFFFFFF)
export const ElementSymbolColors: { [k: string]: Color } = { export const ElementSymbolColors: { [k: string]: Color } = {
...@@ -23,15 +23,13 @@ export function elementSymbolColor(element: ElementSymbol): Color { ...@@ -23,15 +23,13 @@ export function elementSymbolColor(element: ElementSymbol): Color {
} }
export function elementSymbolColorData(props: StructureColorDataProps) { export function elementSymbolColorData(props: StructureColorDataProps) {
const { units, elementGroup, mesh } = props const { units, elementGroup, vertexMap } = props
const { type_symbol } = units[0].model.hierarchy.atoms const { type_symbol } = units[0].model.hierarchy.atoms
return createAttributeOrElementColor(mesh, { return createAttributeOrElementColor(vertexMap, {
colorFn: (elementIdx: number) => { colorFn: (elementIdx: number) => {
const e = OrderedSet.getAt(elementGroup.elements, elementIdx) const e = OrderedSet.getAt(elementGroup.elements, elementIdx)
return elementSymbolColor(type_symbol.value(e)) return elementSymbolColor(type_symbol.value(e))
}, },
vertexCount: mesh.vertexCount, vertexMap
offsetCount: mesh.offsetCount,
offsets: mesh.offsetBuffer as any
}) })
} }
\ No newline at end of file
...@@ -5,10 +5,10 @@ ...@@ -5,10 +5,10 @@
*/ */
import { ElementGroup, Unit } from 'mol-model/structure'; import { ElementGroup, Unit } from 'mol-model/structure';
import { Mesh } from '../../shape/mesh'; import VertexMap from '../../../shape/vertex-map';
export interface StructureColorDataProps { export interface StructureColorDataProps {
units: ReadonlyArray<Unit>, units: ReadonlyArray<Unit>,
elementGroup: ElementGroup, elementGroup: ElementGroup,
mesh: Mesh vertexMap: VertexMap
} }
\ No newline at end of file
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
*/ */
import { ElementGroup, Unit } from 'mol-model/structure'; import { ElementGroup, Unit } from 'mol-model/structure';
import VertexMap from '../../shape/vertex-map'; import VertexMap from '../../../shape/vertex-map';
export interface StructureSizeDataProps { export interface StructureSizeDataProps {
units: ReadonlyArray<Unit>, units: ReadonlyArray<Unit>,
......
...@@ -7,7 +7,8 @@ ...@@ -7,7 +7,8 @@
import { OrderedSet } from 'mol-data/int'; import { OrderedSet } from 'mol-data/int';
import { VdwRadius } from 'mol-model/structure/model/properties/atomic'; import { VdwRadius } from 'mol-model/structure/model/properties/atomic';
import { StructureSizeDataProps } from '.'; import { StructureSizeDataProps } from '.';
import { createAttributeSize } from '../data'; import { createAttributeSize } from '../../../util/size-data';
export function vdwSizeData(props: StructureSizeDataProps) { export function vdwSizeData(props: StructureSizeDataProps) {
const { units, elementGroup, vertexMap } = props const { units, elementGroup, vertexMap } = props
......
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
import { ValueCell } from 'mol-util'; import { ValueCell } from 'mol-util';
import { Texture, createColorTexture } from 'mol-gl/renderable/util'; import { Texture, createColorTexture } from 'mol-gl/renderable/util';
import Color from './color'; import { Color } from 'mol-util/color';
import { Mesh } from '../shape/mesh'; import VertexMap from '../shape/vertex-map';
export type UniformColor = { type: 'uniform', value: number[] } export type UniformColor = { type: 'uniform', value: number[] }
export type AttributeColor = { type: 'attribute', value: ValueCell<Float32Array> } export type AttributeColor = { type: 'attribute', value: ValueCell<Float32Array> }
...@@ -27,19 +27,17 @@ export function createUniformColor(props: UniformColorProps): UniformColor { ...@@ -27,19 +27,17 @@ export function createUniformColor(props: UniformColorProps): UniformColor {
export interface AttributeColorProps { export interface AttributeColorProps {
colorFn: (elementIdx: number) => Color colorFn: (elementIdx: number) => Color
vertexCount: number, vertexMap: VertexMap
offsetCount: number,
offsets: ValueCell<Uint32Array>
} }
/** Creates color attribute with color for each element (i.e. shared across indtances/units) */ /** Creates color attribute with color for each element (i.e. shared across indtances/units) */
export function createAttributeColor(props: AttributeColorProps): AttributeColor { export function createAttributeColor(props: AttributeColorProps): AttributeColor {
const { colorFn, vertexCount, offsetCount, offsets} = props const { colorFn, vertexMap } = props
const colors = new Float32Array(vertexCount * 3); const { idCount, offsetCount, offsets } = vertexMap
const _offsets = offsets.ref.value const colors = new Float32Array(idCount * 3);
for (let i = 0, il = offsetCount - 1; i < il; ++i) { for (let i = 0, il = offsetCount - 1; i < il; ++i) {
const start = _offsets[i] const start = offsets[i]
const end = _offsets[i + 1] const end = offsets[i + 1]
const hexColor = colorFn(i) const hexColor = colorFn(i)
for (let i = start, il = end; i < il; ++i) { for (let i = start, il = end; i < il; ++i) {
Color.toArrayNormalized(hexColor, colors, i * 3) Color.toArrayNormalized(hexColor, colors, i * 3)
...@@ -49,15 +47,15 @@ export function createAttributeColor(props: AttributeColorProps): AttributeColor ...@@ -49,15 +47,15 @@ export function createAttributeColor(props: AttributeColorProps): AttributeColor
} }
export interface InstanceColorProps { export interface InstanceColorProps {
colorFn: (unitIdx: number) => Color colorFn: (instanceIdx: number) => Color
unitCount: number instanceCount: number
} }
/** Creates color texture with color for each instance/unit */ /** Creates color texture with color for each instance/unit */
export function createInstanceColor(props: InstanceColorProps): InstanceColor { export function createInstanceColor(props: InstanceColorProps): InstanceColor {
const { colorFn, unitCount} = props const { colorFn, instanceCount} = props
const colors = createColorTexture(unitCount) const colors = createColorTexture(instanceCount)
for (let i = 0; i < unitCount; i++) { for (let i = 0; i < instanceCount; i++) {
Color.toArray(colorFn(i), colors, i * 3) Color.toArray(colorFn(i), colors, i * 3)
} }
return { type: 'instance', value: ValueCell.create(colors) } return { type: 'instance', value: ValueCell.create(colors) }
...@@ -65,14 +63,13 @@ export function createInstanceColor(props: InstanceColorProps): InstanceColor { ...@@ -65,14 +63,13 @@ export function createInstanceColor(props: InstanceColorProps): InstanceColor {
export interface ElementColorProps { export interface ElementColorProps {
colorFn: (elementIdx: number) => Color colorFn: (elementIdx: number) => Color
offsetCount: number, vertexMap: VertexMap
offsets: ValueCell<Uint32Array>
} }
/** Creates color texture with color for each element (i.e. shared across indtances/units) */ /** Creates color texture with color for each element (i.e. shared across indtances/units) */
export function createElementColor(props: ElementColorProps): ElementColor { export function createElementColor(props: ElementColorProps): ElementColor {
const { colorFn, offsetCount } = props const { colorFn, vertexMap } = props
const elementCount = offsetCount - 1 const elementCount = vertexMap.offsetCount - 1
const colors = createColorTexture(elementCount) const colors = createColorTexture(elementCount)
for (let i = 0, il = elementCount; i < il; ++i) { for (let i = 0, il = elementCount; i < il; ++i) {
Color.toArray(colorFn(i), colors, i * 3) Color.toArray(colorFn(i), colors, i * 3)
...@@ -81,20 +78,19 @@ export function createElementColor(props: ElementColorProps): ElementColor { ...@@ -81,20 +78,19 @@ export function createElementColor(props: ElementColorProps): ElementColor {
} }
export interface ElementInstanceColorProps { export interface ElementInstanceColorProps {
colorFn: (unitIdx: number, elementIdx: number) => Color colorFn: (instanceIdx: number, elementIdx: number) => Color
unitCount: number, instanceCount: number,
offsetCount: number, vertexMap: VertexMap
offsets: ValueCell<Uint32Array>
} }
/** Creates color texture with color for each element instance (i.e. for each unit) */ /** Creates color texture with color for each element instance (i.e. for each unit) */
export function createElementInstanceColor(props: ElementInstanceColorProps): ElementInstanceColor { export function createElementInstanceColor(props: ElementInstanceColorProps): ElementInstanceColor {
const { colorFn, unitCount, offsetCount } = props const { colorFn, instanceCount, vertexMap } = props
const elementCount = offsetCount - 1 const elementCount = vertexMap.offsetCount - 1
const count = unitCount * elementCount const count = instanceCount * elementCount
const colors = createColorTexture(count) const colors = createColorTexture(count)
let colorOffset = 0 let colorOffset = 0
for (let i = 0; i < unitCount; i++) { for (let i = 0; i < instanceCount; i++) {
for (let j = 0, jl = elementCount; j < jl; ++j) { for (let j = 0, jl = elementCount; j < jl; ++j) {
Color.toArray(colorFn(i, j), colors, colorOffset) Color.toArray(colorFn(i, j), colors, colorOffset)
colorOffset += 3 colorOffset += 3
...@@ -103,8 +99,7 @@ export function createElementInstanceColor(props: ElementInstanceColorProps): El ...@@ -103,8 +99,7 @@ export function createElementInstanceColor(props: ElementInstanceColorProps): El
return { type: 'element-instance', value: ValueCell.create(colors) } return { type: 'element-instance', value: ValueCell.create(colors) }
} }
/** Create color attribute or texture, depending on the mesh */ /** Create color attribute or texture, depending on the vertexMap */
export function createAttributeOrElementColor(mesh: Mesh, props: AttributeColorProps) { export function createAttributeOrElementColor(vertexMap: VertexMap, props: AttributeColorProps) {
// return mesh.vertexCount < 4 * mesh.offsetCount ? createAttributeColor(props) : createElementColor(props) return vertexMap.idCount < 4 * vertexMap.offsetCount ? createAttributeColor(props) : createElementColor(props)
return createAttributeColor(props)
} }
\ No newline at end of file
File moved
...@@ -13,8 +13,8 @@ import { ValueCell } from 'mol-util'; ...@@ -13,8 +13,8 @@ import { ValueCell } from 'mol-util';
import Renderer from '../renderer'; import Renderer from '../renderer';
import { createPointRenderObject } from '../scene'; import { createPointRenderObject } from '../scene';
import { fillSerial } from '../renderable/util'; import { fillSerial } from '../renderable/util';
import { createUniformColor } from 'mol-geo/color/data'; import { createUniformColor } from 'mol-geo/util/color-data';
import { createUniformSize } from 'mol-geo/size/data'; import { createUniformSize } from 'mol-geo/util/size-data';
function writeImage(gl: WebGLRenderingContext, width: number, height: number) { function writeImage(gl: WebGLRenderingContext, width: number, height: number) {
const pixels = new Uint8Array(width * height * 4) const pixels = new Uint8Array(width * height * 4)
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
import REGL = require('regl'); import REGL = require('regl');
import { ValueCell } from 'mol-util/value-cell' import { ValueCell } from 'mol-util/value-cell'
import { ColorData } from 'mol-geo/color'; import { ColorData } from 'mol-geo/util/color-data';
import { Renderable } from '../renderable' import { Renderable } from '../renderable'
import { createBaseDefines, createBaseUniforms, createBaseAttributes, destroyAttributes, destroyUniforms } from './util' import { createBaseDefines, createBaseUniforms, createBaseAttributes, destroyAttributes, destroyUniforms } from './util'
......
...@@ -10,8 +10,8 @@ import { ValueCell } from 'mol-util/value-cell' ...@@ -10,8 +10,8 @@ import { ValueCell } from 'mol-util/value-cell'
import { Renderable } from '../renderable' import { Renderable } from '../renderable'
import { createBaseDefines, createBaseUniforms, createBaseAttributes, destroyUniforms, destroyAttributes } from './util' import { createBaseDefines, createBaseUniforms, createBaseAttributes, destroyUniforms, destroyAttributes } from './util'
import { PointShaders, addDefines } from '../shaders' import { PointShaders, addDefines } from '../shaders'
import { ColorData } from 'mol-geo/color'; import { ColorData } from 'mol-geo/util/color-data';
import { SizeData } from 'mol-geo/size'; import { SizeData } from 'mol-geo/util/size-data';
type Point = 'point' type Point = 'point'
......
...@@ -6,12 +6,12 @@ ...@@ -6,12 +6,12 @@
import REGL = require('regl'); import REGL = require('regl');
import { ValueCell } from 'mol-util/value-cell' import { ValueCell } from 'mol-util/value-cell'
import { ColorData } from 'mol-geo/util/color-data';
import { SizeData } from 'mol-geo/util/size-data';
import { Attributes, AttributesData, AttributesBuffers } from '../renderable' import { Attributes, AttributesData, AttributesBuffers } from '../renderable'
import Attribute from '../attribute' import Attribute from '../attribute'
import { ColorData } from 'mol-geo/color';
import { ShaderDefines } from '../shaders'; import { ShaderDefines } from '../shaders';
import { SizeData } from 'mol-geo/size';
export type ReglUniforms = { [k: string]: REGL.Uniform | REGL.Texture } export type ReglUniforms = { [k: string]: REGL.Uniform | REGL.Texture }
export type ReglAttributes = { [k: string]: REGL.AttributeConfig } export type ReglAttributes = { [k: string]: REGL.AttributeConfig }
......
File moved
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
*/ */
import Color from './color' import Color from './color'
import { ColorData } from './data' import { ColorScale } from './scale';
export { Color, ColorData } export { Color, ColorScale }
export { ColorBrewer, ColorNames } from './tables' export { ColorBrewer, ColorNames } from './tables'
\ No newline at end of file
File moved
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment