#1 

22-03-2012 19:52:03

johnplayer
Membres
Avatar de johnplayer
Date d'inscription:
Messages: 431
IP: 83.192.94.82
Courriel

Voilà, pour mon besoin personnel, j'ai codé une classe qui renvoie un buffer contenant une sphere basé sur un icosaèdre.
Pour l'itération, il faut savoir qu'elle doit être entre 0 et 5 compris. L'itération 0 rend une sphère à 20 triangles et chaque itération multiplie par 4 le nombre de triangles pour arriver à 20480 pour une itération de 5.
Les buffers étant limités à 65536 vertices et les triangles étant tous séparés (3 vertices par triangles, pour des raisons de texturing et manipulations), il est impossible d'aller au-dessus de 5 itérations.
Maintenant, si quelqu'un à des suggestions d'améliorations, qu'il n'hésite pas! Je modifierais le code dès que possible.




SphereIcosa.hSphereIcosa.cppexemple.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38


#ifndef SPHEREICOSA_H
#define SPHEREICOSA_H

#include "irrTypes.h"
#include "vector3d.h"
#include "aabbox3d.h"
#include "CMeshBuffer.h"
#include "SMaterial.h"


class SphereIcosa
{
    public:
        SphereIcosa(irr::video::SMaterial material, irr::f32 rayon=1, irr::u8 iterations=0);
        SphereIcosa(irr::f32 rayon=1, irr::u8 iterations=0);
        virtual ~SphereIcosa();

        bool createNewSphere(irr::f32 rayon=1, irr::u8 iterations=0);
        irr::scene::SMeshBuffer* getBufferCopy();
        irr::video::SMaterial& getMaterial();
        void setMaterial(irr::video::SMaterial material);
        irr::core::aabbox3df& getBoundingBox();

    protected:
        irr::f32 Rayon;
        irr::u8 NbIterations;
        irr::scene::SMeshBuffer* Buffer;
        irr::core::aabbox3df BoundingBox;

        void createBoundingBox();

    private:

};

#endif // SPHEREICOSA_H


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#2 

22-03-2012 22:07:47

johnplayer
Membres
Avatar de johnplayer
Date d'inscription:
Messages: 431
IP: 83.192.214.222
Courriel

Voici une autre classe qui elle utilise des index 32 bits. Ceux-ci ne sont pas compatibles avec toutes les cartes graphiques. Niveau perfs 245fps pour une itération 8 soit 1 311 000 triangles sur une GTX590 avec VBO activé.
Par contre pour ma part je ne dépasse pas l'itération 8 car la 9ème plante (environ 5 000 000 de triangles).
Ce n'est pas vraiment génant de ne pouvoir monter que jusqu'à 1 311 000 triagles.^^

// fichier : SphereIcosaUnlimited.h

#ifndef SPHEREICOSAUNLIMITED_H
#define SPHEREICOSAUNLIMITED_H


#include "irrTypes.h"
#include "vector3d.h"
#include "aabbox3d.h"
#include "CDynamicMeshBuffer.h"
#include "SMaterial.h"


class SphereIcosaUnlimited
{
    public:
        SphereIcosaUnlimited(irr::video::SMaterial material, irr::f32 rayon=1, irr::u16 iterations=0);
        SphereIcosaUnlimited(irr::f32 rayon=1, irr::u16 iterations=0);
        virtual ~SphereIcosaUnlimited();

        bool createNewSphere(irr::f32 rayon=1, irr::u16 iterations=0);
        irr::scene::CDynamicMeshBuffer* getBuffer();
        irr::video::SMaterial& getMaterial();
        void setMaterial(irr::video::SMaterial material);
        irr::core::aabbox3df& getBoundingBox();
        void setUseVBO(irr::scene::E_HARDWARE_MAPPING vbo=irr::scene::EHM_NEVER);

    protected:
        irr::f32 Rayon;
        irr::u8 NbIterations;
        irr::scene::CDynamicMeshBuffer* Buffer;
        irr::core::aabbox3df BoundingBox;

        void createBoundingBox();

    private:

};

#endif // SPHEREICOSAUNLIMITED_H

// fichier SphereIcosaUnlimited.cpp

#include "SphereIcosaUnlimited.h"

SphereIcosaUnlimited::SphereIcosaUnlimited(irr::video::SMaterial material, irr::f32 rayon, irr::u16 iterations) : Rayon(rayon), NbIterations(iterations)
{
    /// initialisation du buffer
    Buffer = new irr::scene::CDynamicMeshBuffer(irr::video::EVT_STANDARD, irr::video::EIT_32BIT);
    Buffer->Material = material;
    /// créé la sphère
    createNewSphere(rayon, iterations);
}

SphereIcosaUnlimited::SphereIcosaUnlimited(irr::f32 rayon, irr::u16 iterations) : Rayon(rayon), NbIterations(iterations)
{
    /// créé la sphère
    createNewSphere(rayon, iterations);
}

SphereIcosaUnlimited::~SphereIcosaUnlimited()
{
    /// libère la mémoire
}

bool SphereIcosaUnlimited::createNewSphere(irr::f32 rayon, irr::u16 iterations)
{
    /// array contenant les vertices
    irr::core::array<irr::core::vector3df> listevertex;
    /// calcul des termes de base
    irr::core::vector3df normalise(1, ((1+irr::core::squareroot(5.f))/2), 0);
    normalise.setLength(rayon);
    irr::f32 terme1 = normalise.X;
    irr::f32 terme2 = normalise.Y;
    /// calcul des 4 points du plan : XY
    listevertex.push_back( irr::core::vector3df(-terme1,-terme2,0) );
    listevertex.push_back( irr::core::vector3df(-terme1,terme2,0) );
    listevertex.push_back( irr::core::vector3df(terme1,terme2,0) );
    listevertex.push_back( irr::core::vector3df(terme1,-terme2,0) );
    /// calcul des 4 points du plan : YZ
    listevertex.push_back( irr::core::vector3df(0,-terme1,-terme2) );
    listevertex.push_back( irr::core::vector3df(0,terme1,-terme2) );
    listevertex.push_back( irr::core::vector3df(0,terme1,terme2) );
    listevertex.push_back( irr::core::vector3df(0,-terme1,terme2) );
    /// calcul des 4 points du plan : XZ
    listevertex.push_back( irr::core::vector3df(-terme2,0,-terme1) );
    listevertex.push_back( irr::core::vector3df(-terme2,0,terme1) );
    listevertex.push_back( irr::core::vector3df(terme2,0,terme1) );
    listevertex.push_back( irr::core::vector3df(terme2,0,-terme1) );
    /// mise dans le buffer dans la forme première
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[0], irr::core::vector3df(0), irr::video::SColor(255,000,255,000), irr::core::vector2df(0,0)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[3], irr::core::vector3df(0), irr::video::SColor(255,000,255,000), irr::core::vector2df(0,1)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[7], irr::core::vector3df(0), irr::video::SColor(255,000,255,000), irr::core::vector2df(0.5,0.5)) );
    Buffer->getIndexBuffer().push_back( 0 ); Buffer->getIndexBuffer().push_back( 1 ); Buffer->getIndexBuffer().push_back( 2 );

    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[3], irr::core::vector3df(0), irr::video::SColor(255,000,255,000), irr::core::vector2df(0,0)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[0], irr::core::vector3df(0), irr::video::SColor(255,000,255,000), irr::core::vector2df(0,1)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[4], irr::core::vector3df(0), irr::video::SColor(255,000,255,000), irr::core::vector2df(0.5,0.5)) );
    Buffer->getIndexBuffer().push_back( 3 ); Buffer->getIndexBuffer().push_back( 4 ); Buffer->getIndexBuffer().push_back( 5 );

    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[2], irr::core::vector3df(0), irr::video::SColor(255,000,255,000), irr::core::vector2df(0,0)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[1], irr::core::vector3df(0), irr::video::SColor(255,000,255,000), irr::core::vector2df(0,1)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[6], irr::core::vector3df(0), irr::video::SColor(255,000,255,000), irr::core::vector2df(0.5,0.5)) );
    Buffer->getIndexBuffer().push_back( 6 ); Buffer->getIndexBuffer().push_back( 7 ); Buffer->getIndexBuffer().push_back( 8 );

    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[1], irr::core::vector3df(0), irr::video::SColor(255,000,255,000), irr::core::vector2df(0,0)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[2], irr::core::vector3df(0), irr::video::SColor(255,000,255,000), irr::core::vector2df(0,1)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[5], irr::core::vector3df(0), irr::video::SColor(255,000,255,000), irr::core::vector2df(0.5,0.5)) );
    Buffer->getIndexBuffer().push_back( 9 ); Buffer->getIndexBuffer().push_back( 10 ); Buffer->getIndexBuffer().push_back( 11 );



    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[4], irr::core::vector3df(0), irr::video::SColor(255,000,000,255), irr::core::vector2df(0,0)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[5], irr::core::vector3df(0), irr::video::SColor(255,000,000,255), irr::core::vector2df(0,1)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[11], irr::core::vector3df(0), irr::video::SColor(255,000,000,255), irr::core::vector2df(0.5,0.5)) );
    Buffer->getIndexBuffer().push_back( 12 ); Buffer->getIndexBuffer().push_back( 13 ); Buffer->getIndexBuffer().push_back( 14 );

    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[5], irr::core::vector3df(0), irr::video::SColor(255,000,000,255), irr::core::vector2df(0,0)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[4], irr::core::vector3df(0), irr::video::SColor(255,000,000,255), irr::core::vector2df(0,1)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[8], irr::core::vector3df(0), irr::video::SColor(255,000,000,255), irr::core::vector2df(0.5,0.5)) );
    Buffer->getIndexBuffer().push_back( 15 ); Buffer->getIndexBuffer().push_back( 16 ); Buffer->getIndexBuffer().push_back( 17 );

    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[7], irr::core::vector3df(0), irr::video::SColor(255,000,000,255), irr::core::vector2df(0,0)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[6], irr::core::vector3df(0), irr::video::SColor(255,000,000,255), irr::core::vector2df(0,1)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[9], irr::core::vector3df(0), irr::video::SColor(255,000,000,255), irr::core::vector2df(0.5,0.5)) );
    Buffer->getIndexBuffer().push_back( 18 ); Buffer->getIndexBuffer().push_back( 19 ); Buffer->getIndexBuffer().push_back( 20 );

    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[6], irr::core::vector3df(0), irr::video::SColor(255,000,000,255), irr::core::vector2df(0,0)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[7], irr::core::vector3df(0), irr::video::SColor(255,000,000,255), irr::core::vector2df(0,1)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[10], irr::core::vector3df(0), irr::video::SColor(255,000,000,255), irr::core::vector2df(0.5,0.5)) );
    Buffer->getIndexBuffer().push_back( 21 ); Buffer->getIndexBuffer().push_back( 22 ); Buffer->getIndexBuffer().push_back( 23 );



    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[9], irr::core::vector3df(0), irr::video::SColor(255,255,000,000), irr::core::vector2df(0,0)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[8], irr::core::vector3df(0), irr::video::SColor(255,255,000,000), irr::core::vector2df(0,1)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[0], irr::core::vector3df(0), irr::video::SColor(255,255,000,000), irr::core::vector2df(0.5,0.5)) );
    Buffer->getIndexBuffer().push_back( 24 ); Buffer->getIndexBuffer().push_back( 25 ); Buffer->getIndexBuffer().push_back( 26 );

    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[8], irr::core::vector3df(0), irr::video::SColor(255,255,000,000), irr::core::vector2df(0,0)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[9], irr::core::vector3df(0), irr::video::SColor(255,255,000,000), irr::core::vector2df(0,1)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[1], irr::core::vector3df(0), irr::video::SColor(255,255,000,000), irr::core::vector2df(0.5,0.5)) );
    Buffer->getIndexBuffer().push_back( 27 ); Buffer->getIndexBuffer().push_back( 28 ); Buffer->getIndexBuffer().push_back( 29 );

    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[10], irr::core::vector3df(0), irr::video::SColor(255,255,000,000), irr::core::vector2df(0,0)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[11], irr::core::vector3df(0), irr::video::SColor(255,255,000,000), irr::core::vector2df(0,1)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[2], irr::core::vector3df(0), irr::video::SColor(255,255,000,000), irr::core::vector2df(0.5,0.5)) );
    Buffer->getIndexBuffer().push_back( 30 ); Buffer->getIndexBuffer().push_back( 31 ); Buffer->getIndexBuffer().push_back( 32 );

    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[11], irr::core::vector3df(0), irr::video::SColor(255,255,000,000), irr::core::vector2df(0,0)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[10], irr::core::vector3df(0), irr::video::SColor(255,255,000,000), irr::core::vector2df(0,1)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[3], irr::core::vector3df(0), irr::video::SColor(255,255,000,000), irr::core::vector2df(0.5,0.5)) );
    Buffer->getIndexBuffer().push_back( 33 ); Buffer->getIndexBuffer().push_back( 34 ); Buffer->getIndexBuffer().push_back( 35 );




    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[0], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0,0)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[8], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0,1)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[4], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0.5,0.5)) );
    Buffer->getIndexBuffer().push_back( 36 ); Buffer->getIndexBuffer().push_back( 37 ); Buffer->getIndexBuffer().push_back( 38 );

    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[0], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0,0)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[7], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0,1)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[9], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0.5,0.5)) );
    Buffer->getIndexBuffer().push_back( 39 ); Buffer->getIndexBuffer().push_back( 40 ); Buffer->getIndexBuffer().push_back( 41 );

    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[1], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0,0)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[5], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0,1)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[8], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0.5,0.5)) );
    Buffer->getIndexBuffer().push_back( 42 ); Buffer->getIndexBuffer().push_back( 43 ); Buffer->getIndexBuffer().push_back( 44 );

    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[1], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0,0)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[9], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0,1)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[6], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0.5,0.5)) );
    Buffer->getIndexBuffer().push_back( 45 ); Buffer->getIndexBuffer().push_back( 46 ); Buffer->getIndexBuffer().push_back( 47 );

    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[2], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0,0)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[6], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0,1)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[10], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0.5,0.5)) );
    Buffer->getIndexBuffer().push_back( 48 ); Buffer->getIndexBuffer().push_back( 49 ); Buffer->getIndexBuffer().push_back( 50 );

    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[2], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0,0)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[11], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0,1)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[5], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0.5,0.5)) );
    Buffer->getIndexBuffer().push_back( 51 ); Buffer->getIndexBuffer().push_back( 52 ); Buffer->getIndexBuffer().push_back( 53 );

    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[3], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0,0)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[10], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0,1)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[7], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0.5,0.5)) );
    Buffer->getIndexBuffer().push_back( 54 ); Buffer->getIndexBuffer().push_back( 55 ); Buffer->getIndexBuffer().push_back( 56 );

    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[3], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0,0)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[4], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0,1)) );
    Buffer->getVertexBuffer().push_back( irr::video::S3DVertex( listevertex[11], irr::core::vector3df(0), irr::video::SColor(255,200,200,000), irr::core::vector2df(0.5,0.5)) );
    Buffer->getIndexBuffer().push_back( 57 ); Buffer->getIndexBuffer().push_back( 58 ); Buffer->getIndexBuffer().push_back( 59 );

    for(irr::u16 nbIterations=0; nbIterations < iterations; ++nbIterations )
    {
        /// variables
        irr::scene::IVertexBuffer* VBuffer = new irr::scene::CVertexBuffer(irr::video::EVT_STANDARD);
        irr::scene::IIndexBuffer* IBuffer = new irr::scene::CIndexBuffer(irr::video::EIT_32BIT);
        VBuffer->setHardwareMappingHint( Buffer->getVertexBuffer().getHardwareMappingHint() );
        IBuffer->setHardwareMappingHint( Buffer->getIndexBuffer().getHardwareMappingHint() );
        /// créations des couleurs
        irr::video::SColor color1(255,255,000,000);
        irr::video::SColor color2(255,000,255,000);
        irr::video::SColor color3(255,000,000,255);
        irr::video::SColor color4(255,255,255,000);
        /// pour chaque triangles on en créé 4 nouveaux par subdivisions
        for(irr::u32 a=0; a < Buffer->getIndexBuffer().size(); a+=3)
        {
            /// on enregistre l'index
            irr::u32 index = VBuffer->size();
            /// on enregistre les 3 points existant
            irr::core::vector3df A( Buffer->getVertexBuffer()[Buffer->getIndexBuffer()[a]].Pos );
            irr::core::vector3df B( Buffer->getVertexBuffer()[Buffer->getIndexBuffer()[a+1]].Pos );
            irr::core::vector3df C( Buffer->getVertexBuffer()[Buffer->getIndexBuffer()[a+2]].Pos );
            /// on calcule les 3 nouveaux points
            irr::core::vector3df D( irr::core::line3df(A, B).getMiddle().setLength(rayon) );
            irr::core::vector3df E( irr::core::line3df(B, C).getMiddle().setLength(rayon) );
            irr::core::vector3df F( irr::core::line3df(C, A).getMiddle().setLength(rayon) );
            /// on insère les 4 nouveaux triangles
            /// ADF
            VBuffer->push_back( irr::video::S3DVertex( A, irr::core::vector3df(0), color1, irr::core::vector2df(0,0)) );
            VBuffer->push_back( irr::video::S3DVertex( D, irr::core::vector3df(0), color1, irr::core::vector2df(0,1)) );
            VBuffer->push_back( irr::video::S3DVertex( F, irr::core::vector3df(0), color1, irr::core::vector2df(0.5,0.5)) );
            IBuffer->push_back( index ); IBuffer->push_back( index+1 ); IBuffer->push_back( index+2 );
            /// DBE
            VBuffer->push_back( irr::video::S3DVertex( D, irr::core::vector3df(0), color2, irr::core::vector2df(0,0)) );
            VBuffer->push_back( irr::video::S3DVertex( B, irr::core::vector3df(0), color2, irr::core::vector2df(0,1)) );
            VBuffer->push_back( irr::video::S3DVertex( E, irr::core::vector3df(0), color2, irr::core::vector2df(0.5,0.5)) );
            IBuffer->push_back( index+3 ); IBuffer->push_back( index+4 ); IBuffer->push_back( index+5 );
            /// FDE
            VBuffer->push_back( irr::video::S3DVertex( F, irr::core::vector3df(0), color3, irr::core::vector2df(0,0)) );
            VBuffer->push_back( irr::video::S3DVertex( D, irr::core::vector3df(0), color3, irr::core::vector2df(0,1)) );
            VBuffer->push_back( irr::video::S3DVertex( E, irr::core::vector3df(0), color3, irr::core::vector2df(0.5,0.5)) );
            IBuffer->push_back( index+6 ); IBuffer->push_back( index+7 ); IBuffer->push_back( index+8 );
            /// FEC
            VBuffer->push_back( irr::video::S3DVertex( F, irr::core::vector3df(0), color4, irr::core::vector2df(0,0)) );
            VBuffer->push_back( irr::video::S3DVertex( E, irr::core::vector3df(0), color4, irr::core::vector2df(0,1)) );
            VBuffer->push_back( irr::video::S3DVertex( C, irr::core::vector3df(0), color4, irr::core::vector2df(0.5,0.5)) );
            IBuffer->push_back( index+9 ); IBuffer->push_back( index+10 ); IBuffer->push_back( index+11 );

        }
        /// on change les buffers
        Buffer->setVertexBuffer( VBuffer );
        Buffer->setIndexBuffer( IBuffer );
    }
    /// on mets à jour les paramètres de création de la sphere
    Rayon = rayon;
    NbIterations = iterations;
    /// on met à jour la Bounding Box
    createBoundingBox();
    /// tout s'est bien passé on quitte
    return true;
}


irr::scene::CDynamicMeshBuffer* SphereIcosaUnlimited::getBuffer()
{
    return Buffer;
}

irr::video::SMaterial& SphereIcosaUnlimited::getMaterial()
{
    return Buffer->Material;
}

void SphereIcosaUnlimited::setMaterial(irr::video::SMaterial material)
{
    Buffer->Material = material;
}

irr::core::aabbox3df& SphereIcosaUnlimited::getBoundingBox()
{
    return BoundingBox;
}

void SphereIcosaUnlimited::setUseVBO(irr::scene::E_HARDWARE_MAPPING vbo)
{
        Buffer->getVertexBuffer().setHardwareMappingHint(vbo);
        Buffer->getIndexBuffer().setHardwareMappingHint(vbo);
}

void SphereIcosaUnlimited::createBoundingBox()
{
    BoundingBox = irr::core::aabbox3df( irr::core::vector3df(-Rayon), irr::core::vector3df(Rayon) );
}

Utilisation :
SMaterial blanc;
blanc.Lighting = false;

SphereIcosaUnlimited sphere(blanc, 1000, 8);
sphere.setUseVBO(EHM_STATIC);
CdynamicMeshBuffer* bufferessai32 = sphere.getBuffer();


// à mettre entre beginscene et endscene
Driver->drawMeshBuffer( SphereBuffer );

ATTENTION : Je ne l'ai pas précisé avant mais il faut libérer les buffers car ce n'est pas fait dans la classe.


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#3 

23-03-2012 22:46:20

Copland
Modérateurs
Date d'inscription:
Messages: 657
IP: 92.136.27.213
Courriel  Site web

Salut,
Tout simplement énorme ton code smile.
Je n'en aurai probablement pas l'utilité mais je serais curieux de savoir pourquoi tu as besoin de se type de mesh ?


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#4 

24-03-2012 08:26:09

johnplayer
Membres
Avatar de johnplayer
Date d'inscription:
Messages: 431
IP: 83.192.84.253
Courriel

La particularite de cette sphere est qu'elle est entièrement composée de triangles EQUILATERAUX. Le mesh est donc régulier, ce qui facilite les opérations de déformation du mesh. Par exemple si tu éloigne un vertex du centre de la sphère, tu obtiendras un pic bien arrondi. Avec des quads, il faudrait réagencer leurs diagonales pour qu'elles "suivent" le pic. Si tu n'as pas compris je te ferai un screen pour mieux expliquer.


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#5 

24-03-2012 08:47:58

tmyke
Administrateurs
Avatar de tmyke
Date d'inscription:
Messages: 1025
IP: 90.56.71.167
Courriel

Copland Ecris:

Salut,
Tout simplement énorme ton code smile.

je plussoie sur ce point, super ton code big_smile


Force et sagesse...

Hors ligne


#6 

24-03-2012 11:42:07

johnplayer
Membres
Avatar de johnplayer
Date d'inscription:
Messages: 431
IP: 83.192.84.253
Courriel

Merci pour les compliments.^^ Je travaille sur des fonctions de modification du mesh afin de pouvoir extruder, voir même faire un lod. Mais je vais d'abord retravailler la classe , il faudrait que suivant le nombre d'itérations la sphère soit divisée sur plusieurs buffers afin de ne pas limiter le nombre de triangles. Car les buffers 32bits ne sont pas compatibles avec toutes les cartes graphiques.
Sur ce, je repars coder. wink


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
116 invités en ligne
membre en ligne: -
RSS Feed