cancel
Showing results for 
Search instead for 
Did you mean: 

SDK Discussions

granolaboy
Journeyman III

Issues rendering rpr file exported from Maya

Maya 2022, RPR Plugin 3.3.10

I export a simple scene with a shape and some lights to a rpr file. I can render this file from the command line using RprsRender64.exe, and the results are as expected (the same as rendering in Maya with pro render).

HOWEVER, when I use rprsImport in the SDK to import the scene, I only get the skybox lighting. Closer inspection shows the shapes/materials/lights/camera are all there in the scene, but nothing is showing up. 

I'm suspecting something is either broken with rprsImport, or there's something I'm missing...the fact that RprsRender64.exe renders it fine suggests the exported file is good.

Looking at the tutorial example for importing and rendering a scene, this makes no sense...

Help?

0 Likes
1 Solution
granolaboy
Journeyman III

SOLVED!

Seeing as how rprsRender64.exe can render my rpr scene no problem, I deduced it must be doing something I'm not, so I disassembled the exe and looked for rpr/rprs calls that it was calling that I wasn't. 

Found rprsListImportedShapes, rprShapeSetTransform, rprShapeSetVisibility, rprsGetParentGroupFromShape, rprsGetParentGroupFromGroup, ...  as well as similar functions for lights and the camera.

EUREKA! I need to traverse the scene graph (transform groups) myself and set the transforms for cameras, lights and shapes, as well as set visibility on shapes to true. For some reason, they get imported hidden.

ALL WORKS NOW!

Here is the relevant code you need to fix it up to render. Just call fixLoadedObjects with your imported scene.

RadeonProRender::matrix getNodeTransform(char* node_name)
{
	rpr_char last_node[1024];
	size_t actualLen = 0;
	RadeonProRender::matrix cam_transform;
	while (node_name[0])
	{
		float components[10];
		rprsGetTransformGroup(node_name, components);

		// Note that for rprsSetTransformGroup and rprsGetTransformGroup, matrixComponents is an array of 10 floats in the following order: 
		//       0-2:Translation, 3-6:RotationQuaternion,  7-9:Scale
		RadeonProRender::matrix translation = RadeonProRender::translation(
			RadeonProRender::float3(components[0] * 100.0f, components[1] * 100.0f, components[2] * 100.0f));
		RadeonProRender::matrix rotation;
		RadeonProRender::quaternion(components[3], components[4], components[5], components[6]).to_matrix(rotation);
		RadeonProRender::matrix scale = RadeonProRender::scale(
			RadeonProRender::float3(components[7], components[8], components[9]));

		RadeonProRender::matrix transform = translation * rotation * scale;

		cam_transform = transform * cam_transform;

		strcpy(last_node, node_name);
		CHECK(rprsGetParentGroupFromGroup(last_node, 1024, node_name, &actualLen));
	}

	return std::move(cam_transform.transpose());
}

// ----------------------------------------------------------------------------------------------------

void fixLoadedCameras(rpr_scene scene)
{
	rpr_camera scene_camera = nullptr;
	CHECK(rprSceneGetCamera(scene, &scene_camera));

	int numCameras = 0;
	CHECK(rprsListImportedCameras(0, 0, &numCameras));
	rpr_camera* cameras = new rpr_camera[numCameras];
	CHECK(rprsListImportedCameras(cameras, numCameras * sizeof(rpr_camera), 0));
	for (int i = 0; i < numCameras; i++)
	{
		if (cameras[i] == scene_camera)
		{
			rpr_char node_name[1024];
			size_t actualLen = 0;
			CHECK(rprsGetParentGroupFromCamera(cameras[i], 1024, node_name, &actualLen));

			RadeonProRender::matrix transform = getNodeTransform(node_name);

			CHECK(rprCameraSetTransform(scene_camera, false, &transform.m00));
			break;
		}
	}
	delete[] cameras;
}

// ----------------------------------------------------------------------------------------------------

void fixLoadedLights(rpr_scene scene)
{
	int numLights = 0;
	CHECK(rprsListImportedLights(0, 0, &numLights));
	rpr_light* lights = new rpr_light[numLights];
	CHECK(rprsListImportedLights(lights, numLights * sizeof(rpr_light), 0));
	for (int i = 0; i < numLights; i++)
	{
		rpr_char node_name[1024];
		size_t actualLen = 0;
		CHECK(rprsGetParentGroupFromLight(lights[i], 1024, node_name, &actualLen));

		RadeonProRender::matrix transform = getNodeTransform(node_name);

		CHECK(rprLightSetTransform(lights[i], false, &transform.m00));
	}
	delete[] lights;
}

// ----------------------------------------------------------------------------------------------------

void fixLoadedShapes(rpr_scene scene)
{
	int numShapes = 0;
	CHECK(rprsListImportedShapes(0, 0, &numShapes));
	rpr_shape* shapes = new rpr_shape[numShapes];
	CHECK(rprsListImportedShapes(shapes, numShapes * sizeof(rpr_shape), 0));
	for (int i = 0; i < numShapes; i++)
	{
		rpr_char node_name[1024];
		size_t actualLen = 0;
		CHECK(rprsGetParentGroupFromShape(shapes[i], 1024, node_name, &actualLen));

		RadeonProRender::matrix transform = getNodeTransform(node_name);

		CHECK(rprShapeSetTransform(shapes[i], false, &transform.m00));

		CHECK(rprShapeSetVisibility(shapes[i], true));
	}
	delete[] shapes;
}

// ----------------------------------------------------------------------------------------------------

void fixLoadedObjects(rpr_scene scene)
{
	fixLoadedCameras(scene);
	fixLoadedLights(scene);
	fixLoadedShapes(scene);
}

 

View solution in original post

0 Likes
1 Reply
granolaboy
Journeyman III

SOLVED!

Seeing as how rprsRender64.exe can render my rpr scene no problem, I deduced it must be doing something I'm not, so I disassembled the exe and looked for rpr/rprs calls that it was calling that I wasn't. 

Found rprsListImportedShapes, rprShapeSetTransform, rprShapeSetVisibility, rprsGetParentGroupFromShape, rprsGetParentGroupFromGroup, ...  as well as similar functions for lights and the camera.

EUREKA! I need to traverse the scene graph (transform groups) myself and set the transforms for cameras, lights and shapes, as well as set visibility on shapes to true. For some reason, they get imported hidden.

ALL WORKS NOW!

Here is the relevant code you need to fix it up to render. Just call fixLoadedObjects with your imported scene.

RadeonProRender::matrix getNodeTransform(char* node_name)
{
	rpr_char last_node[1024];
	size_t actualLen = 0;
	RadeonProRender::matrix cam_transform;
	while (node_name[0])
	{
		float components[10];
		rprsGetTransformGroup(node_name, components);

		// Note that for rprsSetTransformGroup and rprsGetTransformGroup, matrixComponents is an array of 10 floats in the following order: 
		//       0-2:Translation, 3-6:RotationQuaternion,  7-9:Scale
		RadeonProRender::matrix translation = RadeonProRender::translation(
			RadeonProRender::float3(components[0] * 100.0f, components[1] * 100.0f, components[2] * 100.0f));
		RadeonProRender::matrix rotation;
		RadeonProRender::quaternion(components[3], components[4], components[5], components[6]).to_matrix(rotation);
		RadeonProRender::matrix scale = RadeonProRender::scale(
			RadeonProRender::float3(components[7], components[8], components[9]));

		RadeonProRender::matrix transform = translation * rotation * scale;

		cam_transform = transform * cam_transform;

		strcpy(last_node, node_name);
		CHECK(rprsGetParentGroupFromGroup(last_node, 1024, node_name, &actualLen));
	}

	return std::move(cam_transform.transpose());
}

// ----------------------------------------------------------------------------------------------------

void fixLoadedCameras(rpr_scene scene)
{
	rpr_camera scene_camera = nullptr;
	CHECK(rprSceneGetCamera(scene, &scene_camera));

	int numCameras = 0;
	CHECK(rprsListImportedCameras(0, 0, &numCameras));
	rpr_camera* cameras = new rpr_camera[numCameras];
	CHECK(rprsListImportedCameras(cameras, numCameras * sizeof(rpr_camera), 0));
	for (int i = 0; i < numCameras; i++)
	{
		if (cameras[i] == scene_camera)
		{
			rpr_char node_name[1024];
			size_t actualLen = 0;
			CHECK(rprsGetParentGroupFromCamera(cameras[i], 1024, node_name, &actualLen));

			RadeonProRender::matrix transform = getNodeTransform(node_name);

			CHECK(rprCameraSetTransform(scene_camera, false, &transform.m00));
			break;
		}
	}
	delete[] cameras;
}

// ----------------------------------------------------------------------------------------------------

void fixLoadedLights(rpr_scene scene)
{
	int numLights = 0;
	CHECK(rprsListImportedLights(0, 0, &numLights));
	rpr_light* lights = new rpr_light[numLights];
	CHECK(rprsListImportedLights(lights, numLights * sizeof(rpr_light), 0));
	for (int i = 0; i < numLights; i++)
	{
		rpr_char node_name[1024];
		size_t actualLen = 0;
		CHECK(rprsGetParentGroupFromLight(lights[i], 1024, node_name, &actualLen));

		RadeonProRender::matrix transform = getNodeTransform(node_name);

		CHECK(rprLightSetTransform(lights[i], false, &transform.m00));
	}
	delete[] lights;
}

// ----------------------------------------------------------------------------------------------------

void fixLoadedShapes(rpr_scene scene)
{
	int numShapes = 0;
	CHECK(rprsListImportedShapes(0, 0, &numShapes));
	rpr_shape* shapes = new rpr_shape[numShapes];
	CHECK(rprsListImportedShapes(shapes, numShapes * sizeof(rpr_shape), 0));
	for (int i = 0; i < numShapes; i++)
	{
		rpr_char node_name[1024];
		size_t actualLen = 0;
		CHECK(rprsGetParentGroupFromShape(shapes[i], 1024, node_name, &actualLen));

		RadeonProRender::matrix transform = getNodeTransform(node_name);

		CHECK(rprShapeSetTransform(shapes[i], false, &transform.m00));

		CHECK(rprShapeSetVisibility(shapes[i], true));
	}
	delete[] shapes;
}

// ----------------------------------------------------------------------------------------------------

void fixLoadedObjects(rpr_scene scene)
{
	fixLoadedCameras(scene);
	fixLoadedLights(scene);
	fixLoadedShapes(scene);
}

 

0 Likes