diff --git a/package-lock.json b/package-lock.json index 7325a17319942dc6a86e2fd01de0740a393c55cd..b33e22352472bcd4abcb488c386ffd92af540934 100644 Binary files a/package-lock.json and b/package-lock.json differ diff --git a/src/mol-geo/geometry/mesh/builder/triangle.ts b/src/mol-geo/geometry/mesh/builder/triangle.ts new file mode 100644 index 0000000000000000000000000000000000000000..fe0ba35d3b18d7e4bcaffae6646a0b88a33101da --- /dev/null +++ b/src/mol-geo/geometry/mesh/builder/triangle.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. + * + * @author Alexander Rose <alexander.rose@weirdbyte.de> + */ + +import { Mat4 } from 'mol-math/linear-algebra'; +import { MeshBuilder } from '../mesh-builder'; + +const tmpSphereMat = Mat4.identity() + +function getTriangle(vertices: number[], normals: number[], indices: number[]) { + + return {vertices, normals, indices}; +} + +export function addTriangle(state: MeshBuilder.State, triangle_vertices: number[], triangle_normals: number[], triangle_indices: number[]) { + MeshBuilder.addPrimitive(state, tmpSphereMat, getTriangle( triangle_vertices, triangle_normals, triangle_indices)) +} \ No newline at end of file diff --git a/src/mol-io/reader/ply/parse_data/ply_parser.ts b/src/mol-io/reader/ply/parse_data/ply_parser.ts index 9f126bc0328162e9cf8abcda76ac2addc6fdc117..30ceb2d64b943cb75f6b5e9c23e0de8e88c8663f 100644 --- a/src/mol-io/reader/ply/parse_data/ply_parser.ts +++ b/src/mol-io/reader/ply/parse_data/ply_parser.ts @@ -196,11 +196,11 @@ function moveNextInternal(state: State) { if(state.currentProperty < 3){ state.vertices[state.currentVertex * 3 + state.currentProperty] = Number(Tokenizer.getTokenString(state.tokenizer)); } - if(state.currentProperty >= 3 && state.currentProperty <6){ + if(state.currentProperty >= 3 && state.currentProperty <7){ state.colors[state.currentVertex * 3 + state.currentProperty-3] = Number(Tokenizer.getTokenString(state.tokenizer)); } - if(state.currentProperty >= 6 && state.currentProperty <9){ - state.normals[state.currentVertex * 3 + state.currentProperty-6] = Number(Tokenizer.getTokenString(state.tokenizer)); + if(state.currentProperty >= 7 && state.currentProperty <10){ + state.normals[state.currentVertex * 3 + state.currentProperty-7] = Number(Tokenizer.getTokenString(state.tokenizer)); } state.currentProperty++; if(state.currentProperty === state.propertyCount){ diff --git a/src/mol-model/shape/formarts/ply/plyData_to_shape.ts b/src/mol-model/shape/formarts/ply/plyData_to_shape.ts index bcc3e37a66d9cde09e9a22ae5e1a8b171a75f4b4..4a3ec2e2860e34adca9a4029e33a00dfb28fe2ab 100644 --- a/src/mol-model/shape/formarts/ply/plyData_to_shape.ts +++ b/src/mol-model/shape/formarts/ply/plyData_to_shape.ts @@ -2,14 +2,15 @@ import {ply_form, PlyFile} from '../../../../mol-io/reader/ply/parse_data/data-m import {RuntimeContext, Task} from 'mol-task'; import {Mesh} from '../../../../mol-geo/geometry/mesh/mesh'; import {MeshBuilder} from '../../../../mol-geo/geometry/mesh/mesh-builder'; -import { addSphere } from 'mol-geo/geometry/mesh/builder/sphere'; -import {Vec3} from '../../../../mol-math/linear-algebra/3d'; +import { addTriangle } from 'mol-geo/geometry/mesh/builder/triangle'; import {Shape} from '../../shape'; import {Color} from '../../../../mol-util/color'; import { ShapeProvider } from 'mol-model/shape/provider'; export interface MyData { centers: number[], + normals: number[], + faces: number[], colors: Color[], labels: string[], transforms: number[] @@ -18,43 +19,58 @@ export interface MyData { function collectData_for_Shape(parsedData: ply_form): MyData { // parsedData.data.PLY_File. to access So.format.Ply console.log('parsedData', parsedData) - const { vertices, colors } = parsedData + const { vertices, colors, faces, normals } = parsedData const data: MyData = { centers: vertices, + normals: normals, + faces: faces, colors: [], labels: [], transforms: [] } - for (let i = 0; i<parsedData.vertexCount; i++) { - data.colors[i] = Color.fromRgb(colors[i*3+0], colors[i*3+1], colors[i*3+2]); - data.labels[i] = ''; + for (let i = 0; i<parsedData.faceCount; i++) { + data.colors[i] = Color.fromRgb(colors[faces[4*i+1]*3+0], colors[faces[4*i+1]*3+1], colors[faces[4*i+1]*3+2]); + data.labels[i] = parsedData.properties[parsedData.propertyCount * faces[4*i+1] + 10].toString(); + //i.toString(); data.transforms[i] = 0; } console.log('data', data); return data; } -async function getSphereMesh(ctx: RuntimeContext, centers: number[], mesh?: Mesh) { - const builderState = MeshBuilder.createState(centers.length * 128, centers.length * 128 / 2, mesh) - const v = Vec3.zero() +async function getSphereMesh(ctx: RuntimeContext, centers: number[], normals: number[], faces: number[], mesh?: Mesh) { + const builderState = MeshBuilder.createState(faces.length, faces.length, mesh) builderState.currentGroup = 0 - for (let i = 0, il = centers.length / 3; i < il; ++i) { - if (i % 10000 === 0 && ctx.shouldUpdate) await ctx.update({ current: i, max: il, message: `adding sphere ${i}` }) + for (let i = 0, il = faces.length/4; i < il; ++i) { + if (i % 10000 === 0 && ctx.shouldUpdate) await ctx.update({ current: i, max: il, message: `adding triangle ${i}` }) builderState.currentGroup = i - addSphere(builderState, Vec3.fromArray(v, centers, i * 3), 0.2, 1) + + let triangle_vertices: number[]; + let triangle_normals: number[]; + let triangle_indices: number[]; + triangle_vertices = [centers[faces[4*i+1]*3], centers[faces[4*i+1]*3+1], centers[faces[4*i+1]*3+2], + centers[faces[4*i+2]*3], centers[faces[4*i+2]*3+1], centers[faces[4*i+2]*3+2], + centers[faces[4*i+3]*3], centers[faces[4*i+3]*3+1], centers[faces[4*i+3]*3+2]]; + triangle_normals = [ normals[faces[4*i+1]*3], normals[faces[4*i+1]*3+1], normals[faces[4*i+1]*3+2], + normals[faces[4*i+2]*3], normals[faces[4*i+2]*3+1], normals[faces[4*i+2]*3+2], + normals[faces[4*i+3]*3], normals[faces[4*i+3]*3+1], normals[faces[4*i+3]*3+2]]; + triangle_indices = [0,1,2]; + //console.log(triangle_vertices) + addTriangle(builderState, triangle_vertices, triangle_normals, triangle_indices) } let a = MeshBuilder.getMesh(builderState); - // console.log(a); + console.log(a); return a } + export async function getShape(ctx: RuntimeContext, parsedData: ply_form, props: {}, shape?: Shape<Mesh>) { const data = collectData_for_Shape(parsedData) await ctx.update('async creation of shape from myData') - const { centers , colors, labels } = data - const mesh = await getSphereMesh(ctx, centers, shape && shape.geometry) + const { centers, normals, faces, colors, labels } = data + const mesh = await getSphereMesh(ctx, centers, normals, faces, shape && shape.geometry) const groupCount = centers.length / 3 return shape || Shape.create( 'test', mesh,