Skip to content

Commit

Permalink
add auto-billboard test
Browse files Browse the repository at this point in the history
  • Loading branch information
corybarr committed Aug 4, 2023
1 parent 7f2d862 commit 1387697
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -47,25 +47,11 @@ def _alter_prims(self):
camera_path = viewport.get_active_camera()
camera = UsdGeom.Camera.Get(stage, camera_path)
xform = UsdGeom.Xformable(camera)
# print(f"xform is {type(xform)}")
time = Usd.TimeCode.Default() # The time at which we compute the bounding box
world_transform: Gf.Matrix4d = xform.ComputeLocalToWorldTransform(time)

# print("Matrix:")
# for i in range(4):
# row = [0 if abs(world_transform[i][j]) < 0.00001 else world_transform[i][j] for j in range(4)]
# print(" ".join(map(str, row)))

translation: Gf.Vec3d = world_transform.ExtractTranslation()

up_vector = Gf.Vec3f(world_transform[1][0], world_transform[1][1], world_transform[1][2])

# print("Up vector:", up_vector)


# self._logger.info(f"got translation: {translation}")
# self._logger.info(f"get up vector {up_vector}")

return_val = self._cesium_omniverse_interface.alter_procedural_prims(
translation[0], translation[1], translation[2],
up_vector[0], up_vector[1], up_vector[2])
Expand Down Expand Up @@ -102,9 +88,18 @@ def _setup_update_subscription(self):
)

def _on_update_frame(self, _):
current_time = time.time()
elapsed = current_time - self._last_time
self._last_time = current_time
self._cesium_omniverse_interface.animate_procedural_prims(elapsed)
time = Usd.TimeCode.Default() # The time at which we compute the bounding box
# current_time = time.time()
# elapsed = current_time - self._last_time
# self._last_time = current_time

stage = omni.usd.get_context().get_stage()
viewport = get_active_viewport()
camera_path = viewport.get_active_camera()
camera = UsdGeom.Camera.Get(stage, camera_path)
xform = UsdGeom.Xformable(camera)
world_transform: Gf.Matrix4d = xform.ComputeLocalToWorldTransform(time)
translation: Gf.Vec3d = world_transform.ExtractTranslation()
up_vector = Gf.Vec3f(world_transform[1][0], world_transform[1][1], world_transform[1][2])

self._cesium_omniverse_interface.animate_procedural_prims(0, translation[0], translation[1], translation[2], up_vector[0], up_vector[1], up_vector[2])
3 changes: 2 additions & 1 deletion include/cesium/omniverse/CesiumOmniverse.h
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,8 @@ class ICesiumOmniverseInterface {
virtual int alterProceduralPrims(
double cameraPositionX, double cameraPositionY, double cameraPositionZ,
float cameraUpX, float cameraUpY, float cameraUpZ) noexcept = 0;
virtual int animateProceduralPrims(float deltaTime) noexcept = 0;
virtual int animateProceduralPrims(float deltaTime, double cameraPositionX, double cameraPositionY, double cameraPositionZ,
float cameraUpX, float cameraUpY, float cameraUpZ) noexcept = 0;
};

} // namespace cesium::omniverse
3 changes: 2 additions & 1 deletion src/core/include/cesium/omniverse/FabricProceduralGeometry.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ namespace cesium::omniverse::FabricProceduralGeometry {
int createPrims();
int alterPrims(double cameraPositionX, double cameraPositionY, double cameraPositionZ,
float cameraUpX, float cameraUpY, float cameraUpZ);
int animatePrims(float deltaTime);
int animatePrims(float deltaTime, double cameraPositionX, double cameraPositionY, double cameraPositionZ,
float cameraUpX, float cameraUpY, float cameraUpZ);

class CudaRunner {
private:
Expand Down
48 changes: 22 additions & 26 deletions src/core/src/FabricProceduralGeometry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -622,14 +622,7 @@ extern "C" __global__ void lookAtMultiquadKernel(quad** quads, double3* lookatPo
int quadIndex = static_cast<int>(i);
// DEBUG
// lookatPosition->x = 4; lookatPosition->y = 4; lookatPosition->z = 0;
// lookatUp->x = 0; lookatUp->y = 1; lookatUp->z = 0;
// printf("(kernel) numQuads: %d\n", numQuads);
float3 targetUpN = normalize(*lookatUp); //TODO: handle this at CPU level
float3 targetUpN = *lookatUp;
float3 quadCenter = quads[0][quadIndex].getCenter();
double3 quadCenterD = make_double3(static_cast<double>(quadCenter.x), static_cast<double>(quadCenter.y) , static_cast<double>(quadCenter.z));
double3 newQuadForwardDouble = subtractDouble3(*lookatPosition, quadCenterD);
Expand All @@ -641,7 +634,6 @@ extern "C" __global__ void lookAtMultiquadKernel(quad** quads, double3* lookatPo
float3 newQuadRightN;
float3 newQuadUpN;
// printf("targetUpN: %f, %f, %f\n", targetUpN.x, targetUpN.y, targetUpN.z);
if (almostEquals(newQuadForwardN, targetUpN)) {
//directly beneath the camera, no op
printf("directly beneath camera, no op. returning\n");
Expand All @@ -663,7 +655,6 @@ extern "C" __global__ void lookAtMultiquadKernel(quad** quads, double3* lookatPo
float3 newQuadLL = addFloat3(rotatedLL, quadCenter);
float3 newQuadLR = addFloat3(rotatedLR, quadCenter);
quads[0][quadIndex].upperLeft = newQuadUL;
quads[0][quadIndex].upperRight = newQuadUR;
quads[0][quadIndex].lowerLeft = newQuadLL;
Expand Down Expand Up @@ -727,7 +718,7 @@ int createPrims() {

// createQuadsViaFabric(80000, 1000.f);
// createMultiquadViaFabric();
createMultiquadMeshViaFabric2(20);
createMultiquadMeshViaFabric2(500);
// createSingleQuad(pxr::GfVec3f(3.f, -3.f, 0), 2);
// createSingleQuad(pxr::GfVec3f(3.f, 3.f, -3.0f), 2);

Expand All @@ -736,17 +727,14 @@ int createPrims() {

int alterPrims(double cameraPositionX, double cameraPositionY, double cameraPositionZ,
float cameraUpX, float cameraUpY, float cameraUpZ) {
printf("camera position is %lf, %lf, %lf\n", cameraPositionX, cameraPositionY, cameraPositionZ);
// printf("camera position is %lf, %lf, %lf\n", cameraPositionX, cameraPositionY, cameraPositionZ);

//DEBUG
// cameraPositionX = 4;
// cameraPositionY = 0;
// cameraPositionZ = 0;

//trick clang
printf("dummy %f\n", cameraUpX);
printf("dummy %f\n", cameraUpY);
printf("dummy %f\n", cameraUpZ);

auto cameraPositionf = glm::fvec3(
static_cast<float>(cameraPositionX),
Expand Down Expand Up @@ -2786,7 +2774,7 @@ void billboardMultiquadWithCustomAttrViaFabric() {
std::cout << "sizeofFloat3 " << sizeof(float3) << std::endl;

auto quadsPtr = reinterpret_cast<quad*>(positions[0]->data());
std::cout << "(host) numQuads: " << numQuads << std::endl;
// std::cout << "(host) numQuads: " << numQuads << std::endl;

for (int quadNum = 0; quadNum < numQuads; quadNum++) {
printf("quad %d lowerLeft: %f, %f, %f\n", quadNum,
Expand Down Expand Up @@ -3325,16 +3313,24 @@ void CudaRunner::init(const char* kernelCodeDEBUG, const char* kernelFunctionNam
_initted = true;
}

int animatePrims(float deltaTime) {
int animatePrims(float deltaTime, double cameraPositionX, double cameraPositionY, double cameraPositionZ,
float cameraUpX, float cameraUpY, float cameraUpZ) {
// std::cout << "animating " << deltaTime << std::endl;
const float speed = 1.5f;
const float radius = 600.f;
alterPrims(0, 0, 0, 0, 0, 0); // TODO: no dummy vars
// const float speed = 1.5f;
// const float radius = 600.f;
alterPrims(cameraPositionX, cameraPositionY, cameraPositionZ, cameraUpX, cameraUpY, cameraUpZ); // TODO: no dummy vars
elapsedTime += deltaTime;
lookatPositionHost.x = sin(elapsedTime * speed) * radius;
// std::cout << "x: " << lookatPositionHost.x << std::endl;
lookatPositionHost.y = sin(elapsedTime * speed * .93f) * radius;
lookatPositionHost.z = sin(elapsedTime * speed * 1.27f) * radius;
lookatPositionHost.x = cameraPositionX;
lookatPositionHost.y = cameraPositionY;
lookatPositionHost.z = cameraPositionZ;
lookatUpHost.x = cameraUpX;
lookatUpHost.y = cameraUpY;
lookatUpHost.z = cameraUpZ;

// lookatPositionHost.x = sin(elapsedTime * speed) * radius;
// // std::cout << "x: " << lookatPositionHost.x << std::endl;
// lookatPositionHost.y = sin(elapsedTime * speed * .93f) * radius;
// lookatPositionHost.z = sin(elapsedTime * speed * 1.27f) * radius;
return 0;
}

Expand Down Expand Up @@ -3780,7 +3776,7 @@ void billboardMultiQuadCuda(glm::fvec3 lookatPosition, glm::fvec3 lookatUp) {
auto numQuadsSpan = stageReaderWriter.getAttributeArray<int>(bucketList, bucketNum, getNumQuadsAttributeFabricToken());
int numQuads = numQuadsSpan[0];
auto quadsPtr = reinterpret_cast<quad*>(positions.data());
std::cout << "(host) numQuads: " << numQuads << std::endl;
// std::cout << "(host) numQuads: " << numQuads << std::endl;

// for (int quadNum = 0; quadNum < numQuads; quadNum++) {
// printf("quad %d lowerLeft: %f, %f, %f\n", quadNum,
Expand All @@ -3793,7 +3789,7 @@ void billboardMultiQuadCuda(glm::fvec3 lookatPosition, glm::fvec3 lookatUp) {
if (elemCount == 0) {
throw std::runtime_error("Fabric did not retrieve any elements");
}
std::cout << elemCount << std::endl;
// std::cout << elemCount << std::endl;
void *args[] = { &quadsPtr, &lookatPositionDevice, &lookatUpDevice, &elemCount}; //NOLINT

cudaRunner.runKernel(args, static_cast<size_t>(elemCount));
Expand Down
7 changes: 5 additions & 2 deletions src/public/CesiumOmniverse.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -204,8 +204,11 @@ class CesiumOmniversePlugin final : public ICesiumOmniverseInterface {
return val;
}

int animateProceduralPrims(float deltaTime) noexcept override {
auto val = cesium::omniverse::FabricProceduralGeometry::animatePrims(deltaTime);
int animateProceduralPrims(float deltaTime, double cameraPositionX, double cameraPositionY, double cameraPositionZ,
float cameraUpX, float cameraUpY, float cameraUpZ) noexcept override {
auto val = cesium::omniverse::FabricProceduralGeometry::animatePrims(
deltaTime, cameraPositionX, cameraPositionY, cameraPositionZ,
cameraUpX, cameraUpY, cameraUpZ);
return val;
}

Expand Down

0 comments on commit 1387697

Please sign in to comment.