Jump to content

  • Log In with Google      Sign In   
  • Create Account

vexe

Member Since 18 May 2013
Offline Last Active Jul 04 2016 09:00 PM

Posts I've Made

In Topic: Quick tutorial: Variable width bitmap fonts

01 December 2015 - 03:54 PM

Hey Promit, thanks for the tutorial. Helped me out remove dependecy to the font rendering libs I was using.

 

I was just wondering what does it take to include the font size with the vertices calculations to set the size of the printed font? do I just multiply by the font set size for each line of vertices calculation? or do I just multiply with a scale matrix?

 

Also, there's other values in the font format such as "aa", "stretchH", "lineHeight", "padding", "spacing", "scaleH" and "scaleW". I'm not sure where exactly each one of those fit into the picture?

 

Here's my rendering code, maybe someone will find it useful - or could suggest a better way/improvements. Currently I'm dynamically allocating the vertices/uv buffers, maybe I should just set a max value instead, but anyways...

void FontRender(font_renderer *Renderer, font_set *Font)
{
    u32 NumChars = StringLength(Renderer->Text);
    u32 BufferSize = NumChars * 12 * sizeof(r32);
    
    if (!Renderer->Initialized)
    {
        glGenBuffers(1, &Renderer->VBO);
        glBindBuffer(GL_ARRAY_BUFFER, Renderer->VBO);
        glBufferData(GL_ARRAY_BUFFER, BufferSize * 2, 0, GL_DYNAMIC_DRAW);

        glGenVertexArrays(1, &Renderer->VAO);
        glBindVertexArray(Renderer->VAO);
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(0, 2, GL_FLOAT, 0, 0, 0);
        glEnableVertexAttribArray(1);
        glVertexAttribPointer(1, 2, GL_FLOAT, 0, 0, (void *)BufferSize);

        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindVertexArray(0);

        Renderer->Initialized = 1;
    }

    r32 *VertPos = Calloc(NumChars * 12, r32);
    r32 *VertUV = Calloc(NumChars * 12, r32);

    For(u32, i, NumChars)
    {
        font_character Character = Font->Characters[Renderer->Text[i] - 32];
        r32 X = Character.X;
        r32 Y = Character.Y;
        r32 XOffset = Character.XOffset;
        r32 YOffset = Character.YOffset;
        r32 XAdvance = Character.XAdvance;
        r32 Width = Character.Width;
        r32 Height = Character.Height;

        // Triangle 1
        {
            // Top Left
            VertPos[i * 12] = Renderer->CurrentX + XOffset;
            VertPos[i * 12 + 1] = YOffset;

            // Bottom Left
            VertPos[i * 12 + 2] = Renderer->CurrentX + XOffset;
            VertPos[i * 12 + 3] = YOffset + Height;

            // Bottom Right
            VertPos[i * 12 + 4] = Renderer->CurrentX + XOffset + Width;
            VertPos[i * 12 + 5] = YOffset + Height;
        }

        // Triangle 2
        {
            // Bottom Right
            VertPos[i * 12 + 6] = VertPos[i * 12 + 4];
            VertPos[i * 12 + 7] = VertPos[i * 12 + 5];

            // Top Right
            VertPos[i * 12 + 8] = Renderer->CurrentX + XOffset + Width;
            VertPos[i * 12 + 9] = YOffset;

            // Top Left
            VertPos[i * 12 + 10] = VertPos[i * 12];
            VertPos[i * 12 + 11] = VertPos[i * 12 + 1];
        }

        // UV 1
        {
            // Top left
            VertUV[i * 12] = X / Font->Width;
            VertUV[i * 12 + 1] = Y / Font->Height;

            // Bottom left
            VertUV[i * 12 + 2] = X / Font->Width;
            VertUV[i * 12 + 3] = (Y + Height) / Font->Height;

            // Bottom right
            VertUV[i * 12 + 4] = (X + Width) / Font->Width;
            VertUV[i * 12 + 5] = (Y + Height) / Font->Height;
        }

        // UV 2
        {
            // Bottom right
            VertUV[i * 12 + 6] = VertUV[i * 12 + 4];
            VertUV[i * 12 + 7] = VertUV[i * 12 + 5];

            // Top right
            VertUV[i * 12 + 8] = (X + Width) / Font->Width;
            VertUV[i * 12 + 9] = Y / Font->Height;

            // Top left
            VertUV[i * 12 + 10] = VertUV[i * 12 ];
            VertUV[i * 12 + 11] = VertUV[i * 12 + 1];
        }

        Renderer->CurrentX += Character.XAdvance;
    }

    glBindBuffer(GL_ARRAY_BUFFER, Renderer->VBO);
    u32 Offset = 0;
    glBufferSubData(GL_ARRAY_BUFFER, Offset, BufferSize, VertPos);
    Offset += BufferSize;
    glBufferSubData(GL_ARRAY_BUFFER, Offset, BufferSize, VertUV);

    m4 FontProjection = Orthographic(0, 800, 600, 0, -1, +1);

    glDisable(GL_DEPTH_TEST);
    ShaderUse(Renderer->Shader);
    glBindVertexArray(Renderer->VAO);
    TextureBind(Font->Atlas);
    ShaderSetV3(Renderer->Shader, "Color", Renderer->Color);
    ShaderSetM4(Renderer->Shader, "Projection", &FontProjection);
    glDrawArrays(GL_TRIANGLES, 0, NumChars * 6);
    
    free(VertPos);
    free(VertUV);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);
}

In Topic: Becoming a game engine programmer

16 November 2015 - 01:47 AM

Check out handmade hero if you're into game engine programming. Builds the exact mentality that you're aiming for https://handmadehero.org/ - I learned a TON from Casey,

 


In Topic: FSMs vs Behaviour trees in gameplay programming?

16 June 2014 - 12:20 AM

Thanks for your fast reply. Yes I also read that you could plug a FSM in a BT, but I'm wondering if a FSM can be represented as a BT - More specifically, I'm wondering if the tiger statue puzzle i mentioned in my original question can be somehow a BT instead of an FSM, does it make sense? or a FSM is more suited for these types of things? (in my game I have much more similar triggers to that one I mentioned, they change state - you interact with them once, they do A, interact with them in a different way they do B, etc. so I'm wondering if using a BT is better here than an FSM...) Thank you.


In Topic: UDK VS Unity3D in making a classical ResidentEvil-like game?

18 May 2013 - 07:07 PM

I don't have a problem getting Unity Pro if that covers the LOD thing you mentioned - but I just need to make sure that Unity can do it all - like for example how to setup the pre-rendered backgrounds with 3D character models and have them drop shadows. Thanks for the answer but I was hoping for something with a bit more details.


In Topic: Problem with Unity 4.1.2

18 May 2013 - 04:53 AM

You have to provide some more details, like what's the spces of your comp, what's the error message, etc.


PARTNERS