commit 80f965bc2c1db09fb2ab0bbf3ff6ec257db011f7
parent aee0e840afa15dd73aaf45ee355ca8bf0097ab56
Author: Egor Achkasov <eaachkasov@edu.hse.ru>
Date: Mon, 23 Dec 2024 17:54:03 +0100
Add scripts
Diffstat:
3 files changed, 188 insertions(+), 0 deletions(-)
diff --git a/script/create_material_bin.c b/script/create_material_bin.c
@@ -0,0 +1,35 @@
+#include <stdio.h>
+
+#define NUM_MATERIALS 1
+#define NUM_INDICES 6
+
+typedef struct {
+ int name_size;
+ char *name;
+ float a, b, c, d;
+} Material;
+
+int main() {
+ int material_indices[NUM_INDICES] = {0, 0, 0, 0, 0, 0};
+ Material materials[NUM_MATERIALS] = {
+ {5, "metal", 1., 0., 10000000., 0.}
+ };
+
+ FILE *fp = fopen("materials.bin", "wb");
+ int num_materials = NUM_MATERIALS;
+ int num_indices = NUM_INDICES;
+ fwrite(&num_materials, sizeof(int), 1, fp);
+ fwrite(&num_indices, sizeof(int), 1, fp);
+ fwrite(material_indices, sizeof(int), NUM_INDICES, fp);
+ for (int i = 0; i < NUM_MATERIALS; ++i) {
+ fwrite(&materials[i].name_size, sizeof(int), 1, fp);
+ fwrite(materials[i].name, sizeof(char), materials[i].name_size, fp);
+ fwrite(&materials[i].a, sizeof(float), 1, fp);
+ fwrite(&materials[i].b, sizeof(float), 1, fp);
+ fwrite(&materials[i].c, sizeof(float), 1, fp);
+ fwrite(&materials[i].d, sizeof(float), 1, fp);
+ }
+ fclose(fp);
+
+ return 0;
+}
diff --git a/script/create_ply.c b/script/create_ply.c
@@ -0,0 +1,136 @@
+/* vim: set tabstop=2:softtabstop=2:shiftwidth=2:noexpandtab */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef struct {
+ int name_size;
+ char *name;
+ float a, b, c, d;
+} Material;
+
+typedef struct {
+ unsigned int num_vertices;
+ float *vertices;
+ unsigned int num_faces;
+ int *faces;
+} Mesh;
+
+
+int main(int argc, char *argv[]) {
+ if (argc < 3) {
+ printf("Usage: %s <materials.bin> <path_to_mesh1.ply> [path_to_mesh2.ply] ...\n", argv[0]);
+ return 1;
+ }
+
+ /* materials */
+ FILE *fp = fopen(argv[1], "rb");
+ if (!fp) {
+ printf("Cannot open file %s\n", argv[2]);
+ return 1;
+ }
+ int num_materials;
+ int num_indices;
+ fread(&num_materials, sizeof(int), 1, fp);
+ fread(&num_indices, sizeof(int), 1, fp);
+ Material *materials = (Material *)malloc(sizeof(Material) * num_materials);
+ int *material_indices = (int *)malloc(sizeof(int) * num_indices);
+ fread(material_indices, sizeof(int), num_indices, fp);
+ for (int i = 0; i < num_materials; ++i) {
+ fread(&materials[i].name_size, sizeof(int), 1, fp);
+ materials[i].name = (char *)malloc(sizeof(char) * materials[i].name_size);
+ fread(materials[i].name, sizeof(char), materials[i].name_size, fp);
+ fread(&materials[i].a, sizeof(float), 1, fp);
+ fread(&materials[i].b, sizeof(float), 1, fp);
+ fread(&materials[i].c, sizeof(float), 1, fp);
+ fread(&materials[i].d, sizeof(float), 1, fp);
+ }
+ fclose(fp);
+
+ /* meshes */
+ char line[256];
+ unsigned int num_vertices;
+ unsigned int num_faces;
+ unsigned int num_meshes = argc - 2;
+ Mesh *meshes = (Mesh *)malloc(sizeof(Mesh) * num_meshes);
+ for (int i = 2; i < argc; ++i) {
+ Mesh *mesh = &meshes[i - 2];
+ if ((fp = fopen(argv[i], "rb")) == NULL) {
+ printf("Cannot open file %s\n", argv[1]);
+ return 1;
+ }
+ fseek(fp, 36, SEEK_SET);
+ fgets(line, 32, fp);
+ sscanf(line, "element vertex %d\n", &num_vertices);
+ fseek(fp, 85, SEEK_CUR);
+ fgets(line, 32, fp);
+ sscanf(line, "element face %d\n", &num_faces);
+ fseek(fp, 39, SEEK_CUR);
+ fgets(line, 12, fp);
+ sscanf(line, "end_header\n");
+ mesh->vertices = (float *)malloc(12 * num_vertices);
+ mesh->faces = (int *)malloc(sizeof(int) * 3 * num_faces);
+ mesh->num_vertices = num_vertices;
+ mesh->num_faces = num_faces;
+ for (int i = 0; i < num_vertices; ++i) {
+ fread(&mesh->vertices[3 * i], 4, 3, fp);
+ fseek(fp, 8, SEEK_CUR);
+ }
+ for (int i = 0; i < num_faces; ++i) {
+ fseek(fp, 1, SEEK_CUR);
+ fread(&mesh->faces[3 * i], 4, 3, fp);
+ }
+ fclose(fp);
+ }
+
+ /* unite meshes */
+ num_vertices = 0;
+ num_faces = 0;
+ for (int i = 0; i < num_meshes; ++i) {
+ num_vertices += meshes[i].num_vertices;
+ num_faces += meshes[i].num_faces;
+ }
+ unsigned int sum = meshes[0].num_vertices;
+ for (int i = 1; i < num_meshes; ++i) {
+ for (unsigned int j = 0; j != meshes[i].num_faces; ++j)
+ for (int k = 0; k < 3; ++k)
+ meshes[i].faces[3 * j + k] += sum;
+ sum += meshes[i].num_vertices;
+ }
+
+ fp = fopen("mesh.ply", "wb");
+ fprintf(fp, "ply\n");
+ fprintf(fp, "format binary_little_endian 1.0\n");
+ fprintf(fp, "element vertex %d\n", num_vertices);
+ fprintf(fp, "property float x\n");
+ fprintf(fp, "property float y\n");
+ fprintf(fp, "property float z\n");
+ fprintf(fp, "element radio_material %d\n", num_materials);
+ fprintf(fp, "property list uint char name\n");
+ fprintf(fp, "property float a\n");
+ fprintf(fp, "property float b\n");
+ fprintf(fp, "property float c\n");
+ fprintf(fp, "property float d\n");
+ fprintf(fp, "element face %d\n", num_faces);
+ fprintf(fp, "property list uchar uint vertex_index\n");
+ fprintf(fp, "property uint material_index\n");
+ fprintf(fp, "end_header\n");
+ for (unsigned int j = 0; j != num_meshes; ++j)
+ fwrite(meshes[j].vertices, 4, 3 * meshes[j].num_vertices, fp);
+ for (int i = 0; i != num_materials; ++i) {
+ fwrite(&materials[i].name_size, sizeof(int), 1, fp);
+ fwrite(materials[i].name, sizeof(char), materials[i].name_size, fp);
+ fwrite(&materials[i].a, sizeof(float), 1, fp);
+ fwrite(&materials[i].b, sizeof(float), 1, fp);
+ fwrite(&materials[i].c, sizeof(float), 1, fp);
+ fwrite(&materials[i].d, sizeof(float), 1, fp);
+ }
+ char n = 3;
+ for (unsigned int j = 0; j != num_meshes; ++j)
+ for (unsigned int k = 0; k != meshes[j].num_faces; ++k) {
+ fwrite(&n, 1, 1, fp);
+ fwrite(&meshes[j].faces[3 * k], 4, 3, fp);
+ fwrite(&material_indices[j], 4, 1, fp);
+ }
+ fclose(fp);
+}
diff --git a/script/viz_ray_bin.py b/script/viz_ray_bin.py
@@ -0,0 +1,17 @@
+import open3d as o3d
+import numpy as np
+from sys import argv
+
+pcs = []
+for arg in argv[1:]:
+ f = open(arg, 'rb')
+ #a = np.fromfile(f, dtype=np.float32).reshape((-1, 3))
+ #a = o3d.geometry.PointCloud(o3d.utility.Vector3dVector(a))
+ #pcs.append(a)
+ a = np.fromfile(f, dtype=np.float32).reshape((-1, 10000, 3))
+ f.close()
+ for ai in a:
+ ai = o3d.geometry.PointCloud(o3d.utility.Vector3dVector(ai))
+ pcs.append(ai)
+pcs.append(o3d.io.read_triangle_mesh('scenes/box.ply'))
+o3d.visualization.draw(pcs, show_ui=True)