Changeset 1249


Ignore:
Timestamp:
Apr 21, 2012, 2:31:05 PM (8 years ago)
Author:
sam
Message:

orbital: the mesh builder is now almost operational! vertex colour doesn't
seem to work yet.

Location:
trunk/orbital
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/orbital/mesh.h

    r1245 r1249  
    2323    }
    2424
     25    void MeshConvert()
     26    {
     27        m_gpu.shader = Shader::Create(
     28#if !defined __CELLOS_LV2__ && !defined _XBOX && !defined USE_D3D9
     29            "#version 120\n"
     30            "attribute vec3 in_Vertex;"
     31            "attribute vec3 in_Normal;"
     32            "attribute vec4 in_Color;"
     33            "uniform mat4 in_Matrix;"
     34            "varying vec4 pass_Color;"
     35            ""
     36            "void main(void) {"
     37            "    gl_Position = in_Matrix * vec4(in_Vertex, 1.0);"
     38            "    pass_Color = in_Color;"
     39            "}",
     40
     41            "#version 120\n"
     42            "varying vec4 pass_Color;"
     43            ""
     44            "void main(void) {"
     45            "    gl_FragColor = pass_Color;"
     46            "}"
     47#else
     48            "void main(float3 in_Vertex : POSITION,"
     49            "          float3 in_Normal : NORMAL,"
     50            "          float4 in_Color : COLOR,"
     51            "          uniform float4x4 in_Matrix,"
     52            "          out float4 out_Position : POSITION,"
     53            "          out float4 pass_Color : COLOR) {"
     54            "    pass_Color = in_Color;"
     55            "    out_Position = mul(in_Matrix, float4(in_Vertex, 1.0));"
     56            "}",
     57
     58            "void main(float4 pass_Color : COLOR,"
     59            "          out float4 out_FragColor : COLOR) {"
     60            "    out_FragColor = pass_Color;"
     61            "}"
     62#endif
     63        );
     64        m_gpu.mvp = m_gpu.shader->GetUniformLocation("in_Matrix");
     65        m_gpu.coord = m_gpu.shader->GetAttribLocation("in_Vertex",
     66                                              VertexUsage::Position, 0);
     67        m_gpu.norm = m_gpu.shader->GetAttribLocation("in_Normal",
     68                                             VertexUsage::Normal, 0);
     69        m_gpu.color = m_gpu.shader->GetAttribLocation("in_Color",
     70                                              VertexUsage::Color, 0);
     71
     72        m_gpu.vdecl = new VertexDeclaration(
     73            VertexStream<vec3,vec3,u8vec4>(VertexUsage::Position,
     74                                           VertexUsage::Normal,
     75                                           VertexUsage::Color));
     76
     77        Array<vec3,vec3,u8vec4> vertexlist;
     78        for (int i = 0; i < m_vert.Count(); i++)
     79            vertexlist.Append(m_vert[i].m1,
     80                              m_vert[i].m2,
     81                              (u8vec4)(m_vert[i].m3 * 255.f));
     82
     83        Array<uint16_t> indexlist;
     84        for (int i = 0; i < m_triidx.Count(); i += 3)
     85        {
     86            indexlist += m_triidx[i + 2];
     87            indexlist += m_triidx[i + 1];
     88            indexlist += m_triidx[i + 0];
     89        }
     90        for (int i = 0; i < m_quadidx.Count(); i += 3)
     91        {
     92            indexlist += m_quadidx[i + 2];
     93            indexlist += m_quadidx[i + 1];
     94            indexlist += m_quadidx[i + 0];
     95
     96            indexlist += m_quadidx[i + 3];
     97            indexlist += m_quadidx[i + 2];
     98            indexlist += m_quadidx[i + 0];
     99        }
     100
     101        m_gpu.vbo = new VertexBuffer(vertexlist.Bytes());
     102        void *mesh = m_gpu.vbo->Lock(0, 0);
     103        memcpy(mesh, &vertexlist[0], vertexlist.Bytes());
     104        m_gpu.vbo->Unlock();
     105
     106        m_gpu.ibo = new IndexBuffer(indexlist.Bytes());
     107        void *indices = m_gpu.ibo->Lock(0, 0);
     108        memcpy(indices, &indexlist[0], indexlist.Bytes());
     109        m_gpu.ibo->Unlock();
     110
     111        m_gpu.vertexcount = vertexlist.Count();
     112        m_gpu.indexcount = indexlist.Count();
     113    }
     114
     115    void Render(mat4 const &mvp)
     116    {
     117        m_gpu.shader->Bind();
     118        m_gpu.shader->SetUniform(m_gpu.mvp, mvp);
     119        m_gpu.vdecl->SetStream(m_gpu.vbo, m_gpu.coord, m_gpu.norm, m_gpu.color);
     120        m_gpu.vdecl->Bind();
     121        m_gpu.ibo->Bind();
     122        m_gpu.vdecl->DrawIndexedElements(MeshPrimitive::Triangles,
     123                                         0, 0, m_gpu.vertexcount,
     124                                         0, m_gpu.indexcount / 3);
     125        m_gpu.ibo->Unbind();
     126        m_gpu.vdecl->Unbind();
     127    }
     128
    25129    void SetCurColor(vec4 const &color) { m_color = color; }
    26130    void SetCurColor2(vec4 const &color) { m_color2 = color; }
     
    28132    void AppendQuadVert(vec3 const &coord)
    29133    {
    30         m_vert.Append(coord, vec3(0.0f, 1.0f, 0.0f), m_color);
     134        m_vert.Append(coord, vec3(0.f, 1.f, 0.f), m_color);
    31135    }
    32136
    33137    void AppendDuplicateQuadVert(int i)
    34138    {
    35         m_vert.Append(m_vert[i].m1, vec3(0.0f, 1.0f, 0.0f), m_vert[i].m3);
     139        m_vert.Append(m_vert[i].m1, vec3(0.f, 1.f, 0.f), m_vert[i].m3);
    36140    }
    37141
     
    123227        mat4 m = mat4::rotate(t, 0, 0, 1);
    124228        for (int i = m_vert_cursor; i < m_vert.Count(); i++)
    125             m_vert[i].m1 = (m * vec4(m_vert[i].m1, 1.0)).xyz;
     229            m_vert[i].m1 = (m * vec4(m_vert[i].m1, 1.f)).xyz;
    126230    }
    127231
     
    130234        mat4 m = mat4::rotate(t, 0, 1, 0);
    131235        for (int i = m_vert_cursor; i < m_vert.Count(); i++)
    132             m_vert[i].m1 = (m * vec4(m_vert[i].m1, 1.0)).xyz;
     236            m_vert[i].m1 = (m * vec4(m_vert[i].m1, 1.f)).xyz;
    133237    }
    134238
     
    137241        mat4 m = mat4::rotate(t, 1, 0, 0);
    138242        for (int i = m_vert_cursor; i < m_vert.Count(); i++)
    139             m_vert[i].m1 = (m * vec4(m_vert[i].m1, 1.0)).xyz;
     243            m_vert[i].m1 = (m * vec4(m_vert[i].m1, 1.f)).xyz;
    140244    }
    141245
     
    144248        for (int i = m_vert_cursor; i < m_vert.Count(); i++)
    145249        {
    146             m_vert[i].m1.y *= 1.0f + (y * m_vert[i].m1.x + xoff);
    147             m_vert[i].m1.z *= 1.0f + (z * m_vert[i].m1.x + xoff);
     250            m_vert[i].m1.y *= 1.f + (y * m_vert[i].m1.x + xoff);
     251            m_vert[i].m1.z *= 1.f + (z * m_vert[i].m1.x + xoff);
    148252        }
    149253    }
     
    153257        for (int i = m_vert_cursor; i < m_vert.Count(); i++)
    154258        {
    155             m_vert[i].m1.x *= 1.0f + (x * m_vert[i].m1.y + yoff);
    156             m_vert[i].m1.z *= 1.0f + (z * m_vert[i].m1.y + yoff);
     259            m_vert[i].m1.x *= 1.f + (x * m_vert[i].m1.y + yoff);
     260            m_vert[i].m1.z *= 1.f + (z * m_vert[i].m1.y + yoff);
    157261        }
    158262    }
     
    162266        for (int i = m_vert_cursor; i < m_vert.Count(); i++)
    163267        {
    164             m_vert[i].m1.x *= 1.0f + (x * m_vert[i].m1.z + zoff);
    165             m_vert[i].m1.y *= 1.0f + (y * m_vert[i].m1.z + zoff);
     268            m_vert[i].m1.x *= 1.f + (x * m_vert[i].m1.z + zoff);
     269            m_vert[i].m1.y *= 1.f + (y * m_vert[i].m1.z + zoff);
    166270        }
    167271    }
     
    219323    void AppendBox(vec3 const &size)
    220324    {
    221         AppendBox(size, 0.0f);
     325        AppendBox(size, 0.f);
    222326    }
    223327
     
    274378    Array<vec3, vec3, vec4> m_vert;
    275379    int m_vert_cursor, m_quadidx_cursor, m_triidx_cursor;
     380
     381    struct
     382    {
     383        Shader *shader;
     384        ShaderAttrib coord, norm, color;
     385        ShaderUniform mvp;
     386        VertexDeclaration *vdecl;
     387        VertexBuffer *vbo;
     388        IndexBuffer *ibo;
     389        int vertexcount, indexcount;
     390    }
     391    m_gpu;
    276392};
    277393
  • trunk/orbital/orbital.cpp

    r1245 r1249  
    1818
    1919#include "core.h"
    20 #include "debug/fps.h"
     20#include "loldebug.h"
    2121
    2222using namespace std;
     
    2828Orbital::Orbital()
    2929{
     30    m.SetCurColor(vec4(1.0, 1.0, 0.0, 1.0));
    3031    m.AppendBox(vec3(1.0, 1.0, 1.0));
     32    m.Duplicate();
     33    m.RotateX(45);
    3134    m.Flush();
     35
     36    m_angle = 0;
     37
     38    m_ready = false;
    3239}
    3340
     
    3542{
    3643    WorldEntity::TickGame(deltams);
     44
     45    m_angle += deltams / 1000.0f * 90.0f;
     46
     47    mat4 anim = mat4::rotate(m_angle, vec3(0, 1, 0))
     48              * mat4::rotate(m_angle * 0.25, vec3(0, 0, 1));
     49    mat4 model = mat4::translate(vec3(0, 0, -4.5));
     50    mat4 view = mat4::lookat(vec3(0, 2, 0), vec3(0, 0, -4), vec3(0, 1, 0));
     51    mat4 proj = mat4::perspective(45.0f, 640.0f, 480.0f, 0.1f, 10.0f);
     52
     53    m_matrix = proj * view * model * anim;
    3754}
    3855
     
    4057{
    4158    WorldEntity::TickDraw(deltams);
     59
     60    if (!m_ready)
     61    {
     62        m.MeshConvert();
     63
     64        /* FIXME: this object never cleans up */
     65        m_ready = true;
     66    }
     67
     68    m.Render(m_matrix);
    4269}
    4370
     
    4976int main(int argc, char **argv)
    5077{
    51     Application app("Orbital", ivec2(1024,576), 60.0f);
     78    Application app("Orbital", ivec2(800, 600), 60.0f);
    5279
    53 #if defined _WIN32 && !defined _XBOX
    54     _chdir(".."); /* Temporary Win32 hack */
     80#if defined _MSC_VER && !defined _XBOX
     81    _chdir("..");
     82#elif defined _WIN32 && !defined _XBOX
     83    _chdir("../..");
    5584#endif
    5685
    57     new DebugFps(2, 370);
     86    new DebugFps(5, 5);
    5887    new Orbital();
    5988    app.ShowPointer(false);
     89
    6090    app.Run();
    6191
  • trunk/orbital/orbital.h

    r1245 r1249  
    1818private:
    1919    Mesh m;
     20    float m_angle;
     21    mat4 m_matrix;
     22
     23    bool m_ready;
    2024};
    2125
Note: See TracChangeset for help on using the changeset viewer.