summaryrefslogtreecommitdiff
path: root/code/game.cpp
blob: c829ee64211e782eb913d44db609bd013a53aebb (plain) (blame)
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
// NOTE(luca): Image buffer format is AA BB GG RR

#include "game.h"

#define WIDTH (1920/2)
#define HEIGHT (1080/2)
#define BYTES_PER_PIXEL 4

//~ Libraries
#de,fine STB_SPRINTF_IMPLEMENTATION
#include "libs/stb_sprintf.h"
#include "libs/handmade_math.h"

//~ Global variables
// From WASM
extern u8 __heap_base;

// From Linker
extern u8 jetbrains_mono_regular_ttf[];

// Memory
psize BumpPointer = (psize)&__heap_base;
psize BumpAllocated = 0;

// Image
u8 GlobalImageBuffer[WIDTH*HEIGHT*BYTES_PER_PIXEL];

//~ Functions
//- Platform (js) 
#define external extern "C"
external void LogMessage(u32 Length, char* message);
#define S_Len(String) (sizeof(String) - 1), (String)

external r32 floor(r32 X);
external r32 ceil(r32 X);
external r32 sqrt(r32 X);
external r32 pow(r32 X, r32 Y);
external r32 fmod(r32 X, r32 Y);
external r32 cos(r32 X);
external r32 acos(r32 X);
external r32 fabs(r32 X);
external r32 round(r32 X);

//- Memory
void* Malloc(psize Size)
{
    psize Result = BumpPointer + BumpAllocated;
    BumpAllocated += Size;
    
    return (void *)Result;
}

void Free(void *Memory)
{
    
#if 0    
    u32 Size = (psize)Memory;
    BumpAllocated -= Size;
#endif
    
}

//- Game
external u32 GetBufferWidth() { return WIDTH; }
external u32 GetBufferHeight() { return HEIGHT; }
external u32 GetBytesPerPixel() { return BYTES_PER_PIXEL; }

void Logf(char *Format, ...)
{
    char MessageBuffer[256] = {0};
    
    va_list Args;
    va_start(Args, Format);
    u32 MessageLength = stbsp_vsprintf(MessageBuffer, Format, Args);
    
    LogMessage(MessageLength, MessageBuffer);
}

void 
RenderRectangle(u8 *Buffer, s32 Pitch, s32 Width, s32 Height, s32 BytesPerPixel,
                s32 MinX, s32 MinY, s32 MaxX, s32 MaxY, u32 Color)
{
    if(MinX < 0)
    {
        MinX = 0;
    }
    
    if(MaxX > Width)
    {
        MaxX = Width;
    }
    
    if(MinY < 0)
    {
        MinY = 0;
    }
    
    if(MaxY > Height)
    {
        MaxY = Height;
    }
    
    u8 *Row = ((u8 *)Buffer) + ((BytesPerPixel*MinX) + (Pitch*MinY));
    
    for(s32 Y = MinY;
        Y < MaxY;
        Y++)
    {
        u32 *Pixel = (u32 *)Row;
        for(s32 X = MinX;
            X < MaxX;
            X++)
        {
            *Pixel++ = Color;
        }
        Row += Pitch;
    }
}

external void 
UpdateAndRender(s32 Width, s32 Height, s32 BytesPerPixel, 
                r32 dtForFrame, b32 MouseDown, s32 MouseX, s32 MouseY)
{
    u8 *Buffer = GlobalImageBuffer;
    u32 Pitch = BytesPerPixel * Width;
    
#if 0    
    game_offscreen_buffer OffscreenBuffer = {};
    OffscreenBuffer.Pitch = Pitch;
    OffscreenBuffer.BytesPerPixel = BytesPerPixel;
    OffscreenBuffer.Width = Width;
    OffscreenBuffer.Height = Height;
    OffscreenBuffer.Memory = GlobalImageBuffer;
#endif
    
    local_persist b32 MemoryInitialized = false;
    if(!MemoryInitialized)
    {
#if 0
        InitFontFromBuffer(&GlobalFont, (char *)data_font_ttf);
#endif
        
        MemoryInitialized = true;
    }
    
#if 1
    // Clear the buffer to black.
    {    
        u32 *Clear = (u32 *)Buffer;
        s32 ClearSize = Width*Height;
        while(ClearSize--) *Clear++ = 0xFF000000;
    }
#endif
    
    u32 Color = 0;
    if(MouseDown)
    {
        Color = 0xFF00FF;
    }
    
    v2 Min = {};
    
    s32 ColumnsCount = 6;
    
    s32 ColumnWidth = Width/ColumnsCount;
    
    b32 Toggle = true;
    for(s32 ColumnIndex = 0;
        ColumnIndex < ColumnsCount;
        ColumnIndex++)
    {
        s32 ColumnMinX = ColumnIndex*ColumnWidth;
        s32 ColumnMinY = 0;
        s32 ColumnMaxX = (1 + ColumnIndex)*ColumnWidth;
        s32 ColumnMaxY = Height;
        
        s32 ColumnWidth = ColumnMaxX - ColumnMinX;
        s32 ColumnHeight = ColumnMaxY - ColumnMinY;
        
        u32 Color = (Toggle) ? 0xFF333333 : 0xFF888888;
        
#if 1        
        RenderRectangle(Buffer, Pitch, Width, Height, BytesPerPixel,
                        ColumnMinX, ColumnMinY, ColumnMaxX, ColumnMaxY, Color);
#endif
        // Draw a button
        {        
            s32 Height = 0.10*ColumnHeight;
            s32 HMargin = 0.05*ColumnWidth;
            s32 MinX = ColumnMinX + HMargin;
            s32 MaxX = ColumnMaxX - HMargin;
            s32 MinY = ColumnMinY + 10;
            s32 MaxY = MinY + Height;
            
            b32 Selected = ((MouseX >= MinX && MouseX <= MaxX) &&
                            (MouseY >= MinY && MouseY <= MaxY));
            
            u32 Color = ((Selected) ? 
                         ((MouseDown) ? 0xFFBBBBBB : 0xFFCCCCCC) :
                         0xFFEEEEEE);
            
            if(Selected && MouseDown)
            {
                LogMessage(S_Len("Clicked"));
            }
            
            RenderRectangle(Buffer, Pitch, Width, Height, BytesPerPixel, 
                            MinX, MinY, MaxX, MaxY,
                            Color);
        }
        
        Toggle = !Toggle;
    }
    
    
#if 0    
    // Draw mouse pointer
    {    
        s32 Size = 5;
        s32 MinX = MouseX - Size;
        s32 MaxX = MouseX + Size;
        s32 MinY = MouseY - Size;
        s32 MaxY = MouseY + Size;
        RenderRectangle(Buffer, Pitch, Width, Height, BytesPerPixel, 
                        MinX, MinY, MaxX, MaxY, Color);
    }
#endif
    
#if 1    
    Logf("(%d, %d) / %s", 
         MouseX, MouseY, ((MouseDown) ? "down" : "up"));
#endif
    
}