Skip to content
Snippets Groups Projects
Commit e13179b9 authored by MarcoSchaeferT's avatar MarcoSchaeferT
Browse files

MegaMol PLY-file loading and rendering works now

parent 94d95b02
No related branches found
No related tags found
No related merge requests found
File suppressed by a .gitattributes entry or the file's encoding is unsupported.
/**
* 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
...@@ -196,11 +196,11 @@ function moveNextInternal(state: State) { ...@@ -196,11 +196,11 @@ function moveNextInternal(state: State) {
if(state.currentProperty < 3){ if(state.currentProperty < 3){
state.vertices[state.currentVertex * 3 + state.currentProperty] = Number(Tokenizer.getTokenString(state.tokenizer)); 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)); state.colors[state.currentVertex * 3 + state.currentProperty-3] = Number(Tokenizer.getTokenString(state.tokenizer));
} }
if(state.currentProperty >= 6 && state.currentProperty <9){ if(state.currentProperty >= 7 && state.currentProperty <10){
state.normals[state.currentVertex * 3 + state.currentProperty-6] = Number(Tokenizer.getTokenString(state.tokenizer)); state.normals[state.currentVertex * 3 + state.currentProperty-7] = Number(Tokenizer.getTokenString(state.tokenizer));
} }
state.currentProperty++; state.currentProperty++;
if(state.currentProperty === state.propertyCount){ if(state.currentProperty === state.propertyCount){
......
...@@ -2,14 +2,15 @@ import {ply_form, PlyFile} from '../../../../mol-io/reader/ply/parse_data/data-m ...@@ -2,14 +2,15 @@ import {ply_form, PlyFile} from '../../../../mol-io/reader/ply/parse_data/data-m
import {RuntimeContext, Task} from 'mol-task'; import {RuntimeContext, Task} from 'mol-task';
import {Mesh} from '../../../../mol-geo/geometry/mesh/mesh'; import {Mesh} from '../../../../mol-geo/geometry/mesh/mesh';
import {MeshBuilder} from '../../../../mol-geo/geometry/mesh/mesh-builder'; import {MeshBuilder} from '../../../../mol-geo/geometry/mesh/mesh-builder';
import { addSphere } from 'mol-geo/geometry/mesh/builder/sphere'; import { addTriangle } from 'mol-geo/geometry/mesh/builder/triangle';
import {Vec3} from '../../../../mol-math/linear-algebra/3d';
import {Shape} from '../../shape'; import {Shape} from '../../shape';
import {Color} from '../../../../mol-util/color'; import {Color} from '../../../../mol-util/color';
import { ShapeProvider } from 'mol-model/shape/provider'; import { ShapeProvider } from 'mol-model/shape/provider';
export interface MyData { export interface MyData {
centers: number[], centers: number[],
normals: number[],
faces: number[],
colors: Color[], colors: Color[],
labels: string[], labels: string[],
transforms: number[] transforms: number[]
...@@ -18,43 +19,58 @@ export interface MyData { ...@@ -18,43 +19,58 @@ export interface MyData {
function collectData_for_Shape(parsedData: ply_form): MyData { function collectData_for_Shape(parsedData: ply_form): MyData {
// parsedData.data.PLY_File. to access So.format.Ply // parsedData.data.PLY_File. to access So.format.Ply
console.log('parsedData', parsedData) console.log('parsedData', parsedData)
const { vertices, colors } = parsedData const { vertices, colors, faces, normals } = parsedData
const data: MyData = { const data: MyData = {
centers: vertices, centers: vertices,
normals: normals,
faces: faces,
colors: [], colors: [],
labels: [], labels: [],
transforms: [] transforms: []
} }
for (let i = 0; i<parsedData.vertexCount; i++) { for (let i = 0; i<parsedData.faceCount; i++) {
data.colors[i] = Color.fromRgb(colors[i*3+0], colors[i*3+1], colors[i*3+2]); 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] = ''; data.labels[i] = parsedData.properties[parsedData.propertyCount * faces[4*i+1] + 10].toString();
//i.toString();
data.transforms[i] = 0; data.transforms[i] = 0;
} }
console.log('data', data); console.log('data', data);
return data; return data;
} }
async function getSphereMesh(ctx: RuntimeContext, centers: number[], mesh?: Mesh) { async function getSphereMesh(ctx: RuntimeContext, centers: number[], normals: number[], faces: number[], mesh?: Mesh) {
const builderState = MeshBuilder.createState(centers.length * 128, centers.length * 128 / 2, mesh) const builderState = MeshBuilder.createState(faces.length, faces.length, mesh)
const v = Vec3.zero()
builderState.currentGroup = 0 builderState.currentGroup = 0
for (let i = 0, il = centers.length / 3; i < il; ++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 sphere ${i}` }) if (i % 10000 === 0 && ctx.shouldUpdate) await ctx.update({ current: i, max: il, message: `adding triangle ${i}` })
builderState.currentGroup = 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); let a = MeshBuilder.getMesh(builderState);
// console.log(a); console.log(a);
return a return a
} }
export async function getShape(ctx: RuntimeContext, parsedData: ply_form, props: {}, shape?: Shape<Mesh>) { export async function getShape(ctx: RuntimeContext, parsedData: ply_form, props: {}, shape?: Shape<Mesh>) {
const data = collectData_for_Shape(parsedData) const data = collectData_for_Shape(parsedData)
await ctx.update('async creation of shape from myData') await ctx.update('async creation of shape from myData')
const { centers , colors, labels } = data const { centers, normals, faces, colors, labels } = data
const mesh = await getSphereMesh(ctx, centers, shape && shape.geometry) const mesh = await getSphereMesh(ctx, centers, normals, faces, shape && shape.geometry)
const groupCount = centers.length / 3 const groupCount = centers.length / 3
return shape || Shape.create( return shape || Shape.create(
'test', mesh, 'test', mesh,
......
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