Wednesday, November 11, 2015

Our New Start-up : Rendr Softworks : Virtual Reality for Architects



Today, when an architect wants to talk with a client about their project, they use blueprints, models, pictures or videos.


These representations are intended to help the client understand the project in an easier to view visual manner, however they do have their limitations.


Clients can become confused due to awry depth perception, fixed or misleading framing of images, or unnatural lighting.


Every question a client has seeking clarity about a design from an image, video or model, is time wasted describing the medium rather than the design itself, and can put the architect on the back foot, having to defend their work and explain details multiple times.


To overcome these issues, we created Rendr, an agency that specializes in high-end virtual tours of a project – allowing clients to experience the design in a unique and engaging manner.
Simply provide your blueprint or 3D model and we bring your project to life!
We create a unique and custom virtual environment, to help immerse the client in the design.


Not only is it a virtual tour, but the space is interactive and animated – creating an exceptional, unique and memorable experience for the client.

Watch our 360 degree Youtube video to see the potential and how it can elevate your client consultations to the next level. Feel free to share our videos and if you have any questions or ongoing projects please get in touch!

Website (Worldwide) www.rendrsoftworks.com
Website (France) www.rendr.fr

Wednesday, February 11, 2015

SFML & 3DMouse support with 3DConnexionSDK

How to make 3DMouse support in a SFML project?

The problem with SFML is that the windows event layer is wrapped for multi-platform issues.
The problem with the 3DConnexion SDK is that it uses internal windows event messages, that should be processed by GetMessage() or PollMEssage()

So you can't have access to SFML internal poll event without changing the source code, and you can't use GetMessage or PollMessage as shown in the 3DConnexion SDK sample codes.

I've found a solution with Windows Callback.

First set the callback with SetWindowsHookEx

SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)&SpaceNavigatorCB, GetModuleHandle(NULL), GetCurrentThreadId()) == NULL
The callback should be prototyped like this :

LRESULT CALLBACK SpaceNavigatorCB(int code, WPARAM wParam, LPARAM lParam)

Complete code for the callback :


Hope it helps !

Follow the project on Facebook : https://www.facebook.com/immersionengine
Follow me on twitter : twitter.com/lefebv_l

Tuesday, November 25, 2014

FreeImage & 64 bit compilation on Windows

We are changing from lib DevIL to FreeImage because DevIL is not thread-safe.

But the FreeImage website lacks of x64 binaries

We had to recompile it for VC11 (Visual 2012) in x64 bit. We enabled SSE2 processor optimization flags.

Here's the archive : Download


Follow the project on Facebook : https://www.facebook.com/immersionengine
Follow me on twitter : twitter.com/lefebv_l

Thursday, June 19, 2014

SSE horizontal minimum and maximum

 static inline float sseHorizontalMin(const __m128 &p)  
 {   
     __m128 data = p;             /* [0, 1, 2, 3] */   
     __m128 low = _mm_movehl_ps(data, data); /* [2, 3, 2, 3] */   
     __m128 low_accum = _mm_min_ps(low, data); /* [0|2, 1|3, 2|2, 3|3] */   
     __m128 elem1 = _mm_shuffle_ps(low_accum,   
                       low_accum,   
                       _MM_SHUFFLE(1,1,1,1)); /* [1|3, 1|3, 1|3, 1|3] */   
     __m128 accum = _mm_min_ss(low_accum, elem1);   
     return _mm_cvtss_f32(accum);   
 }  
 static inline float sseHorizontalMax(const __m128 &p)  
 {   
     __m128 data = p;             /* [0, 1, 2, 3] */   
     __m128 high = _mm_movehl_ps(data, data); /* [2, 3, 2, 3] */   
     __m128 high_accum = _mm_max_ps(high, data); /* [0|2, 1|3, 2|2, 3|3] */   
     __m128 elem1 = _mm_shuffle_ps(high_accum,   
                       high_accum,   
                       _MM_SHUFFLE(1,1,1,1)); /* [1|3, 1|3, 1|3, 1|3] */   
     __m128 accum = _mm_max_ss(high_accum, elem1);   
     return _mm_cvtss_f32(accum);   
 }  


Follow the project on Facebook : https://www.facebook.com/immersionengine
Follow me on twitter : twitter.com/lefebv_l

Sunday, May 11, 2014

LibXML2 & 64 bit compilation on Windows

We recently tried to change our platform from 32bit to 64bit.

Here are some feedbacks:
- We were based on libxml2, which relies on libiconv and zlib. Unfortunately, the official libxml website (ftp://xmlsoft.org/libxml2/) doesn't provide 64bit precompiled binaries for Windows.

- We found some files on the web https://github.com/dlonie/OpenBabel-BFGS/tree/master/windows-vc2008/libs/x64 that didn't work.

- We didn't have the patience to recompile everything from scratch - it will add too much complexity to our dev env.

The solution we choose:
TinyXML2 ! 
- Because it is just 2 files : one .h / one .cpp
- Because you can compile it in 32/64 bit
- Because it is fast and easy to use

Source : http://www.grinninglizard.com/tinyxml2/

What's new in TinyXML2 compared to TinyXML ?
  1. Many fewer memory allocation (1/10th to 1/100th), uses less memory (about 40% of TinyXML-1), and faster (~5x on read)
  2. No STL requirement
  3. More modern C++, including a proper namespace
  4. Proper and useful handling of whitespace

Hello, world.

Just a simple announcement : From now, all posts will be written in English.

Friday, September 28, 2012

SFML2.0 RC and Visual Studio 2012 RC


EDIT 2013/07: SFML2.0 Stable is out! http://www.sfml-dev.org/

Cette semaine, j'ai essayé la version 2.0 RC de la SFML, qui est absolument géniale!
Mais en voulant aller trop vite, je n'ai pas vu que Visual Studio 2012 RC (VC11) n'était pas supporté. 
Comme j'ai perdu pas mal de temps a chercher des bugs qui n'existaient pas (crashs aléatoires), certains trouverons pratique ce dossier conternant lib, include et dll de la SFML2.0 RC, fonctionnels pour Visual Studio 2012 RC!

Télécharger l'archive
(4 Mo)

Enjoy!

Si vous avez aimé l'article n'hésitez pas à laisser un commentaire, ou me suivre sur twitter

Saturday, August 25, 2012

Le premier lancer de rayon... a eu lieu en 1525 !





En 1525, Albrecht Dürer, peintre, graveur et mathématicien allemand expose une méthode pour représenter les perspectives. Il reporte point par point sur une feuille, les contours d’objets à l’aide d’une ficelle tendue entre le point de vue et la scène...

La même méthode est utilisée de nos jours dans les calculs graphiques, la ficelle ayant été remplacé par des vecteurs, et les objets par des ensembles de triangles...

Tuesday, July 10, 2012

Rencontre avec Balthazar Auxietre - Eidolon


Ce weekend, nous avons rencontré Balthazar Auxietre, réalisateur du projet Eidolon, "une installation immersive qui propose de vivre une expérience cinématographique interactive pour un spectateur unique".




Ce type de projet artistique nous intéresse beaucoup, car nous partageons le même but, la même finalité: faire vivre des expériences, des aventures, au travers d'une histoire, d'une technologie.

Pour Eidolon, la technologie de réalité virtuelle utilisée est un casque. A 
l'avenir nous travaillerons probablement avec Balthazar sur un nouveau projet, en utilisant cette fois l'Immersion Engine comme pièce maîtresse, et vous pourrez vivre cette expérience immersive sur n'importe quel équipement de réalité virtuelle.


Stay tuned ;)



Si vous avez aimé l'article n'hésitez pas à laisser un commentaire, ou me suivre sur twitter

Thursday, June 14, 2012

Premiers retours de Gaiagen


Nous avons des nouvelles de Gaiagen, le logiciel de génération de mondes virtuels développé par Julien Lagorsse et ses acolytes, et qui utilise l'Immersion Engine comme moteur de rendu.

Gaiagen est un projet de fin d'étude. Le logiciel doit générer terrains, océans, végétation, et dans le futur des espaces urbains.


Pour l'instant la gestion du terrain et de l'eau est bien avancée, je vous tiendrais au courant des futures nouveautés.




Voici un screenshot de la génération de terrain.










Si vous avez aimé l'article n'hésitez pas à laisser un commentaire, ou me suivre sur twitter

Thursday, June 7, 2012

VIDEO - Immersion Engine dans la presse online!

Ces dernières semaines ont été riches en nouveauté.

Entre autres, #Epitech à publié un article de presse qui a été repris par de nombreux site, dont les très réputés 3dvf.com et afjv.com



Nous sommes très content de l'engouement généré par le projet, cela nous motive encore plus dans notre travail, et de nouvelles surprises sont en préparation pour la rentrée. Stay tuned ;-)

Regardez Camille JAN parler d'Immersion, dans cette courte vidéo de 2 minutes.



Si vous avez aimé l'article n'hésitez pas à laisser un commentaire, ou me suivre sur twitter

Tuesday, June 5, 2012

Comment mettre à jour manuellement un plugin Firefox obsolète?

De temps en temps, avec les nouvelles versions de Firefox, certain de vos plugins peuvent devenir obsolètes.
Pour forcer leur compatibilité, voici un petit hack:


Téléchargez le module sur votre ordinateur (clic droit -> enregistrer le lien sous), puis renommez l'extension .xpi en .zip
Ouvrez l'archive, et modifiez le fichier install.rdf présent à l'intérieur.



Cherchez la balise <em:maxVersion> et changez la valeur par le numéro de votre version.
Sauvegardez le fichier, renommez l'extension de l'archive en .xpi, et ouvrez-là avec Firefox (ctrl+O) pour installer le module.

Si vous avez aimé l'article n'hésitez pas à laisser un commentaire, ou me suivre sur twitter

Friday, May 25, 2012

Compiler Firesheep sur Fedora



Dernièrement, je me suis amusé dernièrement à compiler Firesheep sur ma Fedora.
Voici les commandes tapées:

Installation des dépendances:

yum install autoreconf  xulrunner xulrunner-devel git git-all cpan libpcap libpcap-devel boost boost-devel gcc libtool autoheader

cpan CORBA::XPIDL
cpan CORBA::IDL::Parser

Récupération des sources:

git clone https://github.com/mickflemm/firesheep.git
cd firesheep/

git submodule update --init

Compilation:

./autogen.sh --with-xulrunner-sdk=/usr/lib/xulrunner-2



Pour l'installation de l'extension, il suffit d'ouvrir le .xpi avec Firefox (path du fichier dans la barre d'adresse).
Il vous faudra éventuellement lancer Firefox en root pour certaines permissions.


Si vous avez aimé l'article n'hésitez pas à laisser un commentaire, ou me suivre sur twitter

Saturday, January 28, 2012

Comment normaliser 4 vecteurs rapidement via les instructions SIMD

Une grande partie des performances dégagées par notre moteur sont dues au concept de SIMD; Simple Instruction Multiple Data. Ce sont des instructions processeurs (SSE, SSE2, SSE3, SSE4a, 3dNow!) qui permettent d'accélérer des calculs bas niveau.


L'exemple suivant montre comment faire une addition de vecteur classique


 struct vector  
 {  
   float x,y,z;  
 };  
 vector add(const vector &a, const vector &b)  
 {  
   vector c;  
   c.x = a.x + b.x;  
   c.y = a.y + b.y;  
   c.z = a.z + b.z;  
   return c;  
 }  


Et maintenant la version SIMD:


 # include <xmmintrin.h>  
 struct vector  
 {  
   __m128 m;  
   // Pour acceder aux composantes x, y, z  
   // vous pouvez simplement faire un cast ((float*)&m)[ 0 1 2 ou 3]  
 };  
 vector add(const vector &a, const vector &b)  
 {  
   vector c;  
   c.m = _mm_add_ps(a.m, b.m);  
   return c;  
 }  


Entre les deux versions, le facteur de speedup se situe entre 3 et 4. Si vous développez des applications nécessitants de nombreux calculs 3D, utilisez absolument ces instructions!


Voici maintenant une astuce pour gagner du temps sur les normalisations.


Il est plus performant de multiplier par la sqrt inverse (_mm_rsqrt_ps) que de diviser par la sqrt. En revanche la fonction _mm_rsqrt_ps a une précision moindre. Pour combler ce manque de précision, on fait une nouvelle itération dans le calcul de la racine, appelée "Iteration de Newton-Raphson".

 __m128    fastrsqrt( const __m128 v )  
 {  
       static const __m128 _half4 = _mm_set_ps1( 0.5f );  
       static const __m128 _three = _mm_set_ps1( 3.0f );  
       const __m128 nr = _mm_rsqrt_ps( v ); // Newton-Raphson iteration  
       const __m128 muls = _mm_mul_ps( _mm_mul_ps( v, nr ), nr );  
       return _mm_mul_ps( _mm_mul_ps( _half4, nr ), _mm_sub_ps( _three, muls ) );  
 }  
 void Normalize4(vector p[4])  
 {  
     // Store x, y, and z separately in 3 __m128  
     __m128 x4 = _mm_set_ps(p[3][0], p[2][0], p[1][0], p[0][0]);  
     __m128 y4 = _mm_set_ps(p[3][1], p[2][1], p[1][1], p[0][1]);  
     __m128 z4 = _mm_set_ps(p[3][2], p[2][2], p[1][2], p[0][2]);  
     x4 = _mm_mul_ps(x4, x4); // x * x  
     y4 = _mm_mul_ps(y4, y4); // y * y  
     z4 = _mm_mul_ps(z4, z4); // z * z  
     const vector l = fastrsqrt(_mm_add_ps(z4, _mm_add_ps(y4, x4))); // sqrt(x*x+y*y+z*z)  
     p[0].m = _mm_mul_ps(p[0].m, _mm_set_ps1(l[0])); // load results in packet  
     p[1].m = _mm_mul_ps(p[1].m, _mm_set_ps1(l[1]));  
     p[2].m = _mm_mul_ps(p[2].m, _mm_set_ps1(l[2]));  
     p[3].m = _mm_mul_ps(p[3].m, _mm_set_ps1(l[3]));  
 }  


Si vous avez aimé l'article n'hésitez pas à laisser un commentaire, ou me suivre sur twitter

Immersion Engine dans la presse!

Nous sommes dans le magazine Programmez du mois de Janvier!
A la page numéro 24, vous trouverez une page parlant de notre projet.

Je vous invite à acheter le magazine pour découvrir les autres passionnants projets de fin d'études présenté par les étudiants de notre promotion. Vous pouvez vous le procurer ici.

Bonne lecture!

Si vous avez aimé l'article n'hésitez pas à laisser un commentaire, ou me suivre sur twitter

Monday, October 3, 2011

Les phases communicantes

Il était temps de redorer un peu la communication autour d'Immersion! Ce qui nous as motivé, c'est les cours de business dispensés à Epitech par Gilles Enguehard. En définissant mieux notre cible potentielle, nous avons pu redéfinir notre identité visuelle ainsi que les textes qui l'accompagne.

En bref, nouveau logo, nouvelle typo, nouvelle accroche, nouveau site, nouvelles cartes de visites, nouveaux flyers, etc.... beaucoup de nouvelles choses en préparation!

Voici en avant-première un projet de flyer dans lequel vous pouvez voir entre autres le nouveau logo !
N'hésitez pas à partager vos critiques/commentaires en dessous!

Si vous avez aimé l'article n'hésitez pas à laisser un commentaire, ou me suivre sur twitter

Monday, August 1, 2011

Rencontre avec AMD

La semaine dernière, nous avons eu le plaisir de rencontrer à l'ACSEL un employé de chez AMD! Un entretien très intéressant autour de l'optimisation matérielle, et de l'utilisation du trio CPU / GPU / APU pour lancer des rayons.




Les 5 points à retenir absolument avant de se lancer dans le GPGPU:

  1. Un GPU est très bon pour les calculs parallèles sur de gros blocs de données, si toutefois les calculs ne diffèrent pas trop. Ce qui veut dire qu'il est très bon pour les rayons primaires, beaucoup moins pour les secondaires.
  2. Les algorithmes avec beaucoup de branchements (type parcours d'arbre) sont à BANNIR sur GPU. Le CPU est beaucoup plus à l'aise dessus.
  3. Un APU à environ 1/4 de la puissance d'un GPU. Mais du fait de sa localisation, il sera plus performant pour certains calculs que le GPU.
  4. La taille de la VRAM ne doit pas être un soucis. Des solutions arriveront.
  5. Le temps de transfert ne doit pas être un soucis. Des solutions arriveront.

Nous voilà donc partis dans nos premiers TPs sur OpenCL. Les premiers résultats sont concluants, mais il faudra un gros travail de conception avant de voir le GPGPU d'imposer dans le moteur.



Si vous avez aimé l'article n'hésitez pas à laisser un commentaire, ou me suivre sur twitter

Friday, June 10, 2011

Immersion dans la réalité virtuelle

J'ai le plaisir de vous annoncer notre collaboration avec l'INRIA (Institut national de recherche en informatique et en automatique), autour du lancer de rayons temps réel, et de la réalité virtuelle (VR).


Notre but est de mettre en place notre moteur dans la salle de réalité virtuelle Gouraud-Phong (une plateforme d'1 M€ quand même!), basée dans le centre de Sophia Antipolis.

Caractéristiques techniques
  • rétroprojection sur tous les écrans
  • suivi de position optique
  • stéréo Infitec
  • son spatialisé
  • espace de travail de l’iSpace : 3,2m * 3,2m * 2,4m 

Plus d'infos? http://www.inria.fr/centre-de-recherche-inria/sophia-antipolis-mediterranee/innovation/plateformes-technologiques2


Si vous avez aimé l'article n'hésitez pas à laisser un commentaire, ou me suivre sur twitter

Friday, January 28, 2011

Revenons à nos rayons!

  Je vous disais plus tôt que mon truc à moi, c'est les rayons.
En vérité, je suis (du verbe suivre) un master en sciences informatiques, dans lequel je me suis spécialisé dans la synthèse d'images, et plus particulièrement dans une méthode de rendu graphique appelée "Raytracing", traduit en français "Lancer de rayon".

Non, c'est pas moi.


 Voila, le mystère est levé!






 
Cette technique part d'une base mathématique simple, la résolution polynomiale, mais poussée à l'extrême, avec des petits bouts de 3D dedans.

A quoi ça sert?

  Le raytracing est utilisé principalement dans les films d'animations, et un peu dans les jeux actuels (mais sous une forme différente).
  L'intérêt par rapport à la rastérization (technique utilisé dans les jeux)?
Rendre des images photo-réalistes, en simulant le parcours de la lumière, restituer des sons spatiaux parfaits, en simulant le parcours des ondes sonores, et générer des effets physiques convaincants, grâce à la précision des algorithmes utilisés. Rien que ça.

 
C'est beau, hein!?

Et moi dans tout ça?

  Moi, et une dizaine de copains (c'est l'avantage d'être étudiant), on s'attache à résoudre le plus gros problème du raytracing: la lenteur.
Pour faire bref, on pourrait dire que "le raytracing est à la technique de rendu ce que Java est aux langages de programmation".


 Et du coup, ça donne un projet de recherche d'envergure en realtime raytracing, en partenariat avec l'ACSEL (Advanced Computer Sciences Epitech Laboratory), et joliment nommé Immersion Engine.


Si vous avez aimé l'article n'hésitez pas à laisser un commentaire, ou me suivre sur twitter

Thursday, September 2, 2010

Des rayons plein la tête

Le premier billet est toujours le plus difficile.
Faut-t'il se présenter? Montrer sa Geek-Attitude avec un simple Hello World? Expliquer en 36 points pourquoi ce blog, ou promettre corps et âme de le mettre à jour en permanence - croix de bois crois de fer, si je mens, je vais dans /dev/null - pour le laisser à l'abandon dans deux semaines?

Non, je vais juste vous dire que mon truc à moi, c'est les rayons, et comme présentation, c'est déjà pas mal.