Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
4040b5b
[core] Fix IndexedGeometry.
dlyr Jul 20, 2022
346c055
[engine] Prepare API of GeometryDisplayable
nmellado Jul 19, 2021
f583a2f
[engine] add GeometryDisplayableComponent
dlyr Mar 31, 2022
4feef21
[tests] Use GeometryDisplayableComponent in HelloRadium (nothing draw…
dlyr Mar 31, 2022
97b5bb8
[core] Switch struct -> class for AbstractGeometry.
dlyr Jul 20, 2022
69bf6eb
[core] Use macro for clone implementation.
dlyr Jul 20, 2022
734067d
[engine] double wireframe (ad hoc for quad mesh).
dlyr Jul 20, 2022
cfc6a3c
[core][engine] Use demangleType.
dlyr Sep 15, 2022
5a7df39
[engine] user BijectiveAssociation for translation table.
dlyr Sep 18, 2022
54466bd
[core][engine] Move triangulate to core.
dlyr Sep 18, 2022
23786dd
[engine] Add empty ctor.
dlyr Sep 18, 2022
c738492
[engine] use geometrydisplayable for components.
dlyr Sep 18, 2022
4500efa
[engine] fix geometry component (after rebase)
dlyr Apr 27, 2025
8dcaf46
[engine] rename correspondance -> matching
dlyr Sep 18, 2022
e809e1e
[engine] GeometrySystem use GeometryDisplayable comp.
dlyr Sep 18, 2022
484644d
[examples] Start using GeometryDisplayable in draw prim.
dlyr Sep 18, 2022
7d2bf5f
[engine] GeometryComponent clean include.
dlyr Sep 19, 2022
acd319d
[engine] Renderer remove debug print.
dlyr Sep 19, 2022
909c978
[engine] handle line index layer picking render mode.
dlyr Sep 19, 2022
d3a6b2f
[core] MeshPrimitives remove debug print.
dlyr Sep 19, 2022
06a17a1
[core] IndexedGeometry remove debug print.
dlyr Sep 19, 2022
6a11f2f
[examples] HelloRadium remove debug print.
dlyr Sep 19, 2022
d7e8f3b
[engine] Remove unused LineMeshComponent.
dlyr Oct 27, 2022
76bb1ce
[examples] add fixed light in skinning example.
dlyr Dec 8, 2022
8e04dc7
[core] use inverse transpose for normal lbs.
dlyr Dec 8, 2022
a52dcea
[core] comment typo in trianglemesh
dlyr Dec 8, 2022
9ddf5c2
[core][engine] use AttribArrayGeometry as skinning data.
dlyr Dec 8, 2022
a09242e
[core] register rw on AttribArrayGeometry for SurfaceMeshComponent.
dlyr Dec 8, 2022
b9f1391
[core] Temporary remove non working file from base code.
dlyr May 16, 2023
4ad9f52
[core] Remove dead code.
dlyr May 3, 2025
c9115cc
[core] Add missing include for std_any.
dlyr May 3, 2025
76659a0
[engine] Add setter for active layer.
dlyr May 3, 2025
2ee2f11
[engine] Use GeometryDisplayable for DrawPrimitive::Triangle.
dlyr May 3, 2025
10bafff
[engine] Remove LineMesh (use GeometryDisplayable instead).
dlyr May 3, 2025
89916e1
[examples] Use GeometryDisplayable for Poly example.
dlyr May 3, 2025
e228a81
[engine] Sphere use GeometryDisplayable.
dlyr May 4, 2025
8078b3f
[engine] Fix set render mode when set active key (to update picking r…
dlyr May 4, 2025
b454649
[core][engine] Move grid to mesh primitives, small refactor also.
dlyr May 5, 2025
d9b8d49
[core] *Mesh are now using aliases to IndexedGeometry<>.
dlyr May 5, 2025
0dfb85e
[engine] Fix priority to rm triangles fill draw primitives.
dlyr May 5, 2025
fd9da96
[engine] Add createMeshFromGeometry2 for geometry displayable.
dlyr May 5, 2025
21184b3
[examples] create GeometryDisplayable instead of AttribArrayDisplayab…
dlyr May 5, 2025
7947044
[engine][core][gui] Use QuadMesh and GeometryDisplayable for Torus an…
dlyr May 6, 2025
1034d2c
[core][engine] Add FanOrStrip, Disk use GeometryDisplayable.
dlyr May 6, 2025
094c45e
[core] Factorize index layer code using macro.
dlyr May 6, 2025
b10ead6
[core] Add offset to append for GeometryIndexLayer.
dlyr May 6, 2025
e7e2bb2
[engine] Add triangle layer to disc (not only fan) for wireframe.
dlyr May 6, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Shaders/Lines/Wireframe.geom.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ in vec4 vPosition[2];
out vec4 gColor;
out float pixelWidthDiv2;
uniform vec2 viewport;
uniform float pixelWidth;
vec4 vColor[2];

void main() {
Expand All @@ -34,7 +35,6 @@ void main() {
vec4 scss1 = css1 * css0.w;

vec3 dir = ( scss1 - scss0 ).xyz;
float pixelWidth = 1.8;
const float border = 4.;
vec3 slope = normalize( vec3( -dir.y, dir.x, 0 ) );
vec4 n = vec4( vec3( pixelWidth + border ) / vp * slope, 0 );
Expand Down
45 changes: 21 additions & 24 deletions examples/DrawPrimitives/AllPrimitivesComponent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,18 +133,18 @@ void AllPrimitivesComponent::initialize() {

//// CUBES ////
if ( ENABLE_CUBES ) {
std::shared_ptr<Mesh> cube1( new Mesh( "Cube" ) );
std::shared_ptr<GeometryDisplayable> cube1( new GeometryDisplayable( "Cube" ) );
auto coord = cellSize / 16_ra;
cube1->loadGeometry(
Geometry::makeSharpBox( Vector3 { coord, coord, coord }, Color::Green() ) );
Geometry::makeSharpBox2( Vector3 { coord, coord, coord }, Color::Green() ) );
auto renderObject1 = RenderObject::createRenderObject(
"Cube1", this, RenderObjectType::Geometry, cube1, {} );
renderObject1->setLocalTransform( Transform { Translation( cellCorner ) } );
renderObject1->setMaterial( blinnPhongMaterial );
addRenderObject( renderObject1 );

std::shared_ptr<Mesh> texCube( new Mesh( "Cube" ) );
texCube->loadGeometry( Geometry::makeSharpBox(
std::shared_ptr<GeometryDisplayable> texCube( new GeometryDisplayable( "Cube" ) );
texCube->loadGeometry( Geometry::makeSharpBox2(
Vector3 { 1.2_ra * coord, 1.2_ra * coord, 1.2_ra * coord }, Color::White(), true ) );
auto renderObjectTexCube = RenderObject::createRenderObject(
"TexCube", this, RenderObjectType::Geometry, texCube, {} );
Expand All @@ -155,14 +155,15 @@ void AllPrimitivesComponent::initialize() {
addRenderObject( renderObjectTexCube );

// another cube
std::shared_ptr<Mesh> cube2( new Mesh( "Cube" ) );
std::shared_ptr<GeometryDisplayable> cube2( new GeometryDisplayable( "Cube" ) );
coord = cellSize / 4_ra;
cube2->loadGeometry( Geometry::makeSharpBox( Vector3 { coord, coord, coord } ) );
cube2->loadGeometry( Geometry::makeSharpBox2( Vector3 { coord, coord, coord } ) );

const std::string myColourName { "colour" };
cube2->getCoreGeometry().addAttrib(
myColourName, Vector4Array { cube2->getNumVertices(), Color::Red() } );

cube2->setAttribNameCorrespondance(
cube2->setAttribNameMatching(
myColourName, Ra::Core::Geometry::getAttribName( Ra::Core::Geometry::VERTEX_COLOR ) );
auto renderObject2 = RenderObject::createRenderObject(
"CubeRO_2", this, RenderObjectType::Geometry, cube2, {} );
Expand Down Expand Up @@ -649,9 +650,8 @@ void AllPrimitivesComponent::initialize() {
auto hepta = VectorNui( 7 );
hepta << 3, 2, 4, 5, 6, 7, 8;
polyMesh.setIndices( { quad, hepta } );
auto poly1 = make_shared<GeometryDisplayable>( "Poly", std::move( polyMesh ) );

std::shared_ptr<Data::PolyMesh> poly1(
new Data::PolyMesh( "Poly", std::move( polyMesh ) ) );
poly1->getCoreGeometry().addAttrib(
Ra::Core::Geometry::getAttribName( Ra::Core::Geometry::VERTEX_COLOR ),
Vector4Array { poly1->getNumVertices(), colorBoost * Color { 1_ra, 0.6_ra, 0.1_ra } } );
Expand All @@ -664,11 +664,12 @@ void AllPrimitivesComponent::initialize() {

addRenderObject( renderObject1 );

Ra::Core::Geometry::TopologicalMesh topo { poly1->getCoreGeometry() };
Ra::Core::Geometry::TopologicalMesh topo { poly1->getCoreGeometry(),
poly1->active_layer_key() };
topo.triangulate();
topo.checkIntegrity();
auto triangulated = topo.toTriangleMesh();
std::shared_ptr<Mesh> poly2( new Mesh( "Poly", std::move( triangulated ) ) );
auto poly2 = make_shared<GeometryDisplayable>( "Poly", std::move( triangulated ) );
poly2->getCoreGeometry().addAttrib(
Ra::Core::Geometry::getAttribName( Ra::Core::Geometry::VERTEX_COLOR ),
Vector4Array { poly2->getNumVertices(), colorBoost * Color { 0_ra, 0.6_ra, 0.1_ra } } );
Expand Down Expand Up @@ -698,19 +699,16 @@ void AllPrimitivesComponent::initialize() {
auto geomData = data->getGeometryData();

for ( const auto& gd : geomData ) {
std::shared_ptr<AttribArrayDisplayable> mesh { nullptr };
std::shared_ptr<GeometryDisplayable> mesh { nullptr };
switch ( gd->getType() ) {
case Ra::Core::Asset::GeometryData::TRI_MESH:
mesh = std::shared_ptr<Mesh> {
createMeshFromGeometryData<Geometry::TriangleMesh>( "logo", gd ) };
mesh = createMeshFromGeometryData2<Geometry::TriangleMesh>( "logo", gd );
break;
case Ra::Core::Asset::GeometryData::QUAD_MESH:
mesh = std::shared_ptr<Data::QuadMesh> {
createMeshFromGeometryData<Geometry::QuadMesh>( "logo", gd ) };
mesh = createMeshFromGeometryData2<Geometry::QuadMesh>( "logo", gd );
break;
case Ra::Core::Asset::GeometryData::POLY_MESH:
mesh = std::shared_ptr<Data::PolyMesh> {
createMeshFromGeometryData<Geometry::PolyMesh>( "logo", gd ) };
mesh = createMeshFromGeometryData2<Geometry::PolyMesh>( "logo", gd );
break;
default:
break;
Expand Down Expand Up @@ -868,7 +866,7 @@ void AllPrimitivesComponent::initialize() {
auto addMesh = [this, colorBoost, plainMaterial]( Vector3 pos, TopologicalMesh topo1 ) {
topo1.checkIntegrity();
auto mesh1 = topo1.toTriangleMesh();
std::shared_ptr<Mesh> poly( new Mesh( "TEST", std::move( mesh1 ) ) );
auto poly = make_shared<GeometryDisplayable>( "topo mesh", std::move( mesh1 ) );

auto renderObject2 =
RenderObject::createRenderObject( "TEST", this, RenderObjectType::Geometry, poly, {} );
Expand Down Expand Up @@ -1058,8 +1056,8 @@ void AllPrimitivesComponent::initialize() {
{
using Ra::Engine::Data::Mesh;
{
auto torusGeom = makeParametricTorus<32, 16>( .04_ra, .01_ra, Color::White() );
auto torusMesh = make_shared<Mesh>( "Torus", std::move( torusGeom ) );
auto geom = makeParametricTorus<16, 8>( .04_ra, .01_ra, Color::White() );
auto torusMesh = make_shared<GeometryDisplayable>( "Torus", std::move( geom ) );
auto torus = RenderObject::createRenderObject(
"test_torus", this, RenderObjectType::Geometry, torusMesh, {} );
torus->setMaterial( blinnPhongMaterial );
Expand All @@ -1070,10 +1068,9 @@ void AllPrimitivesComponent::initialize() {
}

{
auto texTorusGeom =
makeParametricTorus<64, 16>( .1_ra, .05_ra, Color::White(), true );
auto geom = makeParametricTorus<32, 12>( .1_ra, .05_ra, Color::White(), true );
auto texTorusMesh =
make_shared<Mesh>( "Textured Torus", std::move( texTorusGeom ) );
make_shared<GeometryDisplayable>( "Textured Torus", std::move( geom ) );
auto texTorus = RenderObject::createRenderObject(
"test_tex_torus", this, RenderObjectType::Geometry, texTorusMesh, {} );
texTorus->setMaterial( blinnPhongTexturedMaterial );
Expand Down
6 changes: 3 additions & 3 deletions examples/HelloRadium/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ int main( int argc, char* argv[] ) {
//! [Verifying the OpenGL version available to the engine]

//! [Creating the cube]
auto cube = Ra::Core::Geometry::makeSharpBox( { 0.1f, 0.1f, 0.1f } );
auto cube { std::move( Ra::Core::Geometry::makeSharpBox2( { 0.1f, 0.1f, 0.1f } ) ) };
//! [Creating the cube]

//! [Colorize the Cube]
Expand All @@ -41,8 +41,8 @@ int main( int argc, char* argv[] ) {
//! [Create the engine entity for the cube]

//! [Create a geometry component with the cube]
auto c =
new Ra::Engine::Scene::TriangleMeshComponent( "Cube Mesh", e, std::move( cube ), nullptr );
auto c = new Ra::Engine::Scene::GeometryDisplayableComponent(
"Cube Mesh", e, std::move( cube ), nullptr );
//! [Create a geometry component with the cube]

//! [Register the entity/component association to the geometry system ]
Expand Down
10 changes: 10 additions & 0 deletions examples/SimpleSkinning/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,15 @@
#include <Engine/FrameInfo.hpp>
#include <Engine/RadiumEngine.hpp>
#include <Engine/Scene/CameraManager.hpp>
#include <Engine/Scene/DefaultLightManager.hpp>
#include <Engine/Scene/DirLight.hpp>
#include <Engine/Scene/EntityManager.hpp>
#include <Engine/Scene/GeometryComponent.hpp>
#include <Engine/Scene/SkeletonBasedAnimationSystem.hpp>
#include <Engine/Scene/SkeletonComponent.hpp>
#include <Engine/Scene/SkinningComponent.hpp>
#include <Engine/Scene/System.hpp>
#include <Engine/Scene/SystemDisplay.hpp>
#include <Gui/BaseApplication.hpp>
#include <Gui/RadiumWindow/SimpleWindowFactory.hpp>
#include <Gui/Viewer/Viewer.hpp>
Expand Down Expand Up @@ -71,6 +74,13 @@ class SkinningSystem : public Scene::System
};

void setupScene( Ra::Engine::RadiumEngine* engine ) {

DefaultLightManager* lightManager =
static_cast<DefaultLightManager*>( engine->getSystem( "DefaultLightManager" ) );
auto light = new Engine::Scene::DirectionalLight(
Ra::Engine::Scene::SystemEntity::getInstance(), "light" );
lightManager->addLight( light );

auto animationSystem = new SkinningSystem;
engine->registerSystem( "Simple animation system", animationSystem );

Expand Down
4 changes: 3 additions & 1 deletion src/Core/Animation/LinearBlendSkinning.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include "Core/Types.hpp"
#include <Core/Animation/LinearBlendSkinning.hpp>

#include <Core/Animation/SkinningData.hpp>
Expand Down Expand Up @@ -33,9 +34,10 @@ void linearBlendSkinning( const SkinningRefData& refData,
const Scalar w = it.value();
// prepare the pose w.r.t. the bind matrix and the mesh transform
const Transform M = refData.m_meshTransformInverse * pose[j] * bindMatrix[j];
const Matrix3 N = M.matrix().inverse().transpose().block<3, 3>( 0, 0 );
// apply LBS
frameData.m_currentPosition[i] += w * ( M * vertices[i] );
frameData.m_currentNormal[i] += w * ( M.linear() * normals[i] );
frameData.m_currentNormal[i] += w * ( N * normals[i] );
frameData.m_currentTangent[i] += w * ( M.linear() * tangents[i] );
frameData.m_currentBitangent[i] += w * ( M.linear() * bitangents[i] );
}
Expand Down
2 changes: 1 addition & 1 deletion src/Core/Animation/SkinningData.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ namespace Animation {
/// \brief Skinning data that get set at startup including the "reference state".
struct SkinningRefData {
/// The mesh in reference position.
Geometry::TriangleMesh m_referenceMesh;
Geometry::AttribArrayGeometry m_referenceMesh;

/// The inverse of the mesh's transform.
Transform m_meshTransformInverse;
Expand Down
5 changes: 3 additions & 2 deletions src/Core/Geometry/AbstractGeometry.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@ namespace Geometry {
/// \warning: Part of the current proposal for a modular implementation of
/// displayable objects.
///
/// \note We use a struct because all members are public anyway
struct RA_CORE_API AbstractGeometry {
class RA_CORE_API AbstractGeometry
{
public:
/*
* Note: Explicitly defaulted virtual destructor, copy/move constructors,
* copy/move assignment operators
Expand Down
43 changes: 23 additions & 20 deletions src/Core/Geometry/IndexedGeometry.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#include <Core/Geometry/IndexedGeometry.hpp>
#include <Core/Geometry/TriangleMesh.hpp>

#include <iterator>

namespace Ra {
Expand Down Expand Up @@ -56,23 +58,33 @@ void MultiIndexedGeometry::checkConsistency() const {
}

bool MultiIndexedGeometry::append( const MultiIndexedGeometry& other ) {

int offset = other.vertices().size();
// first append attribs
AttribArrayGeometry::append( other );

// then indices, and offset.
bool dataHasBeenCopied = false;
for ( const auto& [key, value] : other.m_indices ) {
auto it = m_indices.find( key );
if ( it == m_indices.end() ) // copy entire layer
{
m_indices[key] = std::make_pair(
value.first, std::unique_ptr<GeometryIndexLayerBase> { value.second->clone() } );

dataHasBeenCopied = true;
m_indices[key].second->offset( offset );
///\todo offest indices.
}
else {
// try to append to an existing layer: should always work
if ( it->second.second->append( *( value.second ) ) ) { dataHasBeenCopied = true; }
if ( it->second.second->append( *( value.second ), offset ) ) {
dataHasBeenCopied = true;
}
else {
CORE_ASSERT( false,
"Inconsistency: layers with different semantics shares the same key" );
}
///\todo offest indices.
}
}

Expand Down Expand Up @@ -210,23 +222,23 @@ void MultiIndexedGeometry::unlockLayer( const LayerKeyType& layerKey ) {
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////

std::pair<bool, GeometryIndexLayerBase&>
MultiIndexedGeometry::addLayer( std::unique_ptr<GeometryIndexLayerBase>&& layer,
const bool withLock,
const std::string& layerName ) {
auto MultiIndexedGeometry::addLayer( std::unique_ptr<GeometryIndexLayerBase>&& layer,
const bool withLock,
const std::string& layerName )
-> std::pair<bool, LayerKeyType> {
LayerKeyType key { layer->semantics(), layerName };
std::pair<LayerKeyType, EntryType> elt { key, std::make_pair( false, std::move( layer ) ) };
auto elt = std::make_pair( key, std::make_pair( false, std::move( layer ) ) );
auto [pos, inserted] = m_indices.insert( std::move( elt ) );
notify();

if ( withLock ) {
CORE_ASSERT( !pos->second.first, "try to get already locked layer" );
pos->second.first = true;
}
/// If not inserted, the pointer is deleted. So the caller must ensure this possible deletion
/// is safe before calling this method.
/// If not inserted, the pointer is deleted. So the caller must ensure this possible
/// deletion is safe before calling this method.

return { inserted, *( pos->second.second ) };
return { inserted, key };
}
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
Expand All @@ -245,7 +257,7 @@ void MultiIndexedGeometry::deepClear() {
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////

std::size_t MultiIndexedGeometry::KeyHash::operator()( const LayerKeyType& k ) const {
std::size_t MultiIndexedGeometry::LayerKeyHash::operator()( const LayerKeyType& k ) const {
// Mix semantic collection into a single identifier string
std::ostringstream stream;
std::copy( k.first.begin(), k.first.end(), std::ostream_iterator<std::string>( stream, "" ) );
Expand All @@ -256,15 +268,6 @@ std::size_t MultiIndexedGeometry::KeyHash::operator()( const LayerKeyType& k ) c
return std::hash<std::string> {}( result ) ^ ( std::hash<std::string> {}( k.second ) << 1 );
}

//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////

void PointCloudIndexLayer::linearIndices( const AttribArrayGeometry& attr ) {
auto nbVert = attr.vertices().size();
collection().resize( nbVert );
collection().getMap() = IndexContainerType::Matrix::LinSpaced( nbVert, 0, nbVert - 1 );
}

} // namespace Geometry
} // namespace Core
} // namespace Ra
Loading
Loading