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

color-/size-data related refactoring

parent a1f8d899
No related branches found
No related tags found
No related merge requests found
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
*/ */
import { Unit, Structure } from 'mol-model/structure'; import { Unit, Structure } from 'mol-model/structure';
import { createUniformColor, ColorData, createGroupColor, createGroupInstanceColor, createInstanceColor } from '../../../../util/color-data'; import { createUniformColor, ColorData, createGroupColor, createGroupInstanceColor, createInstanceColor, ColorType } from '../../../../util/color-data';
import { createUniformSize, SizeData, createGroupSize, createGroupInstanceSize, createInstanceSize } from '../../../../util/size-data'; import { createUniformSize, SizeData, createGroupSize, createGroupInstanceSize, createInstanceSize, SizeType } from '../../../../util/size-data';
import { ValueCell } from 'mol-util'; import { ValueCell } from 'mol-util';
import { LocationIterator } from '../../../../util/location-iterator'; import { LocationIterator } from '../../../../util/location-iterator';
import { Mesh } from '../../../../mesh/mesh'; import { Mesh } from '../../../../mesh/mesh';
...@@ -24,11 +24,14 @@ import { PointProps } from 'mol-geo/representation/structure/representation/poin ...@@ -24,11 +24,14 @@ import { PointProps } from 'mol-geo/representation/structure/representation/poin
import { fillSerial } from 'mol-util/array'; import { fillSerial } from 'mol-util/array';
import { TransformData, createIdentityTransform, createTransforms } from '../../../../util/transform-data'; import { TransformData, createIdentityTransform, createTransforms } from '../../../../util/transform-data';
function getGranularity(locationIt: LocationIterator, granularity: ColorType | SizeType) {
// Always use 'group' kind for 'complex' location iterators, i.e. an instance may include multiple units
return granularity === 'instance' && locationIt.isComplex ? 'group' : granularity
}
export function createColors(ctx: RuntimeContext, locationIt: LocationIterator, props: ColorThemeProps, colorData?: ColorData): Promise<ColorData> { export function createColors(ctx: RuntimeContext, locationIt: LocationIterator, props: ColorThemeProps, colorData?: ColorData): Promise<ColorData> {
const colorTheme = ColorTheme(props) const colorTheme = ColorTheme(props)
// Always use 'group' kind for 'complex' location iterators, i.e. an instance may include multiple units switch (getGranularity(locationIt, colorTheme.granularity)) {
const kind = colorTheme.granularity === 'instance' && locationIt.isComplex ? 'group' : colorTheme.granularity
switch (kind) {
case 'uniform': return createUniformColor(ctx, locationIt, colorTheme.color, colorData) case 'uniform': return createUniformColor(ctx, locationIt, colorTheme.color, colorData)
case 'group': return createGroupColor(ctx, locationIt, colorTheme.color, colorData) case 'group': return createGroupColor(ctx, locationIt, colorTheme.color, colorData)
case 'groupInstance': return createGroupInstanceColor(ctx, locationIt, colorTheme.color, colorData) case 'groupInstance': return createGroupInstanceColor(ctx, locationIt, colorTheme.color, colorData)
...@@ -38,7 +41,7 @@ export function createColors(ctx: RuntimeContext, locationIt: LocationIterator, ...@@ -38,7 +41,7 @@ export function createColors(ctx: RuntimeContext, locationIt: LocationIterator,
export async function createSizes(ctx: RuntimeContext, locationIt: LocationIterator, props: SizeThemeProps, sizeData?: SizeData): Promise<SizeData> { export async function createSizes(ctx: RuntimeContext, locationIt: LocationIterator, props: SizeThemeProps, sizeData?: SizeData): Promise<SizeData> {
const sizeTheme = SizeTheme(props) const sizeTheme = SizeTheme(props)
switch (sizeTheme.kind) { switch (getGranularity(locationIt, sizeTheme.granularity)) {
case 'uniform': return createUniformSize(ctx, locationIt, sizeTheme.size, sizeData) case 'uniform': return createUniformSize(ctx, locationIt, sizeTheme.size, sizeData)
case 'group': return createGroupSize(ctx, locationIt, sizeTheme.size, sizeData) case 'group': return createGroupSize(ctx, locationIt, sizeTheme.size, sizeData)
case 'groupInstance': return createGroupInstanceSize(ctx, locationIt, sizeTheme.size, sizeData) case 'groupInstance': return createGroupInstanceSize(ctx, locationIt, sizeTheme.size, sizeData)
...@@ -52,10 +55,7 @@ type StructureMeshProps = Required<MeshProps & StructureProps> ...@@ -52,10 +55,7 @@ type StructureMeshProps = Required<MeshProps & StructureProps>
async function _createMeshValues(ctx: RuntimeContext, transforms: TransformData, mesh: Mesh, locationIt: LocationIterator, props: StructureMeshProps): Promise<MeshValues> { async function _createMeshValues(ctx: RuntimeContext, transforms: TransformData, mesh: Mesh, locationIt: LocationIterator, props: StructureMeshProps): Promise<MeshValues> {
const { instanceCount, groupCount } = locationIt const { instanceCount, groupCount } = locationIt
console.time('createColors')
const color = await createColors(ctx, locationIt, props.colorTheme) const color = await createColors(ctx, locationIt, props.colorTheme)
console.timeEnd('createColors')
console.log(locationIt.groupCount)
const marker = createMarkers(instanceCount * groupCount) const marker = createMarkers(instanceCount * groupCount)
const counts = { drawCount: mesh.triangleCount * 3, groupCount, instanceCount } const counts = { drawCount: mesh.triangleCount * 3, groupCount, instanceCount }
......
...@@ -10,9 +10,11 @@ import { Color } from 'mol-util/color'; ...@@ -10,9 +10,11 @@ import { Color } from 'mol-util/color';
import { Vec2, Vec3 } from 'mol-math/linear-algebra'; import { Vec2, Vec3 } from 'mol-math/linear-algebra';
import { LocationIterator } from './location-iterator'; import { LocationIterator } from './location-iterator';
import { NullLocation } from 'mol-model/location'; import { NullLocation } from 'mol-model/location';
import { LocationColor, ColorType } from 'mol-view/theme/color'; import { LocationColor } from 'mol-view/theme/color';
import { RuntimeContext } from 'mol-task'; import { RuntimeContext } from 'mol-task';
export type ColorType = 'uniform' | 'instance' | 'group' | 'groupInstance'
export type ColorData = { export type ColorData = {
uColor: ValueCell<Vec3>, uColor: ValueCell<Vec3>,
aColor: ValueCell<Float32Array>, aColor: ValueCell<Float32Array>,
......
...@@ -17,8 +17,8 @@ import { UniformColorTheme } from './color/uniform'; ...@@ -17,8 +17,8 @@ import { UniformColorTheme } from './color/uniform';
import { CrossLinkColorTheme } from './color/cross-link'; import { CrossLinkColorTheme } from './color/cross-link';
import { ShapeGroupColorTheme } from './color/shape-group'; import { ShapeGroupColorTheme } from './color/shape-group';
import { CustomColorTheme } from './color/custom'; import { CustomColorTheme } from './color/custom';
import { ColorType } from 'mol-geo/util/color-data';
export type ColorType = 'uniform' | 'instance' | 'group' | 'groupInstance'
export type LocationColor = (location: Location, isSecondary: boolean) => Color export type LocationColor = (location: Location, isSecondary: boolean) => Color
export interface ColorTheme { export interface ColorTheme {
...@@ -46,7 +46,7 @@ export interface ColorThemeProps { ...@@ -46,7 +46,7 @@ export interface ColorThemeProps {
value?: Color value?: Color
structure?: Structure structure?: Structure
color?: LocationColor color?: LocationColor
kind?: ColorType granularity?: ColorType
} }
export const ColorThemeInfo = { export const ColorThemeInfo = {
......
...@@ -13,7 +13,7 @@ const DefaultColor = Color(0xCCCCCC) ...@@ -13,7 +13,7 @@ const DefaultColor = Color(0xCCCCCC)
export function CustomColorTheme(props: ColorThemeProps): ColorTheme { export function CustomColorTheme(props: ColorThemeProps): ColorTheme {
const value = defaults(props.value, DefaultColor) const value = defaults(props.value, DefaultColor)
return { return {
granularity: defaults(props.kind, 'uniform'), granularity: defaults(props.granularity, 'uniform'),
color: defaults(props.color, () => value) color: defaults(props.color, () => value)
} }
} }
\ No newline at end of file
...@@ -11,7 +11,7 @@ import { PhysicalSizeTheme } from './size/physical'; ...@@ -11,7 +11,7 @@ import { PhysicalSizeTheme } from './size/physical';
import { UniformSizeTheme } from './size/uniform'; import { UniformSizeTheme } from './size/uniform';
export interface SizeTheme { export interface SizeTheme {
kind: SizeType granularity: SizeType
size: LocationSize size: LocationSize
} }
......
...@@ -42,7 +42,7 @@ export function PhysicalSizeTheme(props: SizeThemeProps): SizeTheme { ...@@ -42,7 +42,7 @@ export function PhysicalSizeTheme(props: SizeThemeProps): SizeTheme {
} }
return { return {
kind: 'group', granularity: 'group',
size: sizeFn size: sizeFn
} }
} }
\ No newline at end of file
...@@ -15,7 +15,7 @@ export function UniformSizeTheme(props: SizeThemeProps): SizeTheme { ...@@ -15,7 +15,7 @@ export function UniformSizeTheme(props: SizeThemeProps): SizeTheme {
const size = value * factor const size = value * factor
return { return {
kind: 'uniform', granularity: 'uniform',
size: () => size size: () => size
} }
} }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment