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 @@
*/
import { Unit, Structure } from 'mol-model/structure';
import { createUniformColor, ColorData, createGroupColor, createGroupInstanceColor, createInstanceColor } from '../../../../util/color-data';
import { createUniformSize, SizeData, createGroupSize, createGroupInstanceSize, createInstanceSize } from '../../../../util/size-data';
import { createUniformColor, ColorData, createGroupColor, createGroupInstanceColor, createInstanceColor, ColorType } from '../../../../util/color-data';
import { createUniformSize, SizeData, createGroupSize, createGroupInstanceSize, createInstanceSize, SizeType } from '../../../../util/size-data';
import { ValueCell } from 'mol-util';
import { LocationIterator } from '../../../../util/location-iterator';
import { Mesh } from '../../../../mesh/mesh';
......@@ -24,11 +24,14 @@ import { PointProps } from 'mol-geo/representation/structure/representation/poin
import { fillSerial } from 'mol-util/array';
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> {
const colorTheme = ColorTheme(props)
// Always use 'group' kind for 'complex' location iterators, i.e. an instance may include multiple units
const kind = colorTheme.granularity === 'instance' && locationIt.isComplex ? 'group' : colorTheme.granularity
switch (kind) {
switch (getGranularity(locationIt, colorTheme.granularity)) {
case 'uniform': return createUniformColor(ctx, locationIt, colorTheme.color, colorData)
case 'group': return createGroupColor(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,
export async function createSizes(ctx: RuntimeContext, locationIt: LocationIterator, props: SizeThemeProps, sizeData?: SizeData): Promise<SizeData> {
const sizeTheme = SizeTheme(props)
switch (sizeTheme.kind) {
switch (getGranularity(locationIt, sizeTheme.granularity)) {
case 'uniform': return createUniformSize(ctx, locationIt, sizeTheme.size, sizeData)
case 'group': return createGroupSize(ctx, locationIt, sizeTheme.size, sizeData)
case 'groupInstance': return createGroupInstanceSize(ctx, locationIt, sizeTheme.size, sizeData)
......@@ -52,10 +55,7 @@ type StructureMeshProps = Required<MeshProps & StructureProps>
async function _createMeshValues(ctx: RuntimeContext, transforms: TransformData, mesh: Mesh, locationIt: LocationIterator, props: StructureMeshProps): Promise<MeshValues> {
const { instanceCount, groupCount } = locationIt
console.time('createColors')
const color = await createColors(ctx, locationIt, props.colorTheme)
console.timeEnd('createColors')
console.log(locationIt.groupCount)
const marker = createMarkers(instanceCount * groupCount)
const counts = { drawCount: mesh.triangleCount * 3, groupCount, instanceCount }
......
......@@ -10,9 +10,11 @@ import { Color } from 'mol-util/color';
import { Vec2, Vec3 } from 'mol-math/linear-algebra';
import { LocationIterator } from './location-iterator';
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';
export type ColorType = 'uniform' | 'instance' | 'group' | 'groupInstance'
export type ColorData = {
uColor: ValueCell<Vec3>,
aColor: ValueCell<Float32Array>,
......
......@@ -17,8 +17,8 @@ import { UniformColorTheme } from './color/uniform';
import { CrossLinkColorTheme } from './color/cross-link';
import { ShapeGroupColorTheme } from './color/shape-group';
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 interface ColorTheme {
......@@ -46,7 +46,7 @@ export interface ColorThemeProps {
value?: Color
structure?: Structure
color?: LocationColor
kind?: ColorType
granularity?: ColorType
}
export const ColorThemeInfo = {
......
......@@ -13,7 +13,7 @@ const DefaultColor = Color(0xCCCCCC)
export function CustomColorTheme(props: ColorThemeProps): ColorTheme {
const value = defaults(props.value, DefaultColor)
return {
granularity: defaults(props.kind, 'uniform'),
granularity: defaults(props.granularity, 'uniform'),
color: defaults(props.color, () => value)
}
}
\ No newline at end of file
......@@ -11,7 +11,7 @@ import { PhysicalSizeTheme } from './size/physical';
import { UniformSizeTheme } from './size/uniform';
export interface SizeTheme {
kind: SizeType
granularity: SizeType
size: LocationSize
}
......
......@@ -42,7 +42,7 @@ export function PhysicalSizeTheme(props: SizeThemeProps): SizeTheme {
}
return {
kind: 'group',
granularity: 'group',
size: sizeFn
}
}
\ No newline at end of file
......@@ -15,7 +15,7 @@ export function UniformSizeTheme(props: SizeThemeProps): SizeTheme {
const size = value * factor
return {
kind: 'uniform',
granularity: 'uniform',
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