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

Geometry Instancing Example

// -------------------------------------------------------------------------
// Copyright (C) 2017 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 <cmath>
#include <thread>
int main(int argc, char* argv[])
{
// register at RAMSES daemon
ramses::RamsesFramework framework(argc, argv);
ramses::RamsesClient& ramses(*framework.createClient("ramses-example-geometry-instancing"));
framework.connect();
// create a scene for distributing content
ramses::Scene* scene = ramses.createScene(ramses::sceneId_t(123u), ramses::SceneConfig(), "geometry instancing scene");
// every scene needs a render pass with camera
auto* camera = scene->createPerspectiveCamera("my camera");
camera->setViewport(0, 0, 1280u, 480u);
camera->setFrustum(19.f, 1280.f / 480.f, 0.1f, 1500.f);
camera->setTranslation(0.0f, 0.0f, 5.0f);
ramses::RenderPass* renderPass = scene->createRenderPass("my render pass");
renderPass->setCamera(*camera);
ramses::RenderGroup* renderGroup = scene->createRenderGroup();
renderPass->addRenderGroup(*renderGroup);
// 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.
// prepare triangle geometry: vertex position array and index array
float vertexPositionsArray[] = { -1.f, 0.f, -1.f, 1.f, 0.f, -1.f, 0.f, 1.f, -1.f };
ramses::ArrayResource* vertexPositions = scene->createArrayResource(ramses::EDataType::Vector3F, 3, vertexPositionsArray);
uint16_t indicesArray[] = { 0, 1, 2 };
// ------- Instancing with uniforms --------
// create an appearance for red triangles
ramses::EffectDescription effectDescUniform;
effectDescUniform.setVertexShaderFromFile("res/ramses-example-geometry-instancing-uniform.vert");
effectDescUniform.setFragmentShaderFromFile("res/ramses-example-geometry-instancing-uniform.frag");
const ramses::Effect* uniformEffect = scene->createEffect(effectDescUniform, ramses::ResourceCacheFlag_DoNotCache, "uniform-instancing");
ramses::Appearance* uniformAppearance = scene->createAppearance(*uniformEffect, "triangle_uniforms");
// get input data of appearance and bind required data
ramses::UniformInput uniformInstanceTranslationInput;
uniformEffect->findUniformInput("translations", uniformInstanceTranslationInput);
float translations[30];
ramses::UniformInput uniformInstanceColorInput;
uniformEffect->findUniformInput("colors", uniformInstanceColorInput);
float colors[40];
// set vertex positions directly in geometry
ramses::GeometryBinding* uniformGeometry = scene->createGeometryBinding(*uniformEffect, "triangle geometry uniforms");
uniformGeometry->setIndices(*indices);
ramses::AttributeInput uniformPositionInput;
uniformEffect->findAttributeInput("a_position", uniformPositionInput);
uniformGeometry->setInputBuffer(uniformPositionInput, *vertexPositions);
// create a mesh node to define the triangle with chosen appearance
ramses::MeshNode* uniformMeshNode = scene->createMeshNode("uniform-instanced triangle");
uniformMeshNode->setAppearance(*uniformAppearance);
uniformMeshNode->setGeometryBinding(*uniformGeometry);
uniformMeshNode->setInstanceCount(10u);
// mesh needs to be added to a render group that belongs to a render pass with camera in order to be rendered
renderGroup->addMeshNode(*uniformMeshNode);
// ------- Instancing with vertex arrays --------
// create an appearance for red triangles
ramses::EffectDescription effectDescVertex;
effectDescVertex.setVertexShaderFromFile("res/ramses-example-geometry-instancing-vertex.vert");
effectDescVertex.setFragmentShaderFromFile("res/ramses-example-geometry-instancing-vertex.frag");
const ramses::Effect* vertexEffect = scene->createEffect(effectDescVertex, ramses::ResourceCacheFlag_DoNotCache, "vertex-instancing");
ramses::Appearance* vertexAppearance = scene->createAppearance(*vertexEffect, "triangle_uniforms");
// set vertex positions directly in geometry
ramses::GeometryBinding* vertexGeometry = scene->createGeometryBinding(*vertexEffect, "triangle geometry uniforms");
vertexGeometry->setIndices(*indices);
ramses::AttributeInput vertexPositionInput;
vertexEffect->findAttributeInput("a_position", vertexPositionInput);
vertexGeometry->setInputBuffer(vertexPositionInput, *vertexPositions);
// prepare triangle geometry: vertex position array and index array
float vertexInstanceTranslationArray[] = {
-4.5f, .75f, -6.0f,
4.5f, .75f, -6.0f,
4.5f, -1.75f, -6.0f,
-4.5f, -1.75f, -6.0f
};
float vertexInstanceColorArray[] = {
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f
};
const ramses::ArrayResource* vertexTranslations = scene->createArrayResource(ramses::EDataType::Vector3F, 4, vertexInstanceTranslationArray);
const ramses::ArrayResource* vertexColors = scene->createArrayResource(ramses::EDataType::Vector4F, 4, vertexInstanceColorArray);
ramses::AttributeInput vertexTranslationInput;
vertexEffect->findAttributeInput("translation", vertexTranslationInput);
vertexGeometry->setInputBuffer(vertexTranslationInput, *vertexTranslations, 1u);
ramses::AttributeInput vertexColorInput;
vertexEffect->findAttributeInput("color", vertexColorInput);
vertexGeometry->setInputBuffer(vertexColorInput, *vertexColors, 1u);
// create a mesh node to define the triangle with chosen appearance
ramses::MeshNode* vertexMeshNode = scene->createMeshNode("vertex-instanced triangle");
vertexMeshNode->setAppearance(*vertexAppearance);
vertexMeshNode->setGeometryBinding(*vertexGeometry);
vertexMeshNode->setInstanceCount(4u);
// mesh needs to be added to a render group that belongs to a render pass with camera in order to be rendered
renderGroup->addMeshNode(*vertexMeshNode);
// distribute the scene to RAMSES
scene->publish();
// application logic
uint32_t t = 0;
while (t < 1000000)
{
// update translations of triangle instances
for (uint32_t i = 0; i < 10; i++)
{
translations[i * 3] = -3.0f + i * 0.7f;
translations[i * 3 + 1] = -0.5f + static_cast<float>(std::sin(i+0.05f*t));
translations[i * 3 + 2] = -5.0f;
}
uniformAppearance->setInputValueVector3f(uniformInstanceTranslationInput, 10, translations);
// update color of triangle instances
for (uint32_t i = 0; i < 10; i++)
{
colors[i * 4] = 1.0f;
colors[i * 4 + 1] = 0.75f * static_cast<float>(std::sin(i+0.05f*t));
colors[i * 4 + 2] = 0.2f;
colors[i * 4 + 3] = 1.0f;
}
uniformAppearance->setInputValueVector4f(uniformInstanceColorInput, 10, colors);
scene->flush();
t++;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
// shutdown: stop distribution, free resources, unregister
scene->unpublish();
scene->destroy(*vertexPositions);
scene->destroy(*indices);
ramses.destroy(*scene);
framework.disconnect();
return 0;
}
The Appearance describes how an object should look like. This includes GLSL uniform values,...
Definition: Appearance.h:34
status_t setInputValueVector3f(const UniformInput &input, float x, float y, float z)
Sets value of the input.
status_t setInputValueVector4f(const UniformInput &input, float x, float y, float z, float w)
Sets value of 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.
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.
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 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.
status_t setInstanceCount(uint32_t instanceCount)
Sets the number of instances that will be drawn for this mesh by the renderer.
status_t setGeometryBinding(GeometryBinding &geometry)
Sets the GeometryBinding of the MeshNode.
Entry point of RAMSES client API.
Definition: RamsesClient.h:34
Class representing ramses framework components that are needed to initialize an instance of ramses cl...
Definition: RamsesFramework.h:35
status_t connect()
Tries to establish a connection to the RAMSES system.
RamsesClient * createClient(const char *applicationName)
Create a new RamsesClient linked to this framework. Creation of multiple clients is supported....
status_t disconnect()
Disconnects the RamsesClient from the system.
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 addRenderGroup(const RenderGroup &renderGroup, int32_t orderWithinPass=0)
Add a RenderGroup to this RenderPass for rendering.
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
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....
status_t unpublish()
Unpublish the scene from the ramses system.
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.
status_t destroy(SceneObject &object)
Destroys a previously created object using this scene The object must be owned by this scene in order...
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.
status_t flush(sceneVersionTag_t sceneVersionTag=InvalidSceneVersionTag)
Commits all changes done to the scene since the last flush or since scene creation....
Helper class to create strongly typed values out of various types.
Definition: StronglyTypedValue.h:23
The UniformInput is a description of an uniform effect input.
Definition: UniformInput.h:22
The RAMSES namespace contains all client side objects and functions used to implement RAMSES applicat...
Definition: AnimatedProperty.h:15
@ EClearFlags_None
Definition: RamsesFrameworkTypes.h:257
@ ModelViewProjectionMatrix
Model-view-projection matrix 4x4.
@ Vector4F
four 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
constexpr const resourceCacheFlag_t ResourceCacheFlag_DoNotCache
Requests the render to not cache a resource. This is the default value.
Definition: RamsesFrameworkTypes.h:212
int main(int argc, char *argv[])
Definition: main.cpp:21