RAMSES Documentation  27.0.130
Information for RAMSES users and developers
ramses-example-local-offscreenbuffer/src/main.cpp

Offscreen Buffer Example

// -------------------------------------------------------------------------
// Copyright (C) 2014 BMW Car IT GmbH
// -------------------------------------------------------------------------
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
// -------------------------------------------------------------------------
#include "ramses-client.h"
#include "ramses-utils.h"
#include <unordered_set>
#include <unordered_map>
#include <thread>
#include <cstring>
{
public:
: m_renderer(renderer)
{
}
virtual void sceneStateChanged(ramses::sceneId_t sceneId, ramses::RendererSceneState state) override
{
m_scenes[sceneId].state = state;
}
virtual void sceneFlushed(ramses::sceneId_t sceneId, ramses::sceneVersionTag_t sceneVersion) override
{
m_scenes[sceneId].version = sceneVersion;
}
virtual void offscreenBufferCreated(ramses::displayId_t, ramses::displayBufferId_t offscreenBufferId, ramses::ERendererEventResult result) override
{
{
m_createdOffscreenBuffers.insert(offscreenBufferId);
}
}
{
if (success)
{
m_scenesConsumingOffscreenBuffer[consumerScene].state = ramses::RendererSceneState::Unavailable;
}
}
void waitForOffscreenBufferCreated(const ramses::displayBufferId_t offscreenBufferId)
{
waitForElementInSet(offscreenBufferId, m_createdOffscreenBuffers);
}
void waitForOffscreenBufferLinkedToConsumingScene(const ramses::sceneId_t sceneId)
{
waitUntilOrTimeout([&] {return m_scenesConsumingOffscreenBuffer.count(sceneId) > 0; });
}
void waitForSceneState(ramses::sceneId_t sceneId, ramses::RendererSceneState state)
{
waitUntilOrTimeout([&] { return m_scenes[sceneId].state == state; });
}
bool waitForFlush(ramses::sceneId_t sceneId, ramses::sceneVersionTag_t sceneVersion)
{
return waitUntilOrTimeout([&] { return m_scenes[sceneId].version == sceneVersion; });
}
bool waitUntilOrTimeout(const std::function<bool()>& conditionFunction)
{
const std::chrono::steady_clock::time_point timeoutTS = std::chrono::steady_clock::now() + std::chrono::seconds{ 5 };
while (!conditionFunction() && std::chrono::steady_clock::now() < timeoutTS)
{
std::this_thread::sleep_for(std::chrono::milliseconds{ 5 }); // will give the renderer time to process changes
m_renderer.dispatchEvents(*this);
m_renderer.getSceneControlAPI()->dispatchEvents(*this);
}
return conditionFunction();
}
void windowClosed(ramses::displayId_t /*displayId*/) override
{
m_windowClosed = true;
}
bool isWindowClosed() const
{
return m_windowClosed;
}
private:
struct SceneInfo
{
};
using SceneSet = std::unordered_map<ramses::sceneId_t, SceneInfo>;
using DataConsumerSet = std::unordered_set<ramses::dataConsumerId_t>;
using OffscreenBufferSet = std::unordered_set<ramses::displayBufferId_t>;
template <typename T>
void waitForElementInSet(const T element, const std::unordered_set<T>& set)
{
while (set.find(element) == set.end())
{
m_renderer.dispatchEvents(*this);
m_renderer.getSceneControlAPI()->dispatchEvents(*this);
std::this_thread::sleep_for(std::chrono::milliseconds(10u));
}
}
SceneSet m_scenes;
SceneSet m_scenesAssignedToOffscreenBuffer;
SceneSet m_scenesConsumingOffscreenBuffer;
OffscreenBufferSet m_createdOffscreenBuffers;
DataConsumerSet m_dataConsumers;
bool m_windowClosed = false;
};
uint64_t nowMs()
{
auto now = std::chrono::system_clock::now();
return std::chrono::time_point_cast<std::chrono::milliseconds>(now).time_since_epoch().count();
}
static constexpr uint32_t SampleCount = 4u;
static constexpr uint32_t ObWidth = 200u;
static constexpr uint32_t ObHeight = 200u;
static constexpr uint32_t DisplayWidth = 800u;
static constexpr uint32_t DisplayHeight = 800u;
ramses::MeshNode* createTexturedQuad(ramses::Scene* clientScene, const ramses::Effect* effect, const ramses::ArrayResource* indices, const ramses::ArrayResource* vertexPositions, const ramses::ArrayResource* textureCoords)
{
ramses::Appearance* appearance = clientScene->createAppearance(*effect, "quad appearance");
ramses::GeometryBinding* geometry = clientScene->createGeometryBinding(*effect, "quad geometry");
geometry->setIndices(*indices);
ramses::AttributeInput positionsInput;
effect->findAttributeInput("a_position", positionsInput);
geometry->setInputBuffer(positionsInput, *vertexPositions);
ramses::AttributeInput texCoordsInput;
effect->findAttributeInput("a_texcoord", texCoordsInput);
geometry->setInputBuffer(texCoordsInput, *textureCoords);
ramses::MeshNode* meshNode = clientScene->createMeshNode();
meshNode->setAppearance(*appearance);
meshNode->setGeometryBinding(*geometry);
ramses::UniformInput sampleCountUnif;
for (uint32_t i = 0; i < effect->getUniformInputCount(); ++i)
if (ramses::StatusOK == effect->getUniformInput(i, sampleCountUnif) && strcmp(sampleCountUnif.getName(), "sampleCount") == 0)
{
appearance->setInputValueInt32(sampleCountUnif, SampleCount);
break;
}
return meshNode;
}
{
ramses::RenderPass* clearPass = scene->createRenderPass();
clearPass->setRenderOrder(-100);
//Create camera with dummy values as it is only clear pass
dummyCamera.setFrustum(1.f, 1.f, 1.f, 100.f);
dummyCamera.setViewport(0u, 0u, 16u, 16u);
clearPass->setCamera(dummyCamera);
rtDesc.addRenderBuffer(*renderBuffer);
ramses::RenderTarget& renderTarget = *scene->createRenderTarget(rtDesc);
//Clear RenderBuffer to visible color
clearPass->setRenderTarget(&renderTarget);
clearPass->setClearColor(1.f, 0.f, 0.f, 1.f);
}
ramses::Effect* createEffect(ramses::Scene* scene, const std::string& shaderName, const std::string& effectName)
{
effectDesc.setVertexShaderFromFile(("res/" + shaderName + ".vert").c_str());
effectDesc.setFragmentShaderFromFile(("res/" + shaderName + ".frag").c_str());
return scene->createEffect(effectDesc, ramses::ResourceCacheFlag_DoNotCache, effectName.c_str());
}
ramses::Scene* createConsumerScene(ramses::RamsesClient& client, ramses::sceneId_t sceneId, const char* samplerConsumerName, const char* samplerConsumerNameMS)
{
ramses::Scene* clientScene = client.createScene(sceneId, ramses::SceneConfig(), "local displays example");
ramses::OrthographicCamera* camera = clientScene->createOrthographicCamera("MyCamera");
camera->setTranslation(0.0f, 0.0f, 5.0f);
camera->setFrustum(-2.f, 2.f, -2.f, 2.f, 0.1f, 100.f);
ramses::RenderPass* renderPass = clientScene->createRenderPass("my render pass");
renderPass->setCamera(*camera);
ramses::RenderGroup* renderGroup = clientScene->createRenderGroup();
renderPass->addRenderGroup(*renderGroup);
// prepare quad geometry: vertex position array and index array
const uint16_t indicesArray[] = { 0, 1, 2, 2, 1, 3 };
const ramses::ArrayResource* sharedIndices = clientScene->createArrayResource(ramses::EDataType::UInt16, 6, indicesArray);
const float vertexPositionsArray[] =
{
-1.f, -1.f, 0.f,
1.f, -1.f, 0.f,
-1.f, 1.f, 0.f,
1.f, 1.f, 0.f
};
const ramses::ArrayResource* sharedVertexPositions = clientScene->createArrayResource(ramses::EDataType::Vector3F, 4, vertexPositionsArray);
const float textureCoordsArray[] = { 0.f, 1.f, 1.f, 1.f, 0.f, 0.f, 1.f, 0.f };
const ramses::ArrayResource* sharedTextureCoords = clientScene->createArrayResource(ramses::EDataType::Vector2F, 4, textureCoordsArray);
// create an appearance for grey quad
ramses::Effect* effect = createEffect(clientScene, "ramses-example-offscreenbuffer_texture","quad effect");
ramses::MeshNode* meshNode = createTexturedQuad(clientScene, effect, sharedIndices, sharedVertexPositions, sharedTextureCoords);
ramses::Node* transNode = clientScene->createNode();
transNode->setTranslation(1.1f, 0.f, 0.f);
meshNode->setParent(*transNode);
renderGroup->addMeshNode(*meshNode);
// Create fallback texture to show when sampler not linked to an offscreen buffer
ramses::Texture2D* fallbackTexture = ramses::RamsesUtils::CreateTextureResourceFromPng("res/ramses-example-offscreenbuffer-fallback.png", *clientScene);
ramses::UniformInput textureUnif;
effect->findUniformInput("textureSampler", textureUnif);
meshNode->getAppearance()->setInputTexture(textureUnif, *textureSampler);
// create an appearance for grey quad multi sampled
ramses::Effect* effectMS = createEffect(clientScene, "ramses-example-offscreenbuffer_textureMS","quad effect MS");
ramses::MeshNode* meshNodeMS = createTexturedQuad(clientScene, effectMS, sharedIndices, sharedVertexPositions, sharedTextureCoords);
ramses::Node* transNodeMS = clientScene->createNode();
transNodeMS->setTranslation(-1.1f, 0.f, 0.f);
meshNodeMS->setParent(*transNodeMS);
// mesh needs to be added to a render group that belongs to a render pass with camera in order to be rendered
renderGroup->addMeshNode(*meshNodeMS);
// Multisampled texture cannot use a texture as fallback like the quad above but it has to use a multisampled render buffer as fallback instead in case the offscreen buffer is not linked.
// Buffer gets cleared to solid color so it is visible when sampler is not linked to the offscreen buffer
createClearPass(clientScene, fallbackBuffer);
ramses::TextureSamplerMS* textureSamplerMS = clientScene->createTextureSamplerMS(*fallbackBuffer, samplerConsumerNameMS);
ramses::UniformInput textureUnifMS;
effectMS->findUniformInput("textureSampler", textureUnifMS);
meshNodeMS->getAppearance()->setInputTexture(textureUnifMS, *textureSamplerMS);
return clientScene;
}
ramses::Scene* createProviderScene(ramses::RamsesClient& client, ramses::sceneId_t sceneId, const char* rotationNodeName)
{
ramses::Scene* clientScene = client.createScene(sceneId, ramses::SceneConfig(), "local displays example scene");
camera->setTranslation(0.0f, 0.0f, 5.0f);
camera->setFrustum ( -2.f, 2.f, -2.f, 2.f, 0.1f, 100.f );
camera->setViewport ( 0, 0u, ObWidth, ObHeight );
ramses::RenderPass* renderPass = clientScene->createRenderPass("my render pass");
renderPass->setCamera(*camera);
ramses::RenderGroup* renderGroup = clientScene->createRenderGroup();
renderPass->addRenderGroup(*renderGroup);
ramses::Effect* effect = createEffect(clientScene, "ramses-example-offscreenbuffer","quad effect");
const uint16_t indicesArray[] = { 0, 1, 2, 2, 1, 3 };
const ramses::ArrayResource* indices = clientScene->createArrayResource(ramses::EDataType::UInt16, 6, indicesArray);
const float vertexPositionsArray[] =
{
-1.f, -1.f, 0.f,
1.f, -1.f, 0.f,
-1.f, 1.f, 0.f,
1.f, 1.f, 0.f
};
const ramses::ArrayResource* vertexPositions = clientScene->createArrayResource(ramses::EDataType::Vector3F, 4, vertexPositionsArray);
ramses::Appearance* appearance = clientScene->createAppearance(*effect, "Quad appearance");
ramses::GeometryBinding* geometry = clientScene->createGeometryBinding(*effect, "Quad geometry");
geometry->setIndices(*indices);
ramses::AttributeInput positionsInput;
effect->findAttributeInput("a_position", positionsInput);
geometry->setInputBuffer(positionsInput, *vertexPositions);
effect->findUniformInput("color", colorInput);
appearance->setInputValueVector4f(colorInput, 1.0f, 0.3f, 0.5f, 1.0f);
ramses::MeshNode* meshNode = clientScene->createMeshNode("quad mesh node");
ramses::Node* rotationNode = clientScene->createNode(rotationNodeName);
meshNode->setParent(*rotationNode);
meshNode->setAppearance(*appearance);
meshNode->setGeometryBinding(*geometry);
renderGroup->addMeshNode(*meshNode);
return clientScene;
}
int main(int argc, char* argv[])
{
ramses::RamsesFrameworkConfig config(argc, argv);
config.setRequestedRamsesShellType(ramses::ERamsesShellType_Console); //needed for automated test of examples
ramses::RamsesFramework framework(config);
ramses::RamsesClient& client(*framework.createClient("ramses-local-client-test"));
ramses::RendererConfig rendererConfig(argc, argv);
ramses::RamsesRenderer& renderer(*framework.createRenderer(rendererConfig));
auto& sceneControlAPI = *renderer.getSceneControlAPI();
framework.connect();
renderer.setMaximumFramerate(60.0f);
renderer.startThread();
ramses::Scene* consumerScene = createConsumerScene(client, consumerSceneId, "textureSamplerConsumer", "textureSamplerConsumerMS");
consumerScene->flush();
consumerScene->publish();
ramses::Scene* providerScene = createProviderScene(client, providerSceneId, "rotationNode");
providerScene->flush();
providerScene->publish();
ramses::sceneId_t providerSceneId2{ 3u };
ramses::Scene* providerScene2 = createProviderScene(client, providerSceneId2, "rotationNodeMS");
providerScene2->flush();
providerScene2->publish();
SceneStateEventHandler eventHandler(renderer);
ramses::DisplayConfig displayConfig(argc, argv);
displayConfig.setWindowRectangle(100, 100, DisplayWidth, DisplayHeight);
const ramses::displayId_t display = renderer.createDisplay(displayConfig);
renderer.flush();
// Both consumer and provider scene have to be mapped to same display in order to link them using offscreen buffer
sceneControlAPI.setSceneMapping(consumerSceneId, display);
sceneControlAPI.setSceneState(consumerSceneId, ramses::RendererSceneState::Ready);
sceneControlAPI.flush();
// Ramses renders all scenes mapped to offscreen buffers (except for interruptible offscreen buffers)
// always before rendering scenes mapped to framebuffer.
// If consumer scene is rendered into framebuffer, then there does not have to be any explicit render order set.
// However should the consumer scene be rendered into offscreen buffer as well, it is recommended to set
// explicit render order - provided content before consumer content.
sceneControlAPI.setSceneMapping(providerSceneId, display);
sceneControlAPI.setSceneState(providerSceneId, ramses::RendererSceneState::Ready);
sceneControlAPI.setSceneMapping(providerSceneId2, display);
sceneControlAPI.setSceneState(providerSceneId2, ramses::RendererSceneState::Ready);
sceneControlAPI.flush();
eventHandler.waitForSceneState(consumerSceneId, ramses::RendererSceneState::Ready);
eventHandler.waitForSceneState(providerSceneId, ramses::RendererSceneState::Ready);
eventHandler.waitForSceneState(providerSceneId2, ramses::RendererSceneState::Ready);
const ramses::TextureSamplerMS* textureSamplerConsumerMS = ramses::RamsesUtils::TryConvert<ramses::TextureSamplerMS>(*consumerScene->findObjectByName("textureSamplerConsumerMS"));
const ramses::TextureSampler* textureSamplerConsumer = ramses::RamsesUtils::TryConvert<ramses::TextureSampler>(*consumerScene->findObjectByName("textureSamplerConsumer"));
// IMPORTANT NOTE: For simplicity and readability the example code does not check return values from API calls.
// This should not be the case for real applications.
// Create texture consumer that will use multi sampled offscreen buffer to sample from
const ramses::dataConsumerId_t samplerConsumerIdMS(456u);
consumerScene->createTextureConsumer(*textureSamplerConsumerMS, samplerConsumerIdMS);
// flush with version tag and wait for flush applied to make sure consumer is created
ramses::sceneVersionTag_t versionTagMS{ 42 };
consumerScene->flush(versionTagMS);
eventHandler.waitForFlush(consumerSceneId, versionTagMS);
// Create second texture consumer that will use non-MS offscreen buffer to sample from to visually compare MS vs non-MS
const ramses::dataConsumerId_t samplerConsumerId(457u);
consumerScene->createTextureConsumer(*textureSamplerConsumer, samplerConsumerId);
// flush with version tag and wait for flush applied to make sure consumer is created
ramses::sceneVersionTag_t versionTag{ 43 };
consumerScene->flush(versionTag);
eventHandler.waitForFlush(consumerSceneId, versionTag);
// Create the two offscreen buffers - have to be on the same display where both the scene to be rendered into it is mapped and the scene to consume it is mapped
const ramses::displayBufferId_t offscreenBufferMS = renderer.createOffscreenBuffer(display, ObWidth, ObHeight, SampleCount);
const ramses::displayBufferId_t offscreenBuffer = renderer.createOffscreenBuffer(display, ObWidth, ObHeight);
renderer.flush();
eventHandler.waitForOffscreenBufferCreated(offscreenBufferMS);
eventHandler.waitForOffscreenBufferCreated(offscreenBuffer);
// Assign the provider scenes to the offscreen buffers
// This means the providerscenes are not going to be rendered on the display but to the offscreen buffer they are assigned to instead
sceneControlAPI.setSceneDisplayBufferAssignment(providerSceneId, offscreenBufferMS);
sceneControlAPI.setSceneDisplayBufferAssignment(providerSceneId2, offscreenBuffer);
sceneControlAPI.flush();
// Link the offscreen buffers scene texture samplers so that the provided content will be used as texture
sceneControlAPI.linkOffscreenBuffer(offscreenBufferMS, consumerSceneId, samplerConsumerIdMS);
sceneControlAPI.linkOffscreenBuffer(offscreenBuffer, consumerSceneId, samplerConsumerId);
sceneControlAPI.flush();
eventHandler.waitForOffscreenBufferLinkedToConsumingScene(consumerSceneId);
// Now both the consumer scene and the provider scenes can be rendered at the same time
sceneControlAPI.setSceneState(consumerSceneId, ramses::RendererSceneState::Rendered);
sceneControlAPI.setSceneState(providerSceneId, ramses::RendererSceneState::Rendered);
sceneControlAPI.setSceneState(providerSceneId2, ramses::RendererSceneState::Rendered);
sceneControlAPI.flush();
// Unlink the offscreen buffer scenes every other second and show the fallback texture (sampler2D) and fallback buffer (sampler2DMS)
bool link = false;
// Start at 1 so texture samplers are not unlinked immediately
uint64_t timeStamp = 1u;
float rotationZ = 0.f;
ramses::Node* rotationNode = ramses::RamsesUtils::TryConvert<ramses::Node>(*providerScene->findObjectByName("rotationNode"));
ramses::Node* rotationNodeMS = ramses::RamsesUtils::TryConvert<ramses::Node>(*providerScene2->findObjectByName("rotationNodeMS"));
while (!eventHandler.isWindowClosed())
{
renderer.dispatchEvents(eventHandler);
//Rotate the quads of the provider scenes
rotationNode->setRotation(0.f, 0.f, rotationZ, ramses::ERotationConvention::ZYX);
providerScene->flush();
rotationNodeMS->setRotation(0.f, 0.f, rotationZ, ramses::ERotationConvention::ZYX);
providerScene2->flush();
if (timeStamp % 200 == 0)
{
if (link)
{
sceneControlAPI.linkOffscreenBuffer(offscreenBuffer, consumerSceneId, samplerConsumerId);
sceneControlAPI.linkOffscreenBuffer(offscreenBufferMS, consumerSceneId, samplerConsumerIdMS);
}
else
{
sceneControlAPI.unlinkData(consumerSceneId, samplerConsumerId);
sceneControlAPI.unlinkData(consumerSceneId, samplerConsumerIdMS);
}
sceneControlAPI.flush();
link = !link;
}
++rotationZ;
++timeStamp;
std::this_thread::sleep_for(std::chrono::milliseconds{ 15u });
}
renderer.stopThread();
}
Definition: main.cpp:48
SceneStateEventHandler(ramses::RendererSceneControl &sceneControlApi, ramses::RamsesRenderer &renderer)
Definition: main.cpp:50
The Appearance describes how an object should look like. This includes GLSL uniform values,...
Definition: Appearance.h:34
status_t setInputValueVector4f(const UniformInput &input, float x, float y, float z, float w)
Sets value of the input.
status_t setInputValueInt32(const UniformInput &input, int32_t i)
Sets value of the input.
status_t setInputTexture(const UniformInput &input, const TextureSampler &textureSampler)
Sets texture sampler to the input.
The ArrayResource stores a data array of a given type. The data is immutable. The resource can be use...
Definition: ArrayResource.h:26
The AttributeInput is a description of an attribute effect input.
Definition: AttributeInput.h:22
status_t setViewport(int32_t x, int32_t y, uint32_t width, uint32_t height)
Sets the viewport to be used when rendering with this camera.
status_t setFrustum(float leftPlane, float rightPlane, float bottomPlane, float topPlane, float nearPlane, float farPlane)
Sets camera frustum planes of the Camera.
The DisplayConfig holds a set of parameters to be used to initialize a display.
Definition: DisplayConfig.h:22
An effect description holds all necessary information for an effect to be created.
Definition: EffectDescription.h:21
status_t setVertexShaderFromFile(const char *shaderSourceFileName)
Reads and sets vertex shader source from file.
status_t setUniformSemantic(const char *inputName, EEffectUniformSemantic semanticType)
Sets an uniform semantic. Used for uniforms which are not locally available on the client,...
status_t setFragmentShaderFromFile(const char *shaderSourceFileName)
Reads and sets fragment shader source from file.
const char * getName() const
Returns the name of the effect input.
An effect describes how an object will be rendered to the screen.
Definition: Effect.h:26
status_t findUniformInput(const char *inputName, UniformInput &uniformInput) const
Finds uniform input by input name.
status_t getUniformInput(uint32_t index, UniformInput &uniformInput) const
Gets uniform input at given index.
uint32_t getUniformInputCount() const
Gets number of uniform inputs.
status_t findAttributeInput(const char *inputName, AttributeInput &attributeInput) const
Finds attribute input by input name.
A geometry binding together with an appearance describe how an object will be rendered to the screen.
Definition: GeometryBinding.h:25
status_t setIndices(const ArrayResource &indicesResource)
Assign a data array with data type UInt16 or UInt32 to be used when accessing vertex data.
status_t setInputBuffer(const AttributeInput &attributeInput, const ArrayResource &arrayResource, uint32_t instancingDivisor=0)
Assign a data array resource to a given effect attribute input.
The MeshNode holds all information which is needed to render an object to the screen.
Definition: MeshNode.h:25
status_t setAppearance(Appearance &appearance)
Sets the Appearance of the MeshNode.
const Appearance * getAppearance() const
Returns the appearance.
status_t setGeometryBinding(GeometryBinding &geometry)
Sets the GeometryBinding of the MeshNode.
The Node is the base class of all nodes and provides scene graph functionality which propagates to it...
Definition: Node.h:23
status_t setParent(Node &node)
Sets parent Node for this node.
status_t setTranslation(float x, float y, float z)
Sets the absolute translation the absolute values.
status_t setRotation(float x, float y, float z)
Sets the absolute rotation in all three directions for left-handed rotation using Euler ZYX rotation ...
The OrthographicCamera is a local camera which defines an orthographic view into the scene.
Definition: OrthographicCamera.h:22
The PerspectiveCamera is a local camera which defines a perspective view into the scene.
Definition: PerspectiveCamera.h:23
status_t setFrustum(float fov, float aspectRatio, float nearPlane, float farPlane)
An alternative method (see ramses::Camera::setFrustum) to set the perspective view frustum of the cam...
Entry point of RAMSES client API.
Definition: RamsesClient.h:34
Scene * createScene(sceneId_t sceneId, const SceneConfig &sceneConfig=SceneConfig(), const char *name=nullptr)
Create a new empty Scene.
The RamsesFrameworkConfig holds a set of parameters to be used to initialize ramses.
Definition: RamsesFrameworkConfig.h:23
Class representing ramses framework components that are needed to initialize an instance of ramses cl...
Definition: RamsesFramework.h:35
RamsesRenderer is the main renderer component which provides API to configure and control the way con...
Definition: RamsesRenderer.h:37
status_t dispatchEvents(IRendererEventHandler &rendererEventHandler)
Most RamsesRenderer methods push commands to an internal queue which is submitted when calling Ramses...
RendererSceneControl * getSceneControlAPI()
Get scene control API.
static Texture2D * CreateTextureResourceFromPng(const char *pngFilePath, Scene &scene, const TextureSwizzle &swizzle={}, const char *name=nullptr)
Creates a Texture from the given png file.
RenderBuffer can be used with RenderTarget as buffer for writing or with TextureSampler as buffer for...
Definition: RenderBuffer.h:25
The RenderGroup is a container used to collect renderables which are supposed to be rendered together...
Definition: RenderGroup.h:31
status_t addMeshNode(const MeshNode &mesh, int32_t orderWithinGroup=0)
Add a mesh to this RenderGroup. If a mesh is already contained in this RenderGroup only its render or...
The RenderPass is a container used to collect meshes which are supposed to be rendered together.
Definition: RenderPass.h:31
status_t setCamera(const Camera &camera)
Set the camera to use for rendering the objects of this renderpass.
status_t setClearFlags(uint32_t clearFlags)
Set the clear flags which enable/disable the clearing of the render target assigned to this RenderPas...
status_t setRenderTarget(RenderTarget *renderTarget)
Set the render target for the render pass to render into.
status_t addRenderGroup(const RenderGroup &renderGroup, int32_t orderWithinPass=0)
Add a RenderGroup to this RenderPass for rendering.
status_t setRenderOrder(int32_t renderOrder)
Set the render order for the render pass.
status_t setClearColor(float r, float g, float b, float a)
Set the clear color for the RenderPass (default: [0,0,0,0])
RenderTargetDescription holds all necessary information for a RenderTarget to be created.
Definition: RenderTargetDescription.h:22
status_t addRenderBuffer(const RenderBuffer &renderBuffer)
Adds a RenderBuffer to the RenderTargetDescription.
The RenderTarget can be used as an output for a RenderPass.
Definition: RenderTarget.h:20
The RendererConfig holds a set of parameters to be used to initialize a renderer.
Definition: RendererConfig.h:26
Convenience empty implementation of IRendererEventHandler that can be used to derive from when only s...
Definition: IRendererEventHandler.h:194
Convenience empty implementation of IRendererSceneControlEventHandler that can be used to derive from...
Definition: IRendererSceneControlEventHandler.h:214
virtual void sceneFlushed(sceneId_t sceneId, sceneVersionTag_t sceneVersionTag) override
This method will be called after a flush with version tag (ramses::Scene::flush) has been applied.
Definition: IRendererSceneControlEventHandler.h:310
virtual void offscreenBufferLinked(displayBufferId_t offscreenBufferId, sceneId_t consumerScene, dataConsumerId_t consumerId, bool success) override
This method will be called when the data link between offscreen buffer and scene's data slot is estab...
Definition: IRendererSceneControlEventHandler.h:228
virtual void sceneStateChanged(sceneId_t sceneId, RendererSceneState state) override
This method will be called when state of a scene changes.
Definition: IRendererSceneControlEventHandler.h:219
status_t dispatchEvents(IRendererSceneControlEventHandler &eventHandler)
RendererSceneControl methods push commands to an internal queue which is submitted when calling flush...
The SceneConfig holds a set of parameters to be used when creating a scene.
Definition: SceneConfig.h:22
The Scene holds a scene graph. It is the essential class for distributing content to the ramses syste...
Definition: Scene.h:83
OrthographicCamera * createOrthographicCamera(const char *name=nullptr)
Creates a Orthographic Camera in this Scene.
MeshNode * createMeshNode(const char *name=nullptr)
Creates a scene graph MeshNode. MeshNode is a Node with additional properties and bindings that repre...
Effect * createEffect(const EffectDescription &effectDesc, resourceCacheFlag_t cacheFlag=ResourceCacheFlag_DoNotCache, const char *name=nullptr)
Create a new Effect by parsing a GLSL shader described by an EffectDescription instance....
Node * createNode(const char *name=nullptr)
Creates a scene graph node. The basic purpose of Node is to define topology in scene graph by links t...
TextureSamplerMS * createTextureSamplerMS(const RenderBuffer &renderBuffer, const char *name)
Creates a multisampled texture sampler object.
RenderBuffer * createRenderBuffer(uint32_t width, uint32_t height, ERenderBufferType bufferType, ERenderBufferFormat bufferFormat, ERenderBufferAccessMode accessMode, uint32_t sampleCount=0u, const char *name=nullptr)
Create a RenderBuffer to be used with RenderTarget for rendering into and TextureSampler for sampling...
GeometryBinding * createGeometryBinding(const Effect &effect, const char *name=nullptr)
Creates a new GeometryBinding.
ArrayResource * createArrayResource(EDataType type, uint32_t numElements, const void *arrayData, resourceCacheFlag_t cacheFlag=ResourceCacheFlag_DoNotCache, const char *name=nullptr)
Create a new ArrayResource. It makes a copy of the given data of a certain type as a resource,...
status_t publish(EScenePublicationMode publicationMode=EScenePublicationMode_LocalAndRemote)
Publishes the scene to the ramses system.
RenderPass * createRenderPass(const char *name=nullptr)
Create a render pass in the scene.
Appearance * createAppearance(const Effect &effect, const char *name=nullptr)
Creates a new Appearance.
RenderTarget * createRenderTarget(const RenderTargetDescription &rtDesc, const char *name=nullptr)
Create a render target providing a set of RenderBuffers.
RenderGroup * createRenderGroup(const char *name=nullptr)
Create a RenderGroup instance in the scene.
PerspectiveCamera * createPerspectiveCamera(const char *name=nullptr)
Creates a Perspective Camera in this Scene.
const RamsesObject * findObjectByName(const char *name) const
Get an object from the scene by name.
status_t flush(sceneVersionTag_t sceneVersionTag=InvalidSceneVersionTag)
Commits all changes done to the scene since the last flush or since scene creation....
TextureSampler * createTextureSampler(ETextureAddressMode wrapUMode, ETextureAddressMode wrapVMode, ETextureSamplingMethod minSamplingMethod, ETextureSamplingMethod magSamplingMethod, const Texture2D &texture, uint32_t anisotropyLevel=1, const char *name=nullptr)
Creates a texture sampler object.
status_t createTextureConsumer(const TextureSampler &sampler, dataConsumerId_t dataId)
Annotates a ramses::TextureSampler as a content consumer. Texture provider and texture consumer can b...
Helper class to create strongly typed values out of various types.
Definition: StronglyTypedValue.h:23
Texture represents a 2-D texture resource.
Definition: Texture2D.h:24
The ramses::TextureSamplerMS is used to sample multisampled data when bound to a ramses::Appearance u...
Definition: TextureSamplerMS.h:21
The TextureSampler holds a texture and its sampling parameters.
Definition: TextureSampler.h:29
The UniformInput is a description of an uniform effect input.
Definition: UniformInput.h:22
@ ZYX
rotates around X then Y then Z axis
@ ERenderBufferFormat_RGBA8
Definition: TextureEnums.h:141
@ ETextureSamplingMethod_Linear
Definition: TextureEnums.h:21
@ ETextureAddressMode_Repeat
Definition: TextureEnums.h:33
@ EClearFlags_All
Definition: RamsesFrameworkTypes.h:263
@ EClearFlags_None
Definition: RamsesFrameworkTypes.h:257
@ ModelViewProjectionMatrix
Model-view-projection matrix 4x4.
@ Vector2F
two components of type float per data element
@ UInt16
one component of type uint16_t per data element
@ Vector3F
three components of type float per data element
@ ERamsesShellType_Console
Definition: RamsesFrameworkTypes.h:169
RendererSceneState
Definition: RendererSceneState.h:19
@ Unavailable
Scene is unavailable, no scene control possible.
@ Rendered
Scene is being rendered.
@ Ready
Scene is ready to start rendering (its resources are uploaded).
constexpr const status_t StatusOK
Status returned from RAMSES client API methods that succeeded.
Definition: RamsesFrameworkTypes.h:32
constexpr const resourceCacheFlag_t ResourceCacheFlag_DoNotCache
Requests the render to not cache a resource. This is the default value.
Definition: RamsesFrameworkTypes.h:212
uint64_t sceneVersionTag_t
Scene version tag used to refer to content versions of a scene. A scene version may be updated along ...
Definition: RamsesFrameworkTypes.h:49
ERendererEventResult
Specifies the result of the operation referred to by renderer event.
Definition: Types.h:94
@ ERendererEventResult_FAIL
Event referring to an operation that failed.
Definition: Types.h:97
@ ERenderBufferType_Color
Definition: TextureEnums.h:129
constexpr const sceneVersionTag_t InvalidSceneVersionTag
Scene version tag used to refer to an invalid scene version.
Definition: RamsesFrameworkTypes.h:54
@ ERenderBufferAccessMode_ReadWrite
RenderBuffer with this access can be used both in RenderTarget and TextureSampler.
Definition: TextureEnums.h:171
int main(int argc, char *argv[])
Definition: main.cpp:21
constexpr ramses::sceneId_t consumerSceneId(2u)
constexpr ramses::sceneId_t providerSceneId(1u)
uint64_t nowMs()
Definition: main.cpp:40
ramses::Effect & createEffect(ramses::Scene &scene, const std::string &effectName)
Definition: main.cpp:219
ramses::Scene * createProviderScene(ramses::RamsesClient &client, ramses::sceneId_t sceneId, const char *rotationNodeName)
Definition: main.cpp:276
void createClearPass(ramses::Scene *scene, ramses::RenderBuffer *renderBuffer)
Definition: main.cpp:178
ramses::Scene * createConsumerScene(ramses::RamsesClient &client, ramses::sceneId_t sceneId, const char *samplerConsumerName, const char *samplerConsumerNameMS)
Definition: main.cpp:208
ramses::MeshNode * createTexturedQuad(ramses::Scene *clientScene, const ramses::Effect *effect, const ramses::ArrayResource *indices, const ramses::ArrayResource *vertexPositions, const ramses::ArrayResource *textureCoords)
Definition: main.cpp:150
constexpr uint32_t DisplayWidth
Definition: main.cpp:31
constexpr uint32_t DisplayHeight
Definition: main.cpp:32