Files
kaolin/tests/integration/experimental/dash3d/test_client_server_io.py
2024-01-16 17:22:21 +08:00

89 lines
3.7 KiB
Python

# Copyright (c) 2019-2020, NVIDIA CORPORATION. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import numpy as np
import os
import pytest
import shutil
import torch
import kaolin
from kaolin.utils.testing import tensor_info
from kaolin.experimental.dash3d.util import meshes_to_binary
from kaolin.experimental.dash3d.util import point_clouds_to_binary
@pytest.fixture(scope='module')
def out_dir():
# Create temporary output directory
out_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '_out')
os.makedirs(out_dir, exist_ok=True)
yield out_dir
shutil.rmtree(out_dir) # Note: comment to keep output directory
@pytest.fixture(scope='module')
def meshes():
vertices0 = np.array([[1.0, 2.0, 3.0],
[10.0, 20.0, 30.0],
[2.0, 4.0, 6.0],
[15.0, 25.0, 35.0]], dtype=np.float32)
faces0 = np.array([[0, 1, 2],
[2, 1, 3]], dtype=np.int32)
vertices1 = np.arange(0, 300).reshape((-1, 3))
faces1 = np.stack([np.arange(0, 100),
np.mod(np.arange(0, 100) + 1, 100),
np.mod(np.arange(0, 100) + 2, 100)]).astype(np.int32).reshape((-1, 3))
vertices2 = np.random.random((1, 9000)).reshape((-1, 3))
faces2 = np.stack([np.mod(np.arange(0, 6000), 1000),
np.ones((6000,)),
np.random.randint(0, 2999 + 1, (6000,))]).astype(np.int32).reshape((-1, 3))
return {"faces": [faces0, faces1, faces2],
"vertices": [vertices0, vertices1, vertices2]}
@pytest.fixture(scope='module')
def pointclouds():
pts0 = np.array([[1.0, 2.0, 3.0],
[10.0, 20.0, 30.0],
[2.0, 4.0, 6.0],
[15.0, 25.0, 35.0]], dtype=np.float32)
pts1 = np.arange(0, 300).astype(np.float32).reshape((-1, 3))
pts2 = np.random.random((1, 9000)).astype(np.float32).reshape((-1, 3))
return {"positions": [pts0, pts1, pts2]}
class TestBinaryEncoding:
def test_server_client_binary_compatibility(self, meshes, pointclouds, out_dir):
# Encode and write mesh0+mesh1 and mesh2 to binary files
binstr = meshes_to_binary(meshes['vertices'][0:2], meshes['faces'][0:2])
with open(os.path.join(out_dir, 'meshes0_1.bin'), 'wb') as f:
f.write(binstr)
binstr = meshes_to_binary([meshes['vertices'][2]], [meshes['faces'][2]])
with open(os.path.join(out_dir, 'meshes2.bin'), 'wb') as f:
f.write(binstr)
# Encode and write ptcloud0+ptcloud1 and pointcloud2 to binary files
binstr = point_clouds_to_binary(pointclouds['positions'][0:2])
with open(os.path.join(out_dir, 'clouds0_1.bin'), 'wb') as f:
f.write(binstr)
binstr = point_clouds_to_binary([pointclouds['positions'][2]])
with open(os.path.join(out_dir, 'clouds2.bin'), 'wb') as f:
f.write(binstr)
# Execute javascript test that checks that these are parsed correctly
js_test = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'test_binary_parse.js')
os.system('npx mocha {}'.format(js_test)) # TODO: will npx work for everyone?