Change naming convention, merge texture/shaders
Reduce the number of files in project by merging texture and shaders into assets/renderer file. It's better to keep code local to where it is rather than splitting them into "self-contained modules". It becomes easier to understand reading top-to-bottom and there's is less jumping around which can increase the difficulty of comprehending the code. Convert names to use more of a <namespace>_<object><Action> format.
This commit is contained in:
parent
2fb2e6db5b
commit
6df92e7aed
@ -130,10 +130,8 @@
|
|||||||
<ClCompile Include="src\MemoryArena.c" />
|
<ClCompile Include="src\MemoryArena.c" />
|
||||||
<ClCompile Include="src\Platform.c" />
|
<ClCompile Include="src\Platform.c" />
|
||||||
<ClCompile Include="src\Renderer.c" />
|
<ClCompile Include="src\Renderer.c" />
|
||||||
<ClCompile Include="src\Shader.c" />
|
|
||||||
<ClCompile Include="src\String.c" />
|
<ClCompile Include="src\String.c" />
|
||||||
<ClCompile Include="src\UserInterface.c" />
|
<ClCompile Include="src\Ui.c" />
|
||||||
<ClCompile Include="src\Texture.c" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="data\shaders\default.frag.glsl" />
|
<None Include="data\shaders\default.frag.glsl" />
|
||||||
@ -155,10 +153,8 @@
|
|||||||
<ClInclude Include="src\include\Dengine\Math.h" />
|
<ClInclude Include="src\include\Dengine\Math.h" />
|
||||||
<ClInclude Include="src\include\Dengine\OpenGL.h" />
|
<ClInclude Include="src\include\Dengine\OpenGL.h" />
|
||||||
<ClInclude Include="src\include\Dengine\Renderer.h" />
|
<ClInclude Include="src\include\Dengine\Renderer.h" />
|
||||||
<ClInclude Include="src\include\Dengine\Shader.h" />
|
|
||||||
<ClInclude Include="src\include\Dengine\String.h" />
|
<ClInclude Include="src\include\Dengine\String.h" />
|
||||||
<ClInclude Include="src\include\Dengine\Texture.h" />
|
<ClInclude Include="src\include\Dengine\Ui.h" />
|
||||||
<ClInclude Include="src\include\Dengine\UserInterface.h" />
|
|
||||||
<ClInclude Include="src\include\Dengine\WorldTraveller.h" />
|
<ClInclude Include="src\include\Dengine\WorldTraveller.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
@ -15,12 +15,6 @@
|
|||||||
</Filter>
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="src\Texture.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="src\Shader.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="src\Renderer.c">
|
<ClCompile Include="src\Renderer.c">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@ -42,9 +36,6 @@
|
|||||||
<ClCompile Include="src\dengine.c">
|
<ClCompile Include="src\dengine.c">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="src\UserInterface.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="src\String.c">
|
<ClCompile Include="src\String.c">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@ -57,6 +48,9 @@
|
|||||||
<ClCompile Include="src\Entity.c">
|
<ClCompile Include="src\Entity.c">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\Ui.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="data\shaders\default.vert.glsl" />
|
<None Include="data\shaders\default.vert.glsl" />
|
||||||
@ -68,15 +62,9 @@
|
|||||||
<ClInclude Include="src\include\Dengine\Common.h">
|
<ClInclude Include="src\include\Dengine\Common.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="src\include\Dengine\Shader.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="src\include\Dengine\OpenGL.h">
|
<ClInclude Include="src\include\Dengine\OpenGL.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="src\include\Dengine\Texture.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="src\include\Dengine\AssetManager.h">
|
<ClInclude Include="src\include\Dengine\AssetManager.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@ -107,9 +95,6 @@
|
|||||||
<ClInclude Include="src\include\Dengine\WorldTraveller.h">
|
<ClInclude Include="src\include\Dengine\WorldTraveller.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="src\include\Dengine\UserInterface.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="src\include\Dengine\String.h">
|
<ClInclude Include="src\include\Dengine\String.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@ -119,5 +104,8 @@
|
|||||||
<ClInclude Include="src\include\Dengine\Entity.h">
|
<ClInclude Include="src\include\Dengine\Entity.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="src\include\Dengine\Ui.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
@ -22,6 +22,83 @@
|
|||||||
#include "Dengine/OpenGL.h"
|
#include "Dengine/OpenGL.h"
|
||||||
#include "Dengine/Platform.h"
|
#include "Dengine/Platform.h"
|
||||||
|
|
||||||
|
enum BytesPerPixel
|
||||||
|
{
|
||||||
|
bytesPerPixel_Greyscale = 1,
|
||||||
|
bytesPerPixel_GreyscaleAlpha = 2,
|
||||||
|
bytesPerPixel_RGB = 3,
|
||||||
|
bytesPerPixel_RGBA = 4,
|
||||||
|
};
|
||||||
|
|
||||||
|
INTERNAL GLint getGLFormat(i32 bytesPerPixel, b32 srgb)
|
||||||
|
{
|
||||||
|
switch (bytesPerPixel)
|
||||||
|
{
|
||||||
|
case bytesPerPixel_Greyscale:
|
||||||
|
return GL_LUMINANCE;
|
||||||
|
case bytesPerPixel_GreyscaleAlpha:
|
||||||
|
return GL_LUMINANCE_ALPHA;
|
||||||
|
case bytesPerPixel_RGB:
|
||||||
|
return (srgb ? GL_SRGB : GL_RGB);
|
||||||
|
case bytesPerPixel_RGBA:
|
||||||
|
return (srgb ? GL_SRGB_ALPHA : GL_RGBA);
|
||||||
|
default:
|
||||||
|
// TODO(doyle): Invalid
|
||||||
|
// std::cout << "getGLFormat() invalid bytesPerPixel: "
|
||||||
|
// << bytesPerPixel << std::endl;
|
||||||
|
return GL_LUMINANCE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Texture textureGen(const GLuint width, const GLuint height,
|
||||||
|
const GLint bytesPerPixel, const u8 *const image)
|
||||||
|
{
|
||||||
|
// TODO(doyle): Let us set the parameters gl params as well
|
||||||
|
GL_CHECK_ERROR();
|
||||||
|
Texture tex = {0};
|
||||||
|
tex.width = width;
|
||||||
|
tex.height = height;
|
||||||
|
tex.internalFormat = GL_RGBA;
|
||||||
|
tex.wrapS = GL_REPEAT;
|
||||||
|
tex.wrapT = GL_REPEAT;
|
||||||
|
tex.filterMinification = GL_NEAREST;
|
||||||
|
tex.filterMagnification = GL_NEAREST;
|
||||||
|
|
||||||
|
glGenTextures(1, &tex.id);
|
||||||
|
GL_CHECK_ERROR();
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_2D, tex.id);
|
||||||
|
GL_CHECK_ERROR();
|
||||||
|
|
||||||
|
/* Load image into texture */
|
||||||
|
// TODO(doyle) Figure out the gl format
|
||||||
|
tex.imageFormat = getGLFormat(bytesPerPixel, FALSE);
|
||||||
|
ASSERT(tex.imageFormat == GL_RGBA);
|
||||||
|
|
||||||
|
GL_CHECK_ERROR();
|
||||||
|
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, tex.internalFormat, tex.width, tex.height, 0,
|
||||||
|
tex.imageFormat, GL_UNSIGNED_BYTE, image);
|
||||||
|
GL_CHECK_ERROR();
|
||||||
|
|
||||||
|
// TODO(doyle): Not needed for sprites? glGenerateMipmap(GL_TEXTURE_2D);
|
||||||
|
|
||||||
|
/* Set parameter of currently bound texture */
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, tex.wrapS);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, tex.wrapT);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
|
||||||
|
tex.filterMinification);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
|
||||||
|
tex.filterMagnification);
|
||||||
|
GL_CHECK_ERROR();
|
||||||
|
|
||||||
|
/* Unbind and clean up */
|
||||||
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
GL_CHECK_ERROR();
|
||||||
|
|
||||||
|
return tex;
|
||||||
|
}
|
||||||
|
|
||||||
void asset_init(AssetManager *assetManager, MemoryArena_ *arena)
|
void asset_init(AssetManager *assetManager, MemoryArena_ *arena)
|
||||||
{
|
{
|
||||||
i32 texAtlasEntries = 8;
|
i32 texAtlasEntries = 8;
|
||||||
@ -41,8 +118,8 @@ void asset_init(AssetManager *assetManager, MemoryArena_ *arena)
|
|||||||
|
|
||||||
/* Create empty 1x1 4bpp black texture */
|
/* Create empty 1x1 4bpp black texture */
|
||||||
u32 bitmap = (0xFF << 24) | (0xFF << 16) | (0xFF << 8) | (0xFF << 0);
|
u32 bitmap = (0xFF << 24) | (0xFF << 16) | (0xFF << 8) | (0xFF << 0);
|
||||||
Texture *tex = asset_getFreeTexSlot(assetManager, arena, "nullTex");
|
Texture *tex = asset_texGetFreeSlot(assetManager, arena, "nullTex");
|
||||||
*tex = texture_gen(1, 1, 4, CAST(u8 *)(&bitmap));
|
*tex = textureGen(1, 1, 4, CAST(u8 *)(&bitmap));
|
||||||
|
|
||||||
i32 audioEntries = 32;
|
i32 audioEntries = 32;
|
||||||
assetManager->audio.size = audioEntries;
|
assetManager->audio.size = audioEntries;
|
||||||
@ -128,7 +205,7 @@ INTERNAL SubTexture *getFreeAtlasSubTexSlot(TexAtlas *const atlas,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const SubTexture asset_getAtlasSubTex(TexAtlas *const atlas, const char *const key)
|
const SubTexture asset_atlasGetSubTex(TexAtlas *const atlas, const char *const key)
|
||||||
{
|
{
|
||||||
|
|
||||||
HashTableEntry *entry = getEntryFromHash(&atlas->subTex, key);
|
HashTableEntry *entry = getEntryFromHash(&atlas->subTex, key);
|
||||||
@ -140,11 +217,11 @@ const SubTexture asset_getAtlasSubTex(TexAtlas *const atlas, const char *const k
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_LOG("asset_getAtlasSubTex() failed: Sub texture does not exist");
|
DEBUG_LOG("asset_atlasGetSubTex() failed: Sub texture does not exist");
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Texture *asset_getTex(AssetManager *const assetManager, const char *const key)
|
Texture *asset_texGet(AssetManager *const assetManager, const char *const key)
|
||||||
{
|
{
|
||||||
HashTableEntry *entry = getEntryFromHash(&assetManager->textures, key);
|
HashTableEntry *entry = getEntryFromHash(&assetManager->textures, key);
|
||||||
|
|
||||||
@ -154,7 +231,7 @@ Texture *asset_getTex(AssetManager *const assetManager, const char *const key)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
TexAtlas *asset_getFreeTexAtlasSlot(AssetManager *const assetManager,
|
TexAtlas *asset_atlasGetFreeSlot(AssetManager *const assetManager,
|
||||||
MemoryArena_ *arena, const char *const key,
|
MemoryArena_ *arena, const char *const key,
|
||||||
i32 numSubTex)
|
i32 numSubTex)
|
||||||
{
|
{
|
||||||
@ -191,7 +268,7 @@ TexAtlas *asset_getFreeTexAtlasSlot(AssetManager *const assetManager,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TexAtlas *asset_getTexAtlas(AssetManager *const assetManager,
|
TexAtlas *asset_atlasGet(AssetManager *const assetManager,
|
||||||
const char *const key)
|
const char *const key)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -204,7 +281,7 @@ TexAtlas *asset_getTexAtlas(AssetManager *const assetManager,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Texture *asset_getFreeTexSlot(AssetManager *const assetManager,
|
Texture *asset_texGetFreeSlot(AssetManager *const assetManager,
|
||||||
MemoryArena_ *const arena, const char *const key)
|
MemoryArena_ *const arena, const char *const key)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -223,7 +300,7 @@ Texture *asset_getFreeTexSlot(AssetManager *const assetManager,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Texture *asset_loadTextureImage(AssetManager *assetManager, MemoryArena_ *arena,
|
Texture *asset_texLoadImage(AssetManager *assetManager, MemoryArena_ *arena,
|
||||||
const char *const path, const char *const key)
|
const char *const path, const char *const key)
|
||||||
{
|
{
|
||||||
/* Open the texture image */
|
/* Open the texture image */
|
||||||
@ -236,7 +313,7 @@ Texture *asset_loadTextureImage(AssetManager *assetManager, MemoryArena_ *arena,
|
|||||||
if (imgWidth != imgHeight)
|
if (imgWidth != imgHeight)
|
||||||
{
|
{
|
||||||
printf(
|
printf(
|
||||||
"asset_loadTextureImage() warning: Sprite sheet is not square: "
|
"asset_texLoadImage() warning: Sprite sheet is not square: "
|
||||||
"%dx%dpx\n", imgWidth, imgHeight);
|
"%dx%dpx\n", imgWidth, imgHeight);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -247,8 +324,8 @@ Texture *asset_loadTextureImage(AssetManager *assetManager, MemoryArena_ *arena,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
Texture *result = asset_getFreeTexSlot(assetManager, arena, key);
|
Texture *result = asset_texGetFreeSlot(assetManager, arena, key);
|
||||||
*result = texture_gen(CAST(GLuint)(imgWidth), CAST(GLuint)(imgHeight),
|
*result = textureGen(CAST(GLuint)(imgWidth), CAST(GLuint)(imgHeight),
|
||||||
CAST(GLint)(bytesPerPixel), image);
|
CAST(GLint)(bytesPerPixel), image);
|
||||||
|
|
||||||
GL_CHECK_ERROR();
|
GL_CHECK_ERROR();
|
||||||
@ -280,7 +357,7 @@ INTERNAL Animation *getFreeAnimationSlot(AssetManager *const assetManager,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void asset_addAnimation(AssetManager *const assetManager,
|
void asset_animAdd(AssetManager *const assetManager,
|
||||||
MemoryArena_ *const arena, const char *const animName,
|
MemoryArena_ *const arena, const char *const animName,
|
||||||
TexAtlas *const atlas,
|
TexAtlas *const atlas,
|
||||||
char **const subTextureNames,
|
char **const subTextureNames,
|
||||||
@ -304,7 +381,7 @@ void asset_addAnimation(AssetManager *const assetManager,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Animation *asset_getAnim(AssetManager *const assetManager,
|
Animation *asset_animGet(AssetManager *const assetManager,
|
||||||
const char *const key)
|
const char *const key)
|
||||||
{
|
{
|
||||||
HashTableEntry *entry = getEntryFromHash(&assetManager->anims, key);
|
HashTableEntry *entry = getEntryFromHash(&assetManager->anims, key);
|
||||||
@ -617,7 +694,7 @@ INTERNAL void parseXmlTreeToGame(AssetManager *assetManager, MemoryArena_ *arena
|
|||||||
*/
|
*/
|
||||||
char *imageName = atlasXmlNode->attribute.value;
|
char *imageName = atlasXmlNode->attribute.value;
|
||||||
i32 numSubTex = 1024;
|
i32 numSubTex = 1024;
|
||||||
atlas = asset_getFreeTexAtlasSlot(assetManager, arena,
|
atlas = asset_atlasGetFreeSlot(assetManager, arena,
|
||||||
imageName, numSubTex);
|
imageName, numSubTex);
|
||||||
|
|
||||||
if (!atlas)
|
if (!atlas)
|
||||||
@ -643,7 +720,7 @@ INTERNAL void parseXmlTreeToGame(AssetManager *assetManager, MemoryArena_ *arena
|
|||||||
common_strncat(imagePath, dataDir, dataDirLen);
|
common_strncat(imagePath, dataDir, dataDirLen);
|
||||||
common_strncat(imagePath, imageName, imageNameLen);
|
common_strncat(imagePath, imageName, imageNameLen);
|
||||||
|
|
||||||
Texture *tex = asset_loadTextureImage(assetManager, arena,
|
Texture *tex = asset_texLoadImage(assetManager, arena,
|
||||||
imagePath, imageName);
|
imagePath, imageName);
|
||||||
|
|
||||||
if (!tex)
|
if (!tex)
|
||||||
@ -839,7 +916,7 @@ INTERNAL void freeXmlData(MemoryArena_ *const arena, XmlToken *tokens,
|
|||||||
* Everything else
|
* Everything else
|
||||||
*********************************
|
*********************************
|
||||||
*/
|
*/
|
||||||
const i32 asset_loadXmlFile(AssetManager *const assetManager,
|
const i32 asset_xmlLoad(AssetManager *const assetManager,
|
||||||
MemoryArena_ *const arena,
|
MemoryArena_ *const arena,
|
||||||
const PlatformFileRead *const fileRead)
|
const PlatformFileRead *const fileRead)
|
||||||
{
|
{
|
||||||
@ -868,7 +945,7 @@ const i32 asset_loadXmlFile(AssetManager *const assetManager,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioVorbis *const asset_getVorbis(AssetManager *const assetManager,
|
AudioVorbis *const asset_vorbisGet(AssetManager *const assetManager,
|
||||||
const char *const key)
|
const char *const key)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -880,7 +957,7 @@ AudioVorbis *const asset_getVorbis(AssetManager *const assetManager,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
const i32 asset_loadVorbis(AssetManager *assetManager, MemoryArena_ *arena,
|
const i32 asset_vorbisLoad(AssetManager *assetManager, MemoryArena_ *arena,
|
||||||
const char *const path, const char *const key)
|
const char *const path, const char *const key)
|
||||||
{
|
{
|
||||||
HashTableEntry *entry = getFreeHashSlot(&assetManager->audio, arena, key);
|
HashTableEntry *entry = getFreeHashSlot(&assetManager->audio, arena, key);
|
||||||
@ -974,7 +1051,7 @@ INTERNAL u32 shaderLoadProgram(const GLuint vertexShader,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 asset_getShader(AssetManager *assetManager, const enum ShaderList type)
|
u32 asset_shaderGet(AssetManager *assetManager, const enum ShaderList type)
|
||||||
{
|
{
|
||||||
if (type < shaderlist_count) return assetManager->shaders[type];
|
if (type < shaderlist_count) return assetManager->shaders[type];
|
||||||
|
|
||||||
@ -984,7 +1061,7 @@ u32 asset_getShader(AssetManager *assetManager, const enum ShaderList type)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const i32 asset_loadShaderFiles(AssetManager *assetManager, MemoryArena_ *arena,
|
const i32 asset_shaderLoad(AssetManager *assetManager, MemoryArena_ *arena,
|
||||||
const char *const vertexPath,
|
const char *const vertexPath,
|
||||||
const char *const fragmentPath,
|
const char *const fragmentPath,
|
||||||
const enum ShaderList type)
|
const enum ShaderList type)
|
||||||
@ -1017,13 +1094,13 @@ INTERNAL FontPack *getMatchingFontPack(AssetManager *assetManager,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Font *asset_getFontCreateSizeOnDemand(AssetManager *assetManager,
|
Font *asset_fontGetOrCreateOnDemand(AssetManager *assetManager,
|
||||||
MemoryArena_ *persistentArena,
|
MemoryArena_ *persistentArena,
|
||||||
MemoryArena_ *transientArena, char *name,
|
MemoryArena_ *transientArena, char *name,
|
||||||
i32 size)
|
i32 size)
|
||||||
{
|
{
|
||||||
|
|
||||||
Font *result = asset_getFont(assetManager, name, size);
|
Font *result = asset_fontGet(assetManager, name, size);
|
||||||
|
|
||||||
if (result == NULL)
|
if (result == NULL)
|
||||||
{
|
{
|
||||||
@ -1042,10 +1119,10 @@ Font *asset_getFontCreateSizeOnDemand(AssetManager *assetManager,
|
|||||||
|
|
||||||
if (result == NULL)
|
if (result == NULL)
|
||||||
{
|
{
|
||||||
asset_loadTTFont(assetManager, persistentArena, transientArena,
|
asset_fontLoadTTF(assetManager, persistentArena, transientArena,
|
||||||
pack->filePath, name, size);
|
pack->filePath, name, size);
|
||||||
|
|
||||||
result = asset_getFont(assetManager, name, size);
|
result = asset_fontGet(assetManager, name, size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1057,7 +1134,7 @@ Font *asset_getFontCreateSizeOnDemand(AssetManager *assetManager,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Font *asset_getFont(AssetManager *assetManager, char *name, i32 size)
|
Font *asset_fontGet(AssetManager *assetManager, char *name, i32 size)
|
||||||
{
|
{
|
||||||
Font *result = NULL;
|
Font *result = NULL;
|
||||||
FontPack *pack = getMatchingFontPack(assetManager, name);
|
FontPack *pack = getMatchingFontPack(assetManager, name);
|
||||||
@ -1084,7 +1161,7 @@ typedef struct GlyphBitmap
|
|||||||
i32 codepoint;
|
i32 codepoint;
|
||||||
} GlyphBitmap;
|
} GlyphBitmap;
|
||||||
|
|
||||||
const i32 asset_loadTTFont(AssetManager *assetManager,
|
const i32 asset_fontLoadTTF(AssetManager *assetManager,
|
||||||
MemoryArena_ *persistentArena,
|
MemoryArena_ *persistentArena,
|
||||||
MemoryArena_ *transientArena, char *filePath,
|
MemoryArena_ *transientArena, char *filePath,
|
||||||
char *name, i32 targetFontHeight)
|
char *name, i32 targetFontHeight)
|
||||||
@ -1134,7 +1211,7 @@ const i32 asset_loadTTFont(AssetManager *assetManager,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
TempMemory tempRegion = memory_begin_temporary_region(transientArena);
|
TempMemory tempRegion = memory_beginTempRegion(transientArena);
|
||||||
|
|
||||||
PlatformFileRead fontFileRead = {0};
|
PlatformFileRead fontFileRead = {0};
|
||||||
i32 result =
|
i32 result =
|
||||||
@ -1230,7 +1307,7 @@ const i32 asset_loadTTFont(AssetManager *assetManager,
|
|||||||
if ((largestGlyphDimension.h - CAST(i32)targetFontHeight) >= 50)
|
if ((largestGlyphDimension.h - CAST(i32)targetFontHeight) >= 50)
|
||||||
{
|
{
|
||||||
printf(
|
printf(
|
||||||
"asset_loadTTFont() warning: The loaded font file has a glyph "
|
"asset_fontLoadTTF() warning: The loaded font file has a glyph "
|
||||||
"considerably larger than our target .. font packing is "
|
"considerably larger than our target .. font packing is "
|
||||||
"unoptimal\n");
|
"unoptimal\n");
|
||||||
}
|
}
|
||||||
@ -1254,7 +1331,7 @@ const i32 asset_loadTTFont(AssetManager *assetManager,
|
|||||||
if ((glyphsPerRow * glyphsPerCol) <= numGlyphs)
|
if ((glyphsPerRow * glyphsPerCol) <= numGlyphs)
|
||||||
{
|
{
|
||||||
printf(
|
printf(
|
||||||
"asset_loadTTFont() warning: The target font height creates a "
|
"asset_fontLoadTTF() warning: The target font height creates a "
|
||||||
"glyph sheet that exceeds the available space!");
|
"glyph sheet that exceeds the available space!");
|
||||||
|
|
||||||
ASSERT(INVALID_CODE_PATH);
|
ASSERT(INVALID_CODE_PATH);
|
||||||
@ -1280,7 +1357,7 @@ const i32 asset_loadTTFont(AssetManager *assetManager,
|
|||||||
char charToEncode = CAST(char)codepointRange.x;
|
char charToEncode = CAST(char)codepointRange.x;
|
||||||
|
|
||||||
i32 numSubTex = numGlyphs;
|
i32 numSubTex = numGlyphs;
|
||||||
TexAtlas *fontAtlas = asset_getFreeTexAtlasSlot(
|
TexAtlas *fontAtlas = asset_atlasGetFreeSlot(
|
||||||
assetManager, persistentArena, "font", numSubTex);
|
assetManager, persistentArena, "font", numSubTex);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1363,8 +1440,8 @@ const i32 asset_loadTTFont(AssetManager *assetManager,
|
|||||||
* Generate and store font bitmap to assets
|
* Generate and store font bitmap to assets
|
||||||
*******************************************
|
*******************************************
|
||||||
*/
|
*/
|
||||||
Texture *tex = asset_getFreeTexSlot(assetManager, persistentArena, "font");
|
Texture *tex = asset_texGetFreeSlot(assetManager, persistentArena, "font");
|
||||||
*tex = texture_gen(MAX_TEXTURE_SIZE, MAX_TEXTURE_SIZE, 4,
|
*tex = textureGen(MAX_TEXTURE_SIZE, MAX_TEXTURE_SIZE, 4,
|
||||||
CAST(u8 *) fontBitmap);
|
CAST(u8 *) fontBitmap);
|
||||||
|
|
||||||
#ifdef WT_RENDER_FONT_FILE
|
#ifdef WT_RENDER_FONT_FILE
|
||||||
@ -1390,11 +1467,11 @@ const i32 asset_loadTTFont(AssetManager *assetManager,
|
|||||||
sizeof(u32);
|
sizeof(u32);
|
||||||
}
|
}
|
||||||
|
|
||||||
memory_end_temporary_region(tempRegion);
|
memory_endTempRegion(tempRegion);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const v2 asset_stringDimInPixels(const Font *const font,
|
const v2 asset_fontStringDimInPixels(const Font *const font,
|
||||||
const char *const string)
|
const char *const string)
|
||||||
{
|
{
|
||||||
v2 stringDim = V2(0, 0);
|
v2 stringDim = V2(0, 0);
|
||||||
|
@ -8,55 +8,55 @@ INTERNAL void loadGameAssets(GameState *state)
|
|||||||
|
|
||||||
{ // Init font assets
|
{ // Init font assets
|
||||||
i32 result =
|
i32 result =
|
||||||
asset_loadTTFont(assetManager, arena, &state->transientArena,
|
asset_fontLoadTTF(assetManager, arena, &state->transientArena,
|
||||||
"C:/Windows/Fonts/Arialbd.ttf", "Arial", 15);
|
"C:/Windows/Fonts/Arialbd.ttf", "Arial", 15);
|
||||||
}
|
}
|
||||||
|
|
||||||
{ // Init shaders assets
|
{ // Init shaders assets
|
||||||
asset_loadShaderFiles(
|
asset_shaderLoad(
|
||||||
assetManager, arena, "data/shaders/default_tex.vert.glsl",
|
assetManager, arena, "data/shaders/default_tex.vert.glsl",
|
||||||
"data/shaders/default_tex.frag.glsl", shaderlist_default);
|
"data/shaders/default_tex.frag.glsl", shaderlist_default);
|
||||||
|
|
||||||
asset_loadShaderFiles(
|
asset_shaderLoad(
|
||||||
assetManager, arena, "data/shaders/default_no_tex.vert.glsl",
|
assetManager, arena, "data/shaders/default_no_tex.vert.glsl",
|
||||||
"data/shaders/default_no_tex.frag.glsl", shaderlist_default_no_tex);
|
"data/shaders/default_no_tex.frag.glsl", shaderlist_default_no_tex);
|
||||||
}
|
}
|
||||||
|
|
||||||
{ // Init audio assets
|
{ // Init audio assets
|
||||||
i32 result = asset_loadVorbis(assetManager, arena,
|
i32 result = asset_vorbisLoad(assetManager, arena,
|
||||||
"data/audio/Asteroids/bang_large.ogg",
|
"data/audio/Asteroids/bang_large.ogg",
|
||||||
"bang_large");
|
"bang_large");
|
||||||
ASSERT(!result);
|
ASSERT(!result);
|
||||||
result = asset_loadVorbis(assetManager, arena,
|
result = asset_vorbisLoad(assetManager, arena,
|
||||||
"data/audio/Asteroids/bang_medium.ogg",
|
"data/audio/Asteroids/bang_medium.ogg",
|
||||||
"bang_medium");
|
"bang_medium");
|
||||||
ASSERT(!result);
|
ASSERT(!result);
|
||||||
result = asset_loadVorbis(assetManager, arena,
|
result = asset_vorbisLoad(assetManager, arena,
|
||||||
"data/audio/Asteroids/bang_small.ogg",
|
"data/audio/Asteroids/bang_small.ogg",
|
||||||
"bang_small");
|
"bang_small");
|
||||||
ASSERT(!result);
|
ASSERT(!result);
|
||||||
result = asset_loadVorbis(assetManager, arena,
|
result = asset_vorbisLoad(assetManager, arena,
|
||||||
"data/audio/Asteroids/beat1.ogg", "beat1");
|
"data/audio/Asteroids/beat1.ogg", "beat1");
|
||||||
ASSERT(!result);
|
ASSERT(!result);
|
||||||
result = asset_loadVorbis(assetManager, arena,
|
result = asset_vorbisLoad(assetManager, arena,
|
||||||
"data/audio/Asteroids/beat2.ogg", "beat2");
|
"data/audio/Asteroids/beat2.ogg", "beat2");
|
||||||
ASSERT(!result);
|
ASSERT(!result);
|
||||||
result = asset_loadVorbis(assetManager, arena,
|
result = asset_vorbisLoad(assetManager, arena,
|
||||||
"data/audio/Asteroids/extra_ship.ogg",
|
"data/audio/Asteroids/extra_ship.ogg",
|
||||||
"extra_ship");
|
"extra_ship");
|
||||||
ASSERT(!result);
|
ASSERT(!result);
|
||||||
result = asset_loadVorbis(assetManager, arena,
|
result = asset_vorbisLoad(assetManager, arena,
|
||||||
"data/audio/Asteroids/fire.ogg", "fire");
|
"data/audio/Asteroids/fire.ogg", "fire");
|
||||||
ASSERT(!result);
|
ASSERT(!result);
|
||||||
result = asset_loadVorbis(assetManager, arena,
|
result = asset_vorbisLoad(assetManager, arena,
|
||||||
"data/audio/Asteroids/saucer_big.ogg",
|
"data/audio/Asteroids/saucer_big.ogg",
|
||||||
"saucer_big");
|
"saucer_big");
|
||||||
ASSERT(!result);
|
ASSERT(!result);
|
||||||
result = asset_loadVorbis(assetManager, arena,
|
result = asset_vorbisLoad(assetManager, arena,
|
||||||
"data/audio/Asteroids/saucer_small.ogg",
|
"data/audio/Asteroids/saucer_small.ogg",
|
||||||
"saucer_small");
|
"saucer_small");
|
||||||
ASSERT(!result);
|
ASSERT(!result);
|
||||||
result = asset_loadVorbis(assetManager, arena,
|
result = asset_vorbisLoad(assetManager, arena,
|
||||||
"data/audio/Asteroids/thrust.ogg", "thrust");
|
"data/audio/Asteroids/thrust.ogg", "thrust");
|
||||||
ASSERT(!result);
|
ASSERT(!result);
|
||||||
}
|
}
|
||||||
@ -348,19 +348,19 @@ INTERNAL void addAsteroidWithSpec(World *world, enum AsteroidSize asteroidSize,
|
|||||||
// generated
|
// generated
|
||||||
// to float back into game space
|
// to float back into game space
|
||||||
v2 newP = V2i(randX, randY);
|
v2 newP = V2i(randX, randY);
|
||||||
if (math_rect_contains_p(topLeftQuadrant, newP))
|
if (math_rectContainsP(topLeftQuadrant, newP))
|
||||||
{
|
{
|
||||||
newP.y += midpoint.y;
|
newP.y += midpoint.y;
|
||||||
}
|
}
|
||||||
else if (math_rect_contains_p(botLeftQuadrant, newP))
|
else if (math_rectContainsP(botLeftQuadrant, newP))
|
||||||
{
|
{
|
||||||
newP.x -= midpoint.x;
|
newP.x -= midpoint.x;
|
||||||
}
|
}
|
||||||
else if (math_rect_contains_p(topRightQuadrant, newP))
|
else if (math_rectContainsP(topRightQuadrant, newP))
|
||||||
{
|
{
|
||||||
newP.y -= midpoint.y;
|
newP.y -= midpoint.y;
|
||||||
}
|
}
|
||||||
else if (math_rect_contains_p(botRightQuadrant, newP))
|
else if (math_rectContainsP(botRightQuadrant, newP))
|
||||||
{
|
{
|
||||||
newP.x += midpoint.x;
|
newP.x += midpoint.x;
|
||||||
}
|
}
|
||||||
@ -505,7 +505,7 @@ INTERNAL void gameUpdate(GameState *state, Memory *memory, f32 dt)
|
|||||||
{ // Init ship entity
|
{ // Init ship entity
|
||||||
Entity *ship = &world->entityList[world->entityIndex++];
|
Entity *ship = &world->entityList[world->entityIndex++];
|
||||||
ship->id = world->entityIdCounter++;
|
ship->id = world->entityIdCounter++;
|
||||||
ship->pos = math_rect_get_centre(world->camera);
|
ship->pos = math_rectGetCentre(world->camera);
|
||||||
ship->size = V2(25.0f, 50.0f);
|
ship->size = V2(25.0f, 50.0f);
|
||||||
ship->hitbox = ship->size;
|
ship->hitbox = ship->size;
|
||||||
ship->offset = v2_scale(ship->size, -0.5f);
|
ship->offset = v2_scale(ship->size, -0.5f);
|
||||||
@ -596,10 +596,10 @@ INTERNAL void gameUpdate(GameState *state, Memory *memory, f32 dt)
|
|||||||
if (audioRenderer)
|
if (audioRenderer)
|
||||||
{
|
{
|
||||||
AudioVorbis *fire =
|
AudioVorbis *fire =
|
||||||
asset_getVorbis(&state->assetManager, "fire");
|
asset_vorbisGet(&state->assetManager, "fire");
|
||||||
// TODO(doyle): Atm transient arena is not used, this is
|
// TODO(doyle): Atm transient arena is not used, this is
|
||||||
// just to fill out the arguments
|
// just to fill out the arguments
|
||||||
audio_playVorbis(&state->transientArena,
|
audio_vorbisPlay(&state->transientArena,
|
||||||
&state->audioManager, audioRenderer, fire,
|
&state->audioManager, audioRenderer, fire,
|
||||||
1);
|
1);
|
||||||
}
|
}
|
||||||
@ -711,7 +711,7 @@ INTERNAL void gameUpdate(GameState *state, Memory *memory, f32 dt)
|
|||||||
}
|
}
|
||||||
else if (entity->type == entitytype_bullet)
|
else if (entity->type == entitytype_bullet)
|
||||||
{
|
{
|
||||||
if (!math_rect_contains_p(world->camera, entity->pos))
|
if (!math_rectContainsP(world->camera, entity->pos))
|
||||||
{
|
{
|
||||||
deleteEntity(world, i--);
|
deleteEntity(world, i--);
|
||||||
continue;
|
continue;
|
||||||
@ -882,8 +882,8 @@ INTERNAL void gameUpdate(GameState *state, Memory *memory, f32 dt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
AudioVorbis *explode =
|
AudioVorbis *explode =
|
||||||
asset_getVorbis(&state->assetManager, sound);
|
asset_vorbisGet(&state->assetManager, sound);
|
||||||
audio_playVorbis(&state->transientArena,
|
audio_vorbisPlay(&state->transientArena,
|
||||||
&state->audioManager, audioRenderer,
|
&state->audioManager, audioRenderer,
|
||||||
explode, 1);
|
explode, 1);
|
||||||
}
|
}
|
||||||
@ -916,31 +916,31 @@ INTERNAL void startMenuUpdate(GameState *state, Memory *memory, f32 dt)
|
|||||||
World *world = &state->world;
|
World *world = &state->world;
|
||||||
InputBuffer *inputBuffer = &state->input;
|
InputBuffer *inputBuffer = &state->input;
|
||||||
|
|
||||||
Font *arial15 = asset_getFontCreateSizeOnDemand(
|
Font *arial15 = asset_fontGetOrCreateOnDemand(
|
||||||
assetManager, &state->persistentArena, transientArena, "Arial", 15);
|
assetManager, &state->persistentArena, transientArena, "Arial", 15);
|
||||||
Font *arial25 = asset_getFontCreateSizeOnDemand(
|
Font *arial25 = asset_fontGetOrCreateOnDemand(
|
||||||
assetManager, &state->persistentArena, transientArena, "Arial", 40);
|
assetManager, &state->persistentArena, transientArena, "Arial", 40);
|
||||||
|
|
||||||
f32 margin = 20.0f;
|
f32 margin = 20.0f;
|
||||||
f32 padding = 20.0f;
|
f32 padding = 20.0f;
|
||||||
v2 titleP = V2(margin, renderer->size.h - 100 + margin);
|
v2 titleP = V2(margin, renderer->size.h - 100 + margin);
|
||||||
renderer_staticString(renderer, transientArena, arial25, "Asteroids",
|
renderer_stringFixed(renderer, transientArena, arial25, "Asteroids",
|
||||||
titleP, V2(0, 0), 0, V4(1, 0, 0, 1), 0);
|
titleP, V2(0, 0), 0, V4(1, 0, 0, 1), 0);
|
||||||
|
|
||||||
userInterface_beginState(uiState);
|
ui_beginState(uiState);
|
||||||
|
|
||||||
Rect buttonRect = {0};
|
Rect buttonRect = {0};
|
||||||
buttonRect.min = V2(margin, margin);
|
buttonRect.min = V2(margin, margin);
|
||||||
buttonRect.max = V2(margin + 100, margin + 40);
|
buttonRect.max = V2(margin + 100, margin + 40);
|
||||||
buttonRect = math_rect_shift(buttonRect, V2(0, titleP.y - 100));
|
buttonRect = math_rectShift(buttonRect, V2(0, titleP.y - 100));
|
||||||
if (userInterface_button(uiState, transientArena, assetManager, renderer,
|
if (ui_button(uiState, transientArena, assetManager, renderer,
|
||||||
arial15, *inputBuffer, 1, buttonRect,
|
arial15, *inputBuffer, 1, buttonRect,
|
||||||
"Start Game"))
|
"Start Game"))
|
||||||
{
|
{
|
||||||
state->appState = appstate_game;
|
state->appState = appstate_game;
|
||||||
}
|
}
|
||||||
|
|
||||||
userInterface_endState(uiState, inputBuffer);
|
ui_endState(uiState, inputBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void asteroid_gameUpdateAndRender(GameState *state, Memory *memory,
|
void asteroid_gameUpdateAndRender(GameState *state, Memory *memory,
|
||||||
@ -963,14 +963,14 @@ void asteroid_gameUpdateAndRender(GameState *state, Memory *memory,
|
|||||||
renderer_init(&state->renderer, &state->assetManager,
|
renderer_init(&state->renderer, &state->assetManager,
|
||||||
&state->persistentArena, windowSize);
|
&state->persistentArena, windowSize);
|
||||||
|
|
||||||
Font *arial15 = asset_getFont(&state->assetManager, "Arial", 15);
|
Font *arial15 = asset_fontGet(&state->assetManager, "Arial", 15);
|
||||||
debug_init(&state->persistentArena, windowSize, *arial15);
|
debug_init(&state->persistentArena, windowSize, *arial15);
|
||||||
|
|
||||||
state->appState = appstate_start_menu;
|
state->appState = appstate_start_menu;
|
||||||
state->init = TRUE;
|
state->init = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
platform_processInputBuffer(&state->input, dt);
|
platform_inputBufferProcess(&state->input, dt);
|
||||||
|
|
||||||
switch (state->appState)
|
switch (state->appState)
|
||||||
{
|
{
|
||||||
|
20
src/Audio.c
20
src/Audio.c
@ -129,7 +129,7 @@ INTERNAL i32 rendererAcquire(MemoryArena_ *arena, AudioManager *audioManager,
|
|||||||
"rendererAcquire(): Renderer has not been released before "
|
"rendererAcquire(): Renderer has not been released before "
|
||||||
"acquiring, force release by stopping stream");
|
"acquiring, force release by stopping stream");
|
||||||
#endif
|
#endif
|
||||||
audio_stopVorbis(arena, audioManager, audioRenderer);
|
audio_vorbisStop(arena, audioManager, audioRenderer);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(doyle): Super bad linear O(n) search for every audio-enabled entity
|
// TODO(doyle): Super bad linear O(n) search for every audio-enabled entity
|
||||||
@ -239,14 +239,14 @@ INTERNAL i32 initRendererForPlayback(MemoryArena_ *arena,
|
|||||||
ASSERT(audioManager && audioRenderer && vorbis);
|
ASSERT(audioManager && audioRenderer && vorbis);
|
||||||
if (numPlays != AUDIO_REPEAT_INFINITE && numPlays <= 0)
|
if (numPlays != AUDIO_REPEAT_INFINITE && numPlays <= 0)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("audio_streamPlayVorbis() warning: Number of plays is less than 0");
|
DEBUG_LOG("audio_vorbisStream() warning: Number of plays is less than 0");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
i32 result = rendererAcquire(arena, audioManager, audioRenderer);
|
i32 result = rendererAcquire(arena, audioManager, audioRenderer);
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("audio_streamPlayVorbis() failed: Could not acquire renderer");
|
DEBUG_LOG("audio_vorbisStream() failed: Could not acquire renderer");
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -258,7 +258,7 @@ INTERNAL i32 initRendererForPlayback(MemoryArena_ *arena,
|
|||||||
{
|
{
|
||||||
#ifdef DENGINE_DEBUG
|
#ifdef DENGINE_DEBUG
|
||||||
DEBUG_LOG(
|
DEBUG_LOG(
|
||||||
"audio_streamPlayVorbis() warning: Unexpected channel format");
|
"audio_vorbisStream() warning: Unexpected channel format");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -268,7 +268,7 @@ INTERNAL i32 initRendererForPlayback(MemoryArena_ *arena,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
const i32 audio_playVorbis(MemoryArena_ *arena, AudioManager *audioManager,
|
const i32 audio_vorbisPlay(MemoryArena_ *arena, AudioManager *audioManager,
|
||||||
AudioRenderer *audioRenderer, AudioVorbis *vorbis,
|
AudioRenderer *audioRenderer, AudioVorbis *vorbis,
|
||||||
i32 numPlays)
|
i32 numPlays)
|
||||||
{
|
{
|
||||||
@ -296,7 +296,7 @@ const i32 audio_playVorbis(MemoryArena_ *arena, AudioManager *audioManager,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
const i32 audio_streamPlayVorbis(MemoryArena_ *arena, AudioManager *audioManager,
|
const i32 audio_vorbisStream(MemoryArena_ *arena, AudioManager *audioManager,
|
||||||
AudioRenderer *audioRenderer,
|
AudioRenderer *audioRenderer,
|
||||||
AudioVorbis *vorbis, i32 numPlays)
|
AudioVorbis *vorbis, i32 numPlays)
|
||||||
{
|
{
|
||||||
@ -326,7 +326,7 @@ const i32 audio_streamPlayVorbis(MemoryArena_ *arena, AudioManager *audioManager
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
const i32 audio_stopVorbis(MemoryArena_ *arena, AudioManager *audioManager,
|
const i32 audio_vorbisStop(MemoryArena_ *arena, AudioManager *audioManager,
|
||||||
AudioRenderer *audioRenderer)
|
AudioRenderer *audioRenderer)
|
||||||
{
|
{
|
||||||
i32 result = 0;
|
i32 result = 0;
|
||||||
@ -354,7 +354,7 @@ const i32 audio_stopVorbis(MemoryArena_ *arena, AudioManager *audioManager,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
const i32 audio_pauseVorbis(AudioManager *audioManager,
|
const i32 audio_vorbisPause(AudioManager *audioManager,
|
||||||
AudioRenderer *audioRenderer)
|
AudioRenderer *audioRenderer)
|
||||||
{
|
{
|
||||||
i32 result = 0;
|
i32 result = 0;
|
||||||
@ -373,7 +373,7 @@ const i32 audio_pauseVorbis(AudioManager *audioManager,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
const i32 audio_resumeVorbis(AudioManager *audioManager,
|
const i32 audio_vorbisResume(AudioManager *audioManager,
|
||||||
AudioRenderer *audioRenderer)
|
AudioRenderer *audioRenderer)
|
||||||
{
|
{
|
||||||
i32 result = 0;
|
i32 result = 0;
|
||||||
@ -387,7 +387,7 @@ const i32 audio_resumeVorbis(AudioManager *audioManager,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifdef DENGINE_DEBUG
|
#ifdef DENGINE_DEBUG
|
||||||
DEBUG_LOG("audio_resumeVorbis(): Tried to resume invalid source")
|
DEBUG_LOG("audio_vorbisResume(): Tried to resume invalid source")
|
||||||
#endif
|
#endif
|
||||||
result = -1;
|
result = -1;
|
||||||
}
|
}
|
||||||
|
@ -223,7 +223,7 @@ INTERNAL void updateAndRenderDebugStack(Renderer *renderer, MemoryArena_ *arena,
|
|||||||
{
|
{
|
||||||
f32 rotate = 0;
|
f32 rotate = 0;
|
||||||
v4 color = V4(1, 1, 1, 1);
|
v4 color = V4(1, 1, 1, 1);
|
||||||
renderer_staticString(
|
renderer_stringFixed(
|
||||||
renderer, arena, &GLOBAL_debug.font, GLOBAL_debug.debugStrings[i],
|
renderer, arena, &GLOBAL_debug.font, GLOBAL_debug.debugStrings[i],
|
||||||
GLOBAL_debug.currStringP, V2(0, 0), rotate, color, 0);
|
GLOBAL_debug.currStringP, V2(0, 0), rotate, color, 0);
|
||||||
GLOBAL_debug.currStringP.y -= (0.9f * GLOBAL_debug.stringLineGap);
|
GLOBAL_debug.currStringP.y -= (0.9f * GLOBAL_debug.stringLineGap);
|
||||||
@ -255,7 +255,7 @@ INTERNAL void renderConsole(Renderer *renderer, MemoryArena_ *arena)
|
|||||||
{
|
{
|
||||||
f32 rotate = 0;
|
f32 rotate = 0;
|
||||||
v4 color = V4(1.0f, 1.0f, 1.0f, 1.0f);
|
v4 color = V4(1.0f, 1.0f, 1.0f, 1.0f);
|
||||||
renderer_staticString(renderer, arena, &GLOBAL_debug.font,
|
renderer_stringFixed(renderer, arena, &GLOBAL_debug.font,
|
||||||
GLOBAL_debug.console[i], consoleStrP,
|
GLOBAL_debug.console[i], consoleStrP,
|
||||||
V2(0, 0), rotate, color, 0);
|
V2(0, 0), rotate, color, 0);
|
||||||
consoleStrP.y -= (0.9f * GLOBAL_debug.stringLineGap);
|
consoleStrP.y -= (0.9f * GLOBAL_debug.stringLineGap);
|
||||||
|
14
src/Entity.c
14
src/Entity.c
@ -4,17 +4,17 @@
|
|||||||
#include "Dengine/Math.h"
|
#include "Dengine/Math.h"
|
||||||
#include "Dengine/MemoryArena.h"
|
#include "Dengine/MemoryArena.h"
|
||||||
|
|
||||||
SubTexture entity_getActiveSubTexture(Entity *const entity)
|
SubTexture entity_subTexGetCurr(Entity *const entity)
|
||||||
{
|
{
|
||||||
EntityAnim *entityAnim = &entity->animList[entity->animListIndex];
|
EntityAnim *entityAnim = &entity->animList[entity->animListIndex];
|
||||||
Animation *anim = entityAnim->anim;
|
Animation *anim = entityAnim->anim;
|
||||||
char *frameName = anim->frameList[entityAnim->currFrame];
|
char *frameName = anim->frameList[entityAnim->currFrame];
|
||||||
|
|
||||||
SubTexture result = asset_getAtlasSubTex(anim->atlas, frameName);
|
SubTexture result = asset_atlasGetSubTex(anim->atlas, frameName);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void entity_setActiveAnim(Entity *const entity, const char *const animName)
|
void entity_animSet(Entity *const entity, const char *const animName)
|
||||||
{
|
{
|
||||||
/* Reset current anim data */
|
/* Reset current anim data */
|
||||||
EntityAnim *currEntityAnim = &entity->animList[entity->animListIndex];
|
EntityAnim *currEntityAnim = &entity->animList[entity->animListIndex];
|
||||||
@ -44,7 +44,7 @@ void entity_setActiveAnim(Entity *const entity, const char *const animName)
|
|||||||
DEBUG_LOG("Entity does not have access to desired anim");
|
DEBUG_LOG("Entity does not have access to desired anim");
|
||||||
}
|
}
|
||||||
|
|
||||||
void entity_updateAnim(Entity *const entity, const f32 dt)
|
void entity_animUpdate(Entity *const entity, const f32 dt)
|
||||||
{
|
{
|
||||||
if (!entity->tex)
|
if (!entity->tex)
|
||||||
return;
|
return;
|
||||||
@ -66,11 +66,11 @@ void entity_updateAnim(Entity *const entity, const f32 dt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char *frameName = anim->frameList[currEntityAnim->currFrame];
|
char *frameName = anim->frameList[currEntityAnim->currFrame];
|
||||||
SubTexture texRect = asset_getAtlasSubTex(anim->atlas, frameName);
|
SubTexture texRect = asset_atlasGetSubTex(anim->atlas, frameName);
|
||||||
entity->size = v2_scale(texRect.rect.max, entity->scale);
|
entity->size = v2_scale(texRect.rect.max, entity->scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
void entity_addAnim(AssetManager *const assetManager, Entity *const entity,
|
void entity_animAdd(AssetManager *const assetManager, Entity *const entity,
|
||||||
const char *const animName)
|
const char *const animName)
|
||||||
{
|
{
|
||||||
i32 freeAnimIndex = 0;
|
i32 freeAnimIndex = 0;
|
||||||
@ -79,7 +79,7 @@ void entity_addAnim(AssetManager *const assetManager, Entity *const entity,
|
|||||||
EntityAnim *entityAnim = &entity->animList[i];
|
EntityAnim *entityAnim = &entity->animList[i];
|
||||||
if (!entityAnim->anim)
|
if (!entityAnim->anim)
|
||||||
{
|
{
|
||||||
entityAnim->anim = asset_getAnim(assetManager, animName);
|
entityAnim->anim = asset_animGet(assetManager, animName);
|
||||||
entityAnim->currFrame = 0;
|
entityAnim->currFrame = 0;
|
||||||
entityAnim->currDuration = entityAnim->anim->frameDuration;
|
entityAnim->currDuration = entityAnim->anim->frameDuration;
|
||||||
return;
|
return;
|
||||||
|
@ -8,7 +8,7 @@ void memory_arenaInit(MemoryArena_ *arena, void *base, size_t size)
|
|||||||
arena->tempMemoryCount = 0;
|
arena->tempMemoryCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
TempMemory memory_begin_temporary_region(MemoryArena_ *arena)
|
TempMemory memory_beginTempRegion(MemoryArena_ *arena)
|
||||||
{
|
{
|
||||||
TempMemory result = {0};
|
TempMemory result = {0};
|
||||||
result.arena = arena;
|
result.arena = arena;
|
||||||
@ -19,7 +19,7 @@ TempMemory memory_begin_temporary_region(MemoryArena_ *arena)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void memory_end_temporary_region(TempMemory tempMemory)
|
void memory_endTempRegion(TempMemory tempMemory)
|
||||||
{
|
{
|
||||||
MemoryArena_ *arena = tempMemory.arena;
|
MemoryArena_ *arena = tempMemory.arena;
|
||||||
ASSERT(arena->used > tempMemory.used)
|
ASSERT(arena->used > tempMemory.used)
|
||||||
|
@ -96,7 +96,7 @@ i32 platform_readFileToBuffer(MemoryArena_ *arena, const char *const filePath,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void platform_processInputBuffer(InputBuffer *inputBuffer, f32 dt)
|
void platform_inputBufferProcess(InputBuffer *inputBuffer, f32 dt)
|
||||||
{
|
{
|
||||||
KeyState *keyBuffer = inputBuffer->keys;
|
KeyState *keyBuffer = inputBuffer->keys;
|
||||||
for (enum KeyCode code = 0; code < keycode_count; code++)
|
for (enum KeyCode code = 0; code < keycode_count; code++)
|
||||||
|
@ -5,8 +5,32 @@
|
|||||||
#include "Dengine/Entity.h"
|
#include "Dengine/Entity.h"
|
||||||
#include "Dengine/MemoryArena.h"
|
#include "Dengine/MemoryArena.h"
|
||||||
#include "Dengine/OpenGL.h"
|
#include "Dengine/OpenGL.h"
|
||||||
#include "Dengine/Shader.h"
|
|
||||||
#include "Dengine/Texture.h"
|
void shaderUniformSet1i(u32 shaderId, const GLchar *name,
|
||||||
|
const GLuint data)
|
||||||
|
{
|
||||||
|
GLint uniformLoc = glGetUniformLocation(shaderId, name);
|
||||||
|
glUniform1i(uniformLoc, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void shaderUniformSetMat4fv(u32 shaderId, const GLchar *name,
|
||||||
|
mat4 data)
|
||||||
|
{
|
||||||
|
GLint uniformLoc = glGetUniformLocation(shaderId, name);
|
||||||
|
GL_CHECK_ERROR();
|
||||||
|
glUniformMatrix4fv(uniformLoc, 1, GL_FALSE, data.e[0]);
|
||||||
|
GL_CHECK_ERROR();
|
||||||
|
}
|
||||||
|
|
||||||
|
void shaderUniformSetVec4f(u32 shaderId, const GLchar *name,
|
||||||
|
v4 data)
|
||||||
|
{
|
||||||
|
GLint uniformLoc = glGetUniformLocation(shaderId, name);
|
||||||
|
glUniform4f(uniformLoc, data.e[0], data.e[1], data.e[2], data.e[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void shaderUse(u32 shaderId) { glUseProgram(shaderId); }
|
||||||
|
|
||||||
void renderer_init(Renderer *renderer, AssetManager *assetManager,
|
void renderer_init(Renderer *renderer, AssetManager *assetManager,
|
||||||
MemoryArena_ *persistentArena, v2 windowSize)
|
MemoryArena_ *persistentArena, v2 windowSize)
|
||||||
@ -21,9 +45,9 @@ void renderer_init(Renderer *renderer, AssetManager *assetManager,
|
|||||||
mat4_ortho(0.0f, renderer->size.w, 0.0f, renderer->size.h, 0.0f, 1.0f);
|
mat4_ortho(0.0f, renderer->size.w, 0.0f, renderer->size.h, 0.0f, 1.0f);
|
||||||
for (i32 i = 0; i < shaderlist_count; i++)
|
for (i32 i = 0; i < shaderlist_count; i++)
|
||||||
{
|
{
|
||||||
renderer->shaderList[i] = asset_getShader(assetManager, i);
|
renderer->shaderList[i] = asset_shaderGet(assetManager, i);
|
||||||
shader_use(renderer->shaderList[i]);
|
shaderUse(renderer->shaderList[i]);
|
||||||
shader_uniformSetMat4fv(renderer->shaderList[i], "projection",
|
shaderUniformSetMat4fv(renderer->shaderList[i], "projection",
|
||||||
projection);
|
projection);
|
||||||
GL_CHECK_ERROR();
|
GL_CHECK_ERROR();
|
||||||
}
|
}
|
||||||
@ -431,18 +455,18 @@ INTERNAL void renderGLBufferedData(Renderer *renderer, RenderGroup *group)
|
|||||||
{
|
{
|
||||||
renderer->activeShaderId =
|
renderer->activeShaderId =
|
||||||
renderer->shaderList[shaderlist_default_no_tex];
|
renderer->shaderList[shaderlist_default_no_tex];
|
||||||
shader_use(renderer->activeShaderId);
|
shaderUse(renderer->activeShaderId);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
renderer->activeShaderId = renderer->shaderList[shaderlist_default];
|
renderer->activeShaderId = renderer->shaderList[shaderlist_default];
|
||||||
shader_use(renderer->activeShaderId);
|
shaderUse(renderer->activeShaderId);
|
||||||
Texture *tex = group->tex;
|
Texture *tex = group->tex;
|
||||||
if (tex)
|
if (tex)
|
||||||
{
|
{
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_2D, tex->id);
|
glBindTexture(GL_TEXTURE_2D, tex->id);
|
||||||
shader_uniformSet1i(renderer->activeShaderId, "tex", 0);
|
shaderUniformSet1i(renderer->activeShaderId, "tex", 0);
|
||||||
GL_CHECK_ERROR();
|
GL_CHECK_ERROR();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -452,7 +476,7 @@ INTERNAL void renderGLBufferedData(Renderer *renderer, RenderGroup *group)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Set color modulation value */
|
/* Set color modulation value */
|
||||||
shader_uniformSetVec4f(renderer->activeShaderId, "spriteColor",
|
shaderUniformSetVec4f(renderer->activeShaderId, "spriteColor",
|
||||||
group->color);
|
group->color);
|
||||||
|
|
||||||
glBindVertexArray(renderer->vao[group->mode]);
|
glBindVertexArray(renderer->vao[group->mode]);
|
||||||
@ -469,7 +493,7 @@ INTERNAL void renderGLBufferedData(Renderer *renderer, RenderGroup *group)
|
|||||||
|
|
||||||
RenderTex renderer_createNullRenderTex(AssetManager *const assetManager)
|
RenderTex renderer_createNullRenderTex(AssetManager *const assetManager)
|
||||||
{
|
{
|
||||||
Texture *emptyTex = asset_getTex(assetManager, "nullTex");
|
Texture *emptyTex = asset_texGet(assetManager, "nullTex");
|
||||||
RenderTex result = {emptyTex, V4(0, 1, 1, 0)};
|
RenderTex result = {emptyTex, V4(0, 1, 1, 0)};
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -606,8 +630,8 @@ void renderer_string(Renderer *const renderer, MemoryArena_ *arena, Rect camera,
|
|||||||
v2_add(pos, V2((CAST(f32) font->maxSize.w * CAST(f32) strLen),
|
v2_add(pos, V2((CAST(f32) font->maxSize.w * CAST(f32) strLen),
|
||||||
CAST(f32) font->maxSize.h));
|
CAST(f32) font->maxSize.h));
|
||||||
v2 leftAlignedP = pos;
|
v2 leftAlignedP = pos;
|
||||||
if (math_rect_contains_p(camera, leftAlignedP) ||
|
if (math_rectContainsP(camera, leftAlignedP) ||
|
||||||
math_rect_contains_p(camera, rightAlignedP))
|
math_rectContainsP(camera, rightAlignedP))
|
||||||
{
|
{
|
||||||
i32 vertexIndex = 0;
|
i32 vertexIndex = 0;
|
||||||
i32 numVertexPerQuad = 4;
|
i32 numVertexPerQuad = 4;
|
||||||
@ -630,7 +654,7 @@ void renderer_string(Renderer *const renderer, MemoryArena_ *arena, Rect camera,
|
|||||||
|
|
||||||
/* Get texture out */
|
/* Get texture out */
|
||||||
SubTexture subTexture =
|
SubTexture subTexture =
|
||||||
asset_getAtlasSubTex(font->atlas, &CAST(char)codepoint);
|
asset_atlasGetSubTex(font->atlas, &CAST(char)codepoint);
|
||||||
|
|
||||||
v4 charTexRect = {0};
|
v4 charTexRect = {0};
|
||||||
charTexRect.vec2[0] = subTexture.rect.min;
|
charTexRect.vec2[0] = subTexture.rect.min;
|
||||||
@ -667,7 +691,7 @@ void renderer_entity(Renderer *renderer, MemoryArena_ *transientArena,
|
|||||||
{
|
{
|
||||||
Animation *anim = entityAnim->anim;
|
Animation *anim = entityAnim->anim;
|
||||||
char *frameName = anim->frameList[entityAnim->currFrame];
|
char *frameName = anim->frameList[entityAnim->currFrame];
|
||||||
SubTexture subTex = asset_getAtlasSubTex(anim->atlas, frameName);
|
SubTexture subTex = asset_atlasGetSubTex(anim->atlas, frameName);
|
||||||
|
|
||||||
texRect.vec2[0] = subTex.rect.min;
|
texRect.vec2[0] = subTex.rect.min;
|
||||||
texRect.vec2[1] = v2_add(subTex.rect.min, subTex.rect.max);
|
texRect.vec2[1] = v2_add(subTex.rect.min, subTex.rect.max);
|
||||||
|
27
src/Shader.c
27
src/Shader.c
@ -1,27 +0,0 @@
|
|||||||
#include "Dengine/Shader.h"
|
|
||||||
|
|
||||||
void shader_uniformSet1i(u32 shaderId, const GLchar *name,
|
|
||||||
const GLuint data)
|
|
||||||
{
|
|
||||||
GLint uniformLoc = glGetUniformLocation(shaderId, name);
|
|
||||||
glUniform1i(uniformLoc, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
void shader_uniformSetMat4fv(u32 shaderId, const GLchar *name,
|
|
||||||
mat4 data)
|
|
||||||
{
|
|
||||||
GLint uniformLoc = glGetUniformLocation(shaderId, name);
|
|
||||||
GL_CHECK_ERROR();
|
|
||||||
glUniformMatrix4fv(uniformLoc, 1, GL_FALSE, data.e[0]);
|
|
||||||
GL_CHECK_ERROR();
|
|
||||||
}
|
|
||||||
|
|
||||||
void shader_uniformSetVec4f(u32 shaderId, const GLchar *name,
|
|
||||||
v4 data)
|
|
||||||
{
|
|
||||||
GLint uniformLoc = glGetUniformLocation(shaderId, name);
|
|
||||||
glUniform4f(uniformLoc, data.e[0], data.e[1], data.e[2], data.e[3]);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void shader_use(u32 shaderId) { glUseProgram(shaderId); }
|
|
@ -1,78 +0,0 @@
|
|||||||
#include "Dengine/Texture.h"
|
|
||||||
|
|
||||||
enum BytesPerPixel
|
|
||||||
{
|
|
||||||
bytesPerPixel_Greyscale = 1,
|
|
||||||
bytesPerPixel_GreyscaleAlpha = 2,
|
|
||||||
bytesPerPixel_RGB = 3,
|
|
||||||
bytesPerPixel_RGBA = 4,
|
|
||||||
};
|
|
||||||
|
|
||||||
INTERNAL GLint getGLFormat(i32 bytesPerPixel, b32 srgb)
|
|
||||||
{
|
|
||||||
switch (bytesPerPixel)
|
|
||||||
{
|
|
||||||
case bytesPerPixel_Greyscale:
|
|
||||||
return GL_LUMINANCE;
|
|
||||||
case bytesPerPixel_GreyscaleAlpha:
|
|
||||||
return GL_LUMINANCE_ALPHA;
|
|
||||||
case bytesPerPixel_RGB:
|
|
||||||
return (srgb ? GL_SRGB : GL_RGB);
|
|
||||||
case bytesPerPixel_RGBA:
|
|
||||||
return (srgb ? GL_SRGB_ALPHA : GL_RGBA);
|
|
||||||
default:
|
|
||||||
// TODO(doyle): Invalid
|
|
||||||
// std::cout << "getGLFormat() invalid bytesPerPixel: "
|
|
||||||
// << bytesPerPixel << std::endl;
|
|
||||||
return GL_LUMINANCE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Texture texture_gen(const GLuint width, const GLuint height,
|
|
||||||
const GLint bytesPerPixel, const u8 *const image)
|
|
||||||
{
|
|
||||||
// TODO(doyle): Let us set the parameters gl params as well
|
|
||||||
GL_CHECK_ERROR();
|
|
||||||
Texture tex = {0};
|
|
||||||
tex.width = width;
|
|
||||||
tex.height = height;
|
|
||||||
tex.internalFormat = GL_RGBA;
|
|
||||||
tex.wrapS = GL_REPEAT;
|
|
||||||
tex.wrapT = GL_REPEAT;
|
|
||||||
tex.filterMinification = GL_NEAREST;
|
|
||||||
tex.filterMagnification = GL_NEAREST;
|
|
||||||
|
|
||||||
glGenTextures(1, &tex.id);
|
|
||||||
GL_CHECK_ERROR();
|
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, tex.id);
|
|
||||||
GL_CHECK_ERROR();
|
|
||||||
|
|
||||||
/* Load image into texture */
|
|
||||||
// TODO(doyle) Figure out the gl format
|
|
||||||
tex.imageFormat = getGLFormat(bytesPerPixel, FALSE);
|
|
||||||
ASSERT(tex.imageFormat == GL_RGBA);
|
|
||||||
|
|
||||||
GL_CHECK_ERROR();
|
|
||||||
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, tex.internalFormat, tex.width, tex.height, 0,
|
|
||||||
tex.imageFormat, GL_UNSIGNED_BYTE, image);
|
|
||||||
GL_CHECK_ERROR();
|
|
||||||
|
|
||||||
// TODO(doyle): Not needed for sprites? glGenerateMipmap(GL_TEXTURE_2D);
|
|
||||||
|
|
||||||
/* Set parameter of currently bound texture */
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, tex.wrapS);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, tex.wrapT);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
|
|
||||||
tex.filterMinification);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
|
|
||||||
tex.filterMagnification);
|
|
||||||
GL_CHECK_ERROR();
|
|
||||||
|
|
||||||
/* Unbind and clean up */
|
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
|
||||||
GL_CHECK_ERROR();
|
|
||||||
|
|
||||||
return tex;
|
|
||||||
}
|
|
@ -1,16 +1,13 @@
|
|||||||
#include "Dengine/UserInterface.h"
|
#include "Dengine/Ui.h"
|
||||||
#include "Dengine/AssetManager.h"
|
#include "Dengine/AssetManager.h"
|
||||||
#include "Dengine/Assets.h"
|
#include "Dengine/Assets.h"
|
||||||
#include "Dengine/Asteroid.h"
|
#include "Dengine/Asteroid.h"
|
||||||
#include "Dengine/Debug.h"
|
#include "Dengine/Debug.h"
|
||||||
#include "Dengine/Renderer.h"
|
#include "Dengine/Renderer.h"
|
||||||
|
|
||||||
void userInterface_beginState(UiState *state)
|
void ui_beginState(UiState *state) { state->hotItem = 0; }
|
||||||
{
|
|
||||||
state->hotItem = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void userInterface_endState(UiState *state, InputBuffer *input)
|
void ui_endState(UiState *state, InputBuffer *input)
|
||||||
{
|
{
|
||||||
if (!common_isSet(input->keys[keycode_mouseLeft].flags,
|
if (!common_isSet(input->keys[keycode_mouseLeft].flags,
|
||||||
keystateflag_ended_down))
|
keystateflag_ended_down))
|
||||||
@ -28,13 +25,12 @@ void userInterface_endState(UiState *state, InputBuffer *input)
|
|||||||
state->keyChar = keycode_null;
|
state->keyChar = keycode_null;
|
||||||
}
|
}
|
||||||
|
|
||||||
i32 userInterface_button(UiState *const uiState, MemoryArena_ *const arena,
|
i32 ui_button(UiState *const uiState, MemoryArena_ *const arena,
|
||||||
AssetManager *const assetManager,
|
AssetManager *const assetManager, Renderer *const renderer,
|
||||||
Renderer *const renderer, Font *const font,
|
Font *const font, const InputBuffer input, const i32 id,
|
||||||
const InputBuffer input, const i32 id, const Rect rect,
|
const Rect rect, const char *const label)
|
||||||
const char *const label)
|
|
||||||
{
|
{
|
||||||
if (math_rect_contains_p(rect, input.mouseP))
|
if (math_rectContainsP(rect, input.mouseP))
|
||||||
{
|
{
|
||||||
uiState->hotItem = id;
|
uiState->hotItem = id;
|
||||||
if (uiState->activeItem == 0)
|
if (uiState->activeItem == 0)
|
||||||
@ -45,7 +41,6 @@ i32 userInterface_button(UiState *const uiState, MemoryArena_ *const arena,
|
|||||||
uiState->activeItem = id;
|
uiState->activeItem = id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
@ -61,7 +56,7 @@ i32 userInterface_button(UiState *const uiState, MemoryArena_ *const arena,
|
|||||||
if (uiState->activeItem == id)
|
if (uiState->activeItem == id)
|
||||||
{
|
{
|
||||||
buttonOffset = V2(1, 1);
|
buttonOffset = V2(1, 1);
|
||||||
buttonColor = V4(0.8f, 0.8f, 0.8f, 1);
|
buttonColor = V4(0.8f, 0.8f, 0.8f, 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -71,27 +66,25 @@ i32 userInterface_button(UiState *const uiState, MemoryArena_ *const arena,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* If no widget has keyboard focus, take it */
|
/* If no widget has keyboard focus, take it */
|
||||||
if (uiState->kbdItem == 0)
|
if (uiState->kbdItem == 0) uiState->kbdItem = id;
|
||||||
uiState->kbdItem = id;
|
|
||||||
|
|
||||||
v2 rectSize = math_rect_get_size(rect);
|
v2 rectSize = math_rectGetSize(rect);
|
||||||
/* If we have keyboard focus, show it */
|
/* If we have keyboard focus, show it */
|
||||||
if (uiState->kbdItem == id)
|
if (uiState->kbdItem == id)
|
||||||
{
|
{
|
||||||
// Draw outline
|
// Draw outline
|
||||||
renderer_staticRect(renderer,
|
renderer_rectFixed(renderer,
|
||||||
v2_add(V2(-2, -2), v2_add(buttonOffset, rect.min)),
|
v2_add(V2(-2, -2), v2_add(buttonOffset, rect.min)),
|
||||||
v2_add(V2(4, 4), rectSize), V2(0, 0), 0, NULL,
|
v2_add(V2(4, 4), rectSize), V2(0, 0), 0, NULL,
|
||||||
buttonColor, renderflag_no_texture);
|
buttonColor, renderflag_no_texture);
|
||||||
}
|
}
|
||||||
|
|
||||||
renderer_staticRect(renderer, v2_add(buttonOffset, rect.min),
|
renderer_rectFixed(renderer, v2_add(buttonOffset, rect.min), rectSize,
|
||||||
rectSize, V2(0, 0), 0, NULL,
|
V2(0, 0), 0, NULL, buttonColor, renderflag_no_texture);
|
||||||
buttonColor, renderflag_no_texture);
|
|
||||||
|
|
||||||
if (label)
|
if (label)
|
||||||
{
|
{
|
||||||
v2 labelDim = asset_stringDimInPixels(font, label);
|
v2 labelDim = asset_fontStringDimInPixels(font, label);
|
||||||
v2 labelPos = rect.min;
|
v2 labelPos = rect.min;
|
||||||
|
|
||||||
// Initially position the label to half the width of the button
|
// Initially position the label to half the width of the button
|
||||||
@ -104,14 +97,14 @@ i32 userInterface_button(UiState *const uiState, MemoryArena_ *const arena,
|
|||||||
if (labelDim.h < rectSize.h)
|
if (labelDim.h < rectSize.h)
|
||||||
{
|
{
|
||||||
labelPos.y += (rectSize.h * 0.5f);
|
labelPos.y += (rectSize.h * 0.5f);
|
||||||
labelPos.y -= (CAST(f32)labelDim.h * 0.5f);
|
labelPos.y -= (CAST(f32) labelDim.h * 0.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(doyle): We're using odd colors to overcome z-sorting by forcing
|
// TODO(doyle): We're using odd colors to overcome z-sorting by forcing
|
||||||
// button text into another render group
|
// button text into another render group
|
||||||
labelPos = v2_add(labelPos, buttonOffset);
|
labelPos = v2_add(labelPos, buttonOffset);
|
||||||
renderer_staticString(renderer, arena, font, label, labelPos, V2(0, 0),
|
renderer_stringFixed(renderer, arena, font, label, labelPos, V2(0, 0),
|
||||||
0, V4(0.9f, 0.9f, 0.9f, 0.9f), 0);
|
0, V4(0.9f, 0.9f, 0.9f, 0.9f), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// After renderering before click check, see if we need to process keys
|
// After renderering before click check, see if we need to process keys
|
||||||
@ -149,17 +142,16 @@ i32 userInterface_button(UiState *const uiState, MemoryArena_ *const arena,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
i32 userInterface_scrollbar(UiState *const uiState,
|
i32 ui_scrollbar(UiState *const uiState, AssetManager *const assetManager,
|
||||||
AssetManager *const assetManager,
|
Renderer *const renderer, const InputBuffer input,
|
||||||
Renderer *const renderer, const InputBuffer input,
|
const i32 id, const Rect scrollBarRect, i32 *const value,
|
||||||
const i32 id, const Rect scrollBarRect,
|
const i32 maxValue)
|
||||||
i32 *const value, const i32 maxValue)
|
|
||||||
{
|
{
|
||||||
#ifdef DENGINE_DEBUG
|
#ifdef DENGINE_DEBUG
|
||||||
ASSERT(*value <= maxValue);
|
ASSERT(*value <= maxValue);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (math_rect_contains_p(scrollBarRect, input.mouseP))
|
if (math_rectContainsP(scrollBarRect, input.mouseP))
|
||||||
{
|
{
|
||||||
uiState->hotItem = id;
|
uiState->hotItem = id;
|
||||||
if (uiState->activeItem == 0)
|
if (uiState->activeItem == 0)
|
||||||
@ -175,39 +167,38 @@ i32 userInterface_scrollbar(UiState *const uiState,
|
|||||||
RenderTex renderTex = renderer_createNullRenderTex(assetManager);
|
RenderTex renderTex = renderer_createNullRenderTex(assetManager);
|
||||||
|
|
||||||
/* If no widget has keyboard focus, take it */
|
/* If no widget has keyboard focus, take it */
|
||||||
if (uiState->kbdItem == 0)
|
if (uiState->kbdItem == 0) uiState->kbdItem = id;
|
||||||
uiState->kbdItem = id;
|
|
||||||
|
|
||||||
v2 rectSize = math_rect_get_size(scrollBarRect);
|
v2 rectSize = math_rectGetSize(scrollBarRect);
|
||||||
/* If we have keyboard focus, show it */
|
/* If we have keyboard focus, show it */
|
||||||
if (uiState->kbdItem == id)
|
if (uiState->kbdItem == id)
|
||||||
{
|
{
|
||||||
// Draw outline
|
// Draw outline
|
||||||
renderer_staticRect(renderer, v2_add(V2(-2, -2), scrollBarRect.min),
|
renderer_rectFixed(renderer, v2_add(V2(-2, -2), scrollBarRect.min),
|
||||||
v2_add(V2(4, 4), rectSize), V2(0, 0), 0,
|
v2_add(V2(4, 4), rectSize), V2(0, 0), 0, &renderTex,
|
||||||
&renderTex, V4(1, 0, 0, 1), 0);
|
V4(1, 0, 0, 1), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Render scroll bar background
|
// Render scroll bar background
|
||||||
renderer_staticRect(renderer, scrollBarRect.min, rectSize,
|
renderer_rectFixed(renderer, scrollBarRect.min, rectSize, V2(0, 0), 0,
|
||||||
V2(0, 0), 0, &renderTex, V4(0.75f, 0.5f, 0.5f, 1), 0);
|
&renderTex, V4(0.75f, 0.5f, 0.5f, 1), 0);
|
||||||
|
|
||||||
// Render scroll bar slider
|
// Render scroll bar slider
|
||||||
v2 sliderSize = V2(16, 16);
|
v2 sliderSize = V2(16, 16);
|
||||||
v4 sliderColor = V4(0, 0, 0, 1);
|
v4 sliderColor = V4(0, 0, 0, 1);
|
||||||
|
|
||||||
f32 sliderPercentageOffset = (CAST(f32) *value / CAST(f32) maxValue);
|
f32 sliderPercentageOffset = (CAST(f32) * value / CAST(f32) maxValue);
|
||||||
f32 sliderYOffsetToBar =
|
f32 sliderYOffsetToBar =
|
||||||
(rectSize.h - sliderSize.h) * sliderPercentageOffset;
|
(rectSize.h - sliderSize.h) * sliderPercentageOffset;
|
||||||
v2 sliderPos = v2_add(scrollBarRect.min, V2(0, sliderYOffsetToBar));
|
v2 sliderPos = v2_add(scrollBarRect.min, V2(0, sliderYOffsetToBar));
|
||||||
|
|
||||||
if (uiState->hotItem == id || uiState->activeItem == id)
|
if (uiState->hotItem == id || uiState->activeItem == id)
|
||||||
sliderColor = V4(1.0f, 0, 0, 1);
|
sliderColor = V4(1.0f, 0, 0, 1);
|
||||||
else
|
else
|
||||||
sliderColor = V4(0.0f, 1.0f, 0, 1);
|
sliderColor = V4(0.0f, 1.0f, 0, 1);
|
||||||
|
|
||||||
renderer_staticRect(renderer, sliderPos, sliderSize, V2(0, 0), 0, &renderTex,
|
renderer_rectFixed(renderer, sliderPos, sliderSize, V2(0, 0), 0, &renderTex,
|
||||||
sliderColor, 0);
|
sliderColor, 0);
|
||||||
|
|
||||||
if (uiState->kbdItem == id)
|
if (uiState->kbdItem == id)
|
||||||
{
|
{
|
||||||
@ -222,7 +213,8 @@ i32 userInterface_scrollbar(UiState *const uiState,
|
|||||||
uiState->keyEntered = keycode_null;
|
uiState->keyEntered = keycode_null;
|
||||||
break;
|
break;
|
||||||
case keycode_up:
|
case keycode_up:
|
||||||
// TODO(doyle): Fix input for this to work, i.e. proper rate limited input poll
|
// TODO(doyle): Fix input for this to work, i.e. proper rate limited
|
||||||
|
// input poll
|
||||||
if (*value < maxValue)
|
if (*value < maxValue)
|
||||||
{
|
{
|
||||||
(*value)++;
|
(*value)++;
|
||||||
@ -251,10 +243,9 @@ i32 userInterface_scrollbar(UiState *const uiState,
|
|||||||
else if (mouseYRelToRect > rectSize.h)
|
else if (mouseYRelToRect > rectSize.h)
|
||||||
mouseYRelToRect = rectSize.h;
|
mouseYRelToRect = rectSize.h;
|
||||||
|
|
||||||
f32 newSliderPercentOffset =
|
f32 newSliderPercentOffset = (CAST(f32) mouseYRelToRect / rectSize.h);
|
||||||
(CAST(f32) mouseYRelToRect / rectSize.h);
|
|
||||||
|
|
||||||
i32 newValue = CAST(i32)(newSliderPercentOffset * CAST(f32)maxValue);
|
i32 newValue = CAST(i32)(newSliderPercentOffset * CAST(f32) maxValue);
|
||||||
if (newValue != *value)
|
if (newValue != *value)
|
||||||
{
|
{
|
||||||
*value = newValue;
|
*value = newValue;
|
||||||
@ -265,16 +256,15 @@ i32 userInterface_scrollbar(UiState *const uiState,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
i32 userInterface_textField(UiState *const uiState, MemoryArena_ *const arena,
|
i32 ui_textfield(UiState *const uiState, MemoryArena_ *const arena,
|
||||||
AssetManager *const assetManager,
|
AssetManager *const assetManager, Renderer *const renderer,
|
||||||
Renderer *const renderer, Font *const font,
|
Font *const font, InputBuffer input, const i32 id,
|
||||||
InputBuffer input, const i32 id, const Rect rect,
|
const Rect rect, char *const string)
|
||||||
char *const string)
|
|
||||||
{
|
{
|
||||||
i32 strLen = common_strlen(string);
|
i32 strLen = common_strlen(string);
|
||||||
b32 changed = FALSE;
|
b32 changed = FALSE;
|
||||||
|
|
||||||
if (math_rect_contains_p(rect, input.mouseP))
|
if (math_rectContainsP(rect, input.mouseP))
|
||||||
{
|
{
|
||||||
uiState->hotItem = id;
|
uiState->hotItem = id;
|
||||||
if (uiState->activeItem == 0)
|
if (uiState->activeItem == 0)
|
||||||
@ -288,37 +278,36 @@ i32 userInterface_textField(UiState *const uiState, MemoryArena_ *const arena,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* If no widget has keyboard focus, take it */
|
/* If no widget has keyboard focus, take it */
|
||||||
if (uiState->kbdItem == 0)
|
if (uiState->kbdItem == 0) uiState->kbdItem = id;
|
||||||
uiState->kbdItem = id;
|
|
||||||
|
|
||||||
v2 rectSize = math_rect_get_size(rect);
|
v2 rectSize = math_rectGetSize(rect);
|
||||||
/* If we have keyboard focus, show it */
|
/* If we have keyboard focus, show it */
|
||||||
if (uiState->kbdItem == id)
|
if (uiState->kbdItem == id)
|
||||||
{
|
{
|
||||||
// Draw outline
|
// Draw outline
|
||||||
renderer_staticRect(renderer, v2_add(V2(-2, -2), rect.min),
|
renderer_rectFixed(renderer, v2_add(V2(-2, -2), rect.min),
|
||||||
v2_add(V2(4, 4), rectSize), V2(0, 0), 0,
|
v2_add(V2(4, 4), rectSize), V2(0, 0), 0, NULL,
|
||||||
NULL, V4(1.0f, 0, 0, 1), 0);
|
V4(1.0f, 0, 0, 1), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Render text field
|
// Render text field
|
||||||
renderer_staticRect(renderer, rect.min, rectSize, V2(0, 0), 0, NULL,
|
renderer_rectFixed(renderer, rect.min, rectSize, V2(0, 0), 0, NULL,
|
||||||
V4(0.75f, 0.5f, 0.5f, 1), 0);
|
V4(0.75f, 0.5f, 0.5f, 1), 0);
|
||||||
|
|
||||||
if (uiState->activeItem == id || uiState->hotItem == id)
|
if (uiState->activeItem == id || uiState->hotItem == id)
|
||||||
{
|
{
|
||||||
renderer_staticRect(renderer, rect.min, rectSize, V2(0, 0), 0,
|
renderer_rectFixed(renderer, rect.min, rectSize, V2(0, 0), 0, NULL,
|
||||||
NULL, V4(0.75f, 0.75f, 0.0f, 1), 0);
|
V4(0.75f, 0.75f, 0.0f, 1), 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
renderer_staticRect(renderer, rect.min, rectSize, V2(0, 0), 0,
|
renderer_rectFixed(renderer, rect.min, rectSize, V2(0, 0), 0, NULL,
|
||||||
NULL, V4(0.5f, 0.5f, 0.5f, 1), 0);
|
V4(0.5f, 0.5f, 0.5f, 1), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
v2 strPos = rect.min;
|
v2 strPos = rect.min;
|
||||||
renderer_staticString(renderer, arena, font, string, strPos, V2(0, 0), 0,
|
renderer_stringFixed(renderer, arena, font, string, strPos, V2(0, 0), 0,
|
||||||
V4(0, 0, 0, 1), 0);
|
V4(0, 0, 0, 1), 0);
|
||||||
|
|
||||||
if (uiState->kbdItem == id)
|
if (uiState->kbdItem == id)
|
||||||
{
|
{
|
||||||
@ -336,7 +325,7 @@ i32 userInterface_textField(UiState *const uiState, MemoryArena_ *const arena,
|
|||||||
if (strLen > 0)
|
if (strLen > 0)
|
||||||
{
|
{
|
||||||
string[--strLen] = 0;
|
string[--strLen] = 0;
|
||||||
changed = TRUE;
|
changed = TRUE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -347,8 +336,8 @@ i32 userInterface_textField(UiState *const uiState, MemoryArena_ *const arena,
|
|||||||
uiState->keyChar <= keycode_tilda && strLen < 30)
|
uiState->keyChar <= keycode_tilda && strLen < 30)
|
||||||
{
|
{
|
||||||
string[strLen++] = uiState->keyChar + ' ';
|
string[strLen++] = uiState->keyChar + ' ';
|
||||||
string[strLen] = 0;
|
string[strLen] = 0;
|
||||||
changed = TRUE;
|
changed = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,10 +1,10 @@
|
|||||||
#include "Dengine/AssetManager.h"
|
#include "Dengine/AssetManager.h"
|
||||||
|
#include "Dengine/Asteroid.h"
|
||||||
#include "Dengine/Common.h"
|
#include "Dengine/Common.h"
|
||||||
#include "Dengine/Debug.h"
|
#include "Dengine/Debug.h"
|
||||||
#include "Dengine/Math.h"
|
#include "Dengine/Math.h"
|
||||||
#include "Dengine/OpenGL.h"
|
|
||||||
#include "Dengine/MemoryArena.h"
|
#include "Dengine/MemoryArena.h"
|
||||||
#include "Dengine/Asteroid.h"
|
#include "Dengine/OpenGL.h"
|
||||||
|
|
||||||
INTERNAL inline void processKey(KeyState *state, int action)
|
INTERNAL inline void processKey(KeyState *state, int action)
|
||||||
{
|
{
|
||||||
|
@ -2,8 +2,6 @@
|
|||||||
#define DENGINE_ASSET_MANAGER_H
|
#define DENGINE_ASSET_MANAGER_H
|
||||||
|
|
||||||
#include "Dengine/Assets.h"
|
#include "Dengine/Assets.h"
|
||||||
#include "Dengine/Shader.h"
|
|
||||||
#include "Dengine/Texture.h"
|
|
||||||
|
|
||||||
/* Forward declaration */
|
/* Forward declaration */
|
||||||
typedef struct MemoryArena MemoryArena_;
|
typedef struct MemoryArena MemoryArena_;
|
||||||
@ -33,15 +31,15 @@ void asset_init(AssetManager *assetManager, MemoryArena_ *arena);
|
|||||||
* Texture Operations
|
* Texture Operations
|
||||||
*********************************
|
*********************************
|
||||||
*/
|
*/
|
||||||
const SubTexture asset_getAtlasSubTex(TexAtlas *const atlas,
|
const SubTexture asset_atlasGetSubTex(TexAtlas *const atlas,
|
||||||
const char *const key);
|
const char *const key);
|
||||||
Texture *asset_getTex(AssetManager *const assetManager, const char *const key);
|
Texture *asset_texGet(AssetManager *const assetManager, const char *const key);
|
||||||
TexAtlas *asset_getFreeTexAtlasSlot(AssetManager *const assetManager,
|
TexAtlas *asset_atlasGetFreeSlot(AssetManager *const assetManager,
|
||||||
MemoryArena_ *arena, const char *const key,
|
MemoryArena_ *arena, const char *const key,
|
||||||
i32 numSubTex);
|
i32 numSubTex);
|
||||||
TexAtlas *asset_getTexAtlas(AssetManager *const assetManager,
|
TexAtlas *asset_atlasGet(AssetManager *const assetManager,
|
||||||
const char *const key);
|
const char *const key);
|
||||||
Texture *asset_getFreeTexSlot(AssetManager *const assetManager,
|
Texture *asset_texGetFreeSlot(AssetManager *const assetManager,
|
||||||
MemoryArena_ *const arena, const char *const key);
|
MemoryArena_ *const arena, const char *const key);
|
||||||
Texture *asset_loadTextureImage(AssetManager *assetManager, MemoryArena_ *arena,
|
Texture *asset_loadTextureImage(AssetManager *assetManager, MemoryArena_ *arena,
|
||||||
const char *const path, const char *const key);
|
const char *const path, const char *const key);
|
||||||
@ -51,11 +49,11 @@ Texture *asset_loadTextureImage(AssetManager *assetManager, MemoryArena_ *arena,
|
|||||||
* Animation Asset Managing
|
* Animation Asset Managing
|
||||||
*********************************
|
*********************************
|
||||||
*/
|
*/
|
||||||
void asset_addAnimation(AssetManager *const assetManager,
|
void asset_animAdd(AssetManager *const assetManager,
|
||||||
MemoryArena_ *const arena, const char *const animName,
|
MemoryArena_ *const arena, const char *const animName,
|
||||||
TexAtlas *const atlas, char **const subTextureNames,
|
TexAtlas *const atlas, char **const subTextureNames,
|
||||||
const i32 numSubTextures, const f32 frameDuration);
|
const i32 numSubTextures, const f32 frameDuration);
|
||||||
Animation *asset_getAnim(AssetManager *const assetManager,
|
Animation *asset_animGet(AssetManager *const assetManager,
|
||||||
const char *const key);
|
const char *const key);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -63,9 +61,9 @@ Animation *asset_getAnim(AssetManager *const assetManager,
|
|||||||
* Audio
|
* Audio
|
||||||
*********************************
|
*********************************
|
||||||
*/
|
*/
|
||||||
AudioVorbis *const asset_getVorbis(AssetManager *const assetManager,
|
AudioVorbis *const asset_vorbisGet(AssetManager *const assetManager,
|
||||||
const char *const key);
|
const char *const key);
|
||||||
const i32 asset_loadVorbis(AssetManager *assetManager, MemoryArena_ *arena,
|
const i32 asset_vorbisLoad(AssetManager *assetManager, MemoryArena_ *arena,
|
||||||
const char *const path, const char *const key);
|
const char *const path, const char *const key);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -73,28 +71,28 @@ const i32 asset_loadVorbis(AssetManager *assetManager, MemoryArena_ *arena,
|
|||||||
* Everything else
|
* Everything else
|
||||||
*********************************
|
*********************************
|
||||||
*/
|
*/
|
||||||
const i32 asset_loadXmlFile(AssetManager *const assetManager,
|
const i32 asset_xmlLoad(AssetManager *const assetManager,
|
||||||
MemoryArena_ *const arena,
|
MemoryArena_ *const arena,
|
||||||
const PlatformFileRead *const fileRead);
|
const PlatformFileRead *const fileRead);
|
||||||
|
|
||||||
u32 asset_getShader(AssetManager *assetManager, const enum ShaderList type);
|
u32 asset_shaderGet(AssetManager *assetManager, const enum ShaderList type);
|
||||||
const i32 asset_loadShaderFiles(AssetManager *assetManager, MemoryArena_ *arena,
|
const i32 asset_shaderLoad(AssetManager *assetManager, MemoryArena_ *arena,
|
||||||
const char *const vertexPath,
|
const char *const vertexPath,
|
||||||
const char *const fragmentPath,
|
const char *const fragmentPath,
|
||||||
const enum ShaderList type);
|
const enum ShaderList type);
|
||||||
|
|
||||||
Font *asset_getFontCreateSizeOnDemand(AssetManager *assetManager,
|
Font *asset_fontGetOrCreateOnDemand(AssetManager *assetManager,
|
||||||
MemoryArena_ *persistentArena,
|
MemoryArena_ *persistentArena,
|
||||||
MemoryArena_ *transientArena, char *name,
|
MemoryArena_ *transientArena, char *name,
|
||||||
i32 size);
|
i32 size);
|
||||||
Font *asset_getFont(AssetManager *assetManager, char *name,
|
Font *asset_fontGet(AssetManager *assetManager, char *name,
|
||||||
i32 size);
|
i32 size);
|
||||||
const i32 asset_loadTTFont(AssetManager *assetManager,
|
const i32 asset_fontLoadTTF(AssetManager *assetManager,
|
||||||
MemoryArena_ *persistentArena,
|
MemoryArena_ *persistentArena,
|
||||||
MemoryArena_ *transientArena, char *filePath,
|
MemoryArena_ *transientArena, char *filePath,
|
||||||
char *name, i32 targetFontHeight);
|
char *name, i32 targetFontHeight);
|
||||||
|
|
||||||
const v2 asset_stringDimInPixels(const Font *const font,
|
const v2 asset_fontStringDimInPixels(const Font *const font,
|
||||||
const char *const string);
|
const char *const string);
|
||||||
|
|
||||||
void asset_unitTest(MemoryArena_ *arena);
|
void asset_unitTest(MemoryArena_ *arena);
|
||||||
|
@ -123,6 +123,34 @@ typedef struct Animation
|
|||||||
f32 frameDuration;
|
f32 frameDuration;
|
||||||
} Animation;
|
} Animation;
|
||||||
|
|
||||||
|
#define TARGET_TEXTURE_SIZE 1024
|
||||||
|
#define TARGET_BYTES_PER_PIXEL 4
|
||||||
|
|
||||||
|
// TODO(doyle): Look into merging into assets.h file ..
|
||||||
|
typedef struct Texture
|
||||||
|
{
|
||||||
|
// Holds the ID of the texture object, used for all texture operations to
|
||||||
|
// reference to this particlar texture
|
||||||
|
u32 id;
|
||||||
|
|
||||||
|
// Texture image dimensions
|
||||||
|
u32 width;
|
||||||
|
u32 height;
|
||||||
|
|
||||||
|
// Texture Format
|
||||||
|
u32 internalFormat; // Format of texture object
|
||||||
|
u32 imageFormat; // Format of loaded image
|
||||||
|
|
||||||
|
// Texture configuration
|
||||||
|
u32 wrapS; // Wrapping mode on S axis
|
||||||
|
u32 wrapT; // Wrapping mode on T axis
|
||||||
|
|
||||||
|
// Filtering mode if texture pixels < screen pixels
|
||||||
|
u32 filterMinification;
|
||||||
|
// Filtering mode if texture pixels > screen pixels
|
||||||
|
u32 filterMagnification;
|
||||||
|
} Texture;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*********************************
|
*********************************
|
||||||
* Font
|
* Font
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
#include "Dengine/MemoryArena.h"
|
#include "Dengine/MemoryArena.h"
|
||||||
#include "Dengine/Platform.h"
|
#include "Dengine/Platform.h"
|
||||||
#include "Dengine/Renderer.h"
|
#include "Dengine/Renderer.h"
|
||||||
#include "Dengine/UserInterface.h"
|
#include "Dengine/Ui.h"
|
||||||
|
|
||||||
enum AppState
|
enum AppState
|
||||||
{
|
{
|
||||||
|
@ -49,17 +49,17 @@ typedef struct AudioRenderer
|
|||||||
|
|
||||||
|
|
||||||
const i32 audio_init(AudioManager *audioManager);
|
const i32 audio_init(AudioManager *audioManager);
|
||||||
const i32 audio_playVorbis(MemoryArena_ *arena, AudioManager *audioManager,
|
const i32 audio_vorbisPlay(MemoryArena_ *arena, AudioManager *audioManager,
|
||||||
AudioRenderer *audioRenderer, AudioVorbis *vorbis,
|
AudioRenderer *audioRenderer, AudioVorbis *vorbis,
|
||||||
i32 numPlays);
|
i32 numPlays);
|
||||||
const i32 audio_streamPlayVorbis(MemoryArena_ *arena, AudioManager *audioManager,
|
const i32 audio_vorbisStream(MemoryArena_ *arena, AudioManager *audioManager,
|
||||||
AudioRenderer *audioRenderer,
|
AudioRenderer *audioRenderer,
|
||||||
AudioVorbis *vorbis, i32 numPlays);
|
AudioVorbis *vorbis, i32 numPlays);
|
||||||
const i32 audio_stopVorbis(MemoryArena_ *arena, AudioManager *audioManager,
|
const i32 audio_vorbisStop(MemoryArena_ *arena, AudioManager *audioManager,
|
||||||
AudioRenderer *audioRenderer);
|
AudioRenderer *audioRenderer);
|
||||||
const i32 audio_pauseVorbis(AudioManager *audioManager,
|
const i32 audio_vorbisPause(AudioManager *audioManager,
|
||||||
AudioRenderer *audioRenderer);
|
AudioRenderer *audioRenderer);
|
||||||
const i32 audio_resumeVorbis(AudioManager *audioManager,
|
const i32 audio_vorbisResume(AudioManager *audioManager,
|
||||||
AudioRenderer *audioRenderer);
|
AudioRenderer *audioRenderer);
|
||||||
const i32 audio_updateAndPlay(MemoryArena_ *arena, AudioManager *audioManager,
|
const i32 audio_updateAndPlay(MemoryArena_ *arena, AudioManager *audioManager,
|
||||||
AudioRenderer *audioRenderer);
|
AudioRenderer *audioRenderer);
|
||||||
|
@ -110,10 +110,10 @@ typedef struct Entity
|
|||||||
i32 animListIndex;
|
i32 animListIndex;
|
||||||
} Entity;
|
} Entity;
|
||||||
|
|
||||||
SubTexture entity_getActiveSubTexture(Entity *const entity);
|
SubTexture entity_subTexGetCurr(Entity *const entity);
|
||||||
void entity_setActiveAnim(Entity *const entity, const char *const animName);
|
void entity_animSet(Entity *const entity, const char *const animName);
|
||||||
void entity_updateAnim(Entity *const entity, const f32 dt);
|
void entity_animUpdate(Entity *const entity, const f32 dt);
|
||||||
void entity_addAnim(AssetManager *const assetManager, Entity *const entity,
|
void entity_animAdd(AssetManager *const assetManager, Entity *const entity,
|
||||||
const char *const animName);
|
const char *const animName);
|
||||||
|
|
||||||
v2 *entity_generateUpdatedVertexList(MemoryArena_ *transientArena,
|
v2 *entity_generateUpdatedVertexList(MemoryArena_ *transientArena,
|
||||||
|
@ -331,7 +331,7 @@ INTERNAL inline mat4 mat4_mul(const mat4 a, const mat4 b)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
INTERNAL inline v4 mat4_mul_v4(const mat4 a, const v4 b)
|
INTERNAL inline v4 mat4_mulV4(const mat4 a, const v4 b)
|
||||||
{
|
{
|
||||||
v4 result = {0};
|
v4 result = {0};
|
||||||
|
|
||||||
@ -347,7 +347,7 @@ INTERNAL inline v4 mat4_mul_v4(const mat4 a, const v4 b)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERNAL inline b32 math_rect_contains_p(Rect rect, v2 p)
|
INTERNAL inline b32 math_rectContainsP(Rect rect, v2 p)
|
||||||
{
|
{
|
||||||
b32 outsideOfRectX = FALSE;
|
b32 outsideOfRectX = FALSE;
|
||||||
if (p.x < rect.min.x || p.x > rect.max.w)
|
if (p.x < rect.min.x || p.x > rect.max.w)
|
||||||
@ -362,7 +362,7 @@ INTERNAL inline b32 math_rect_contains_p(Rect rect, v2 p)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
INTERNAL inline Rect math_rect_create(v2 origin, v2 size)
|
INTERNAL inline Rect math_rectCreate(v2 origin, v2 size)
|
||||||
{
|
{
|
||||||
Rect result = {0};
|
Rect result = {0};
|
||||||
result.min = origin;
|
result.min = origin;
|
||||||
@ -371,7 +371,7 @@ INTERNAL inline Rect math_rect_create(v2 origin, v2 size)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERNAL inline v2 math_rect_get_size(Rect rect)
|
INTERNAL inline v2 math_rectGetSize(Rect rect)
|
||||||
{
|
{
|
||||||
f32 width = ABS(rect.max.x - rect.min.x);
|
f32 width = ABS(rect.max.x - rect.min.x);
|
||||||
f32 height = ABS(rect.max.y - rect.min.y);
|
f32 height = ABS(rect.max.y - rect.min.y);
|
||||||
@ -381,7 +381,7 @@ INTERNAL inline v2 math_rect_get_size(Rect rect)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERNAL inline v2 math_rect_get_centre(Rect rect)
|
INTERNAL inline v2 math_rectGetCentre(Rect rect)
|
||||||
{
|
{
|
||||||
f32 sumX = rect.min.x + rect.max.x;
|
f32 sumX = rect.min.x + rect.max.x;
|
||||||
f32 sumY = rect.min.y + rect.max.y;
|
f32 sumY = rect.min.y + rect.max.y;
|
||||||
@ -390,7 +390,7 @@ INTERNAL inline v2 math_rect_get_centre(Rect rect)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERNAL inline Rect math_rect_shift(Rect rect, v2 shift)
|
INTERNAL inline Rect math_rectShift(Rect rect, v2 shift)
|
||||||
{
|
{
|
||||||
Rect result = {0};
|
Rect result = {0};
|
||||||
result.min = v2_add(rect.min, shift);
|
result.min = v2_add(rect.min, shift);
|
||||||
|
@ -29,8 +29,8 @@ typedef struct TempMemory
|
|||||||
MemoryIndex used;
|
MemoryIndex used;
|
||||||
} TempMemory;
|
} TempMemory;
|
||||||
|
|
||||||
TempMemory memory_begin_temporary_region(MemoryArena_ *arena);
|
TempMemory memory_beginTempRegion(MemoryArena_ *arena);
|
||||||
void memory_end_temporary_region(TempMemory tempMemory);
|
void memory_endTempRegion(TempMemory tempMemory);
|
||||||
|
|
||||||
#define MEMORY_PUSH_STRUCT(arena, type) (type *)memory_pushBytes(arena, sizeof(type))
|
#define MEMORY_PUSH_STRUCT(arena, type) (type *)memory_pushBytes(arena, sizeof(type))
|
||||||
#define MEMORY_PUSH_ARRAY(arena, count, type) (type *)memory_pushBytes(arena, (count)*sizeof(type))
|
#define MEMORY_PUSH_ARRAY(arena, count, type) (type *)memory_pushBytes(arena, (count)*sizeof(type))
|
||||||
|
@ -184,7 +184,7 @@ enum ReadKeyType
|
|||||||
readkeytype_repeat,
|
readkeytype_repeat,
|
||||||
readkeytype_count,
|
readkeytype_count,
|
||||||
};
|
};
|
||||||
void platform_processInputBuffer(InputBuffer *inputBuffer, f32 dt);
|
void platform_inputBufferProcess(InputBuffer *inputBuffer, f32 dt);
|
||||||
b32 platform_queryKey(KeyState *key, enum ReadKeyType readType,
|
b32 platform_queryKey(KeyState *key, enum ReadKeyType readType,
|
||||||
f32 delayInterval);
|
f32 delayInterval);
|
||||||
#endif
|
#endif
|
||||||
|
@ -100,7 +100,7 @@ void renderer_polygon(Renderer *const renderer, Rect camera, v2 *polygonPoints,
|
|||||||
i32 numPoints, v2 pivotPoint, Radians rotate,
|
i32 numPoints, v2 pivotPoint, Radians rotate,
|
||||||
RenderTex *renderTex, v4 color, RenderFlags flags);
|
RenderTex *renderTex, v4 color, RenderFlags flags);
|
||||||
|
|
||||||
inline void renderer_staticRect(Renderer *const renderer, v2 pos, v2 size,
|
inline void renderer_rectFixed(Renderer *const renderer, v2 pos, v2 size,
|
||||||
v2 pivotPoint, Radians rotate,
|
v2 pivotPoint, Radians rotate,
|
||||||
RenderTex *renderTex, v4 color,
|
RenderTex *renderTex, v4 color,
|
||||||
RenderFlags flags)
|
RenderFlags flags)
|
||||||
@ -115,7 +115,7 @@ void renderer_string(Renderer *const renderer, MemoryArena_ *arena, Rect camera,
|
|||||||
v2 pivotPoint, Radians rotate, v4 color,
|
v2 pivotPoint, Radians rotate, v4 color,
|
||||||
RenderFlags flags);
|
RenderFlags flags);
|
||||||
|
|
||||||
inline void renderer_staticString(Renderer *const renderer, MemoryArena_ *arena,
|
inline void renderer_stringFixed(Renderer *const renderer, MemoryArena_ *arena,
|
||||||
Font *const font, const char *const string,
|
Font *const font, const char *const string,
|
||||||
v2 pos, v2 pivotPoint, Radians rotate,
|
v2 pos, v2 pivotPoint, Radians rotate,
|
||||||
v4 color, RenderFlags flags)
|
v4 color, RenderFlags flags)
|
||||||
|
@ -1,16 +0,0 @@
|
|||||||
#ifndef DENGINE_SHADER_H
|
|
||||||
#define DENGINE_SHADER_H
|
|
||||||
|
|
||||||
#include "Dengine/Math.h"
|
|
||||||
#include "Dengine/OpenGL.h"
|
|
||||||
|
|
||||||
void shader_uniformSet1i(u32 shaderId, const GLchar *name,
|
|
||||||
const GLuint data);
|
|
||||||
void shader_uniformSetMat4fv(u32 shaderId, const GLchar *name,
|
|
||||||
mat4 data);
|
|
||||||
void shader_uniformSetVec4f(u32 shaderId, const GLchar *name,
|
|
||||||
v4 data);
|
|
||||||
|
|
||||||
void shader_use(u32 shaderId);
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,39 +0,0 @@
|
|||||||
#ifndef DENGINE_TEXTURE_H
|
|
||||||
#define DENGINE_TEXTURE_H
|
|
||||||
|
|
||||||
#include "Dengine/Common.h"
|
|
||||||
#include "Dengine/OpenGL.h"
|
|
||||||
|
|
||||||
#define TARGET_TEXTURE_SIZE 1024
|
|
||||||
#define TARGET_BYTES_PER_PIXEL 4
|
|
||||||
|
|
||||||
// TODO(doyle): Look into merging into assets.h file ..
|
|
||||||
typedef struct Texture
|
|
||||||
{
|
|
||||||
// Holds the ID of the texture object, used for all texture operations to
|
|
||||||
// reference to this particlar texture
|
|
||||||
GLuint id;
|
|
||||||
|
|
||||||
// Texture image dimensions
|
|
||||||
GLuint width;
|
|
||||||
GLuint height;
|
|
||||||
|
|
||||||
// Texture Format
|
|
||||||
GLuint internalFormat; // Format of texture object
|
|
||||||
GLuint imageFormat; // Format of loaded image
|
|
||||||
|
|
||||||
// Texture configuration
|
|
||||||
GLuint wrapS; // Wrapping mode on S axis
|
|
||||||
GLuint wrapT; // Wrapping mode on T axis
|
|
||||||
|
|
||||||
// Filtering mode if texture pixels < screen pixels
|
|
||||||
GLuint filterMinification;
|
|
||||||
// Filtering mode if texture pixels > screen pixels
|
|
||||||
GLuint filterMagnification;
|
|
||||||
} Texture;
|
|
||||||
|
|
||||||
// Generates texture from image data
|
|
||||||
Texture texture_gen(const GLuint width, const GLuint height,
|
|
||||||
const GLint bytesPerPixel, const u8 *const image);
|
|
||||||
|
|
||||||
#endif
|
|
78
src/include/Dengine/Ui.h
Normal file
78
src/include/Dengine/Ui.h
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
#ifndef DENGINE_USER_INTERFACE_H
|
||||||
|
#define DENGINE_USER_INTERFACE_H
|
||||||
|
|
||||||
|
#include "Dengine/Common.h"
|
||||||
|
#include "Dengine/Math.h"
|
||||||
|
#include "Dengine/Platform.h"
|
||||||
|
|
||||||
|
/* Forward Declaration */
|
||||||
|
typedef struct AssetManager AssetManager;
|
||||||
|
typedef struct Font Font;
|
||||||
|
typedef struct MemoryArena MemoryArena_;
|
||||||
|
typedef struct Renderer Renderer;
|
||||||
|
typedef struct GameState GameState;
|
||||||
|
|
||||||
|
enum UiType
|
||||||
|
{
|
||||||
|
uitype_button,
|
||||||
|
uitype_scrollbar,
|
||||||
|
uitype_textField,
|
||||||
|
uitype_string,
|
||||||
|
uitype_count,
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct UiItem
|
||||||
|
{
|
||||||
|
i32 id;
|
||||||
|
char label[64];
|
||||||
|
enum UiType type;
|
||||||
|
|
||||||
|
Rect rect;
|
||||||
|
|
||||||
|
// TODO(doyle): ECS this? Not all elements need
|
||||||
|
i32 value;
|
||||||
|
i32 maxValue;
|
||||||
|
char string[80];
|
||||||
|
} UiItem;
|
||||||
|
|
||||||
|
typedef struct UiState
|
||||||
|
{
|
||||||
|
i32 uniqueId;
|
||||||
|
|
||||||
|
UiItem uiList[128];
|
||||||
|
i32 numItems;
|
||||||
|
|
||||||
|
i32 hotItem;
|
||||||
|
i32 activeItem;
|
||||||
|
i32 lastWidget;
|
||||||
|
|
||||||
|
i32 kbdItem;
|
||||||
|
enum KeyCode keyEntered;
|
||||||
|
enum KeyCode keyMod;
|
||||||
|
enum KeyCode keyChar;
|
||||||
|
} UiState;
|
||||||
|
|
||||||
|
inline i32 ui_generateId(UiState *const uiState)
|
||||||
|
{
|
||||||
|
i32 result = uiState->uniqueId++;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ui_beginState(UiState *state);
|
||||||
|
void ui_endState(UiState *state, InputBuffer *input);
|
||||||
|
|
||||||
|
i32 ui_button(UiState *const uiState, MemoryArena_ *const arena,
|
||||||
|
AssetManager *const assetManager, Renderer *const renderer,
|
||||||
|
Font *const font, const InputBuffer input, const i32 id,
|
||||||
|
const Rect rect, const char *const label);
|
||||||
|
|
||||||
|
i32 ui_textfield(UiState *const uiState, MemoryArena_ *const arena,
|
||||||
|
AssetManager *const assetManager, Renderer *const renderer,
|
||||||
|
Font *const font, InputBuffer input, const i32 id,
|
||||||
|
const Rect rect, char *const string);
|
||||||
|
|
||||||
|
i32 ui_scrollbar(UiState *const uiState, AssetManager *const assetManager,
|
||||||
|
Renderer *const renderer, const InputBuffer input,
|
||||||
|
const i32 id, const Rect scrollBarRect, i32 *const value,
|
||||||
|
const i32 maxValue);
|
||||||
|
#endif
|
@ -1,81 +0,0 @@
|
|||||||
#ifndef DENGINE_USER_INTERFACE_H
|
|
||||||
#define DENGINE_USER_INTERFACE_H
|
|
||||||
|
|
||||||
#include "Dengine/Common.h"
|
|
||||||
#include "Dengine/Math.h"
|
|
||||||
#include "Dengine/Platform.h"
|
|
||||||
|
|
||||||
/* Forward Declaration */
|
|
||||||
typedef struct AssetManager AssetManager;
|
|
||||||
typedef struct Font Font;
|
|
||||||
typedef struct MemoryArena MemoryArena_;
|
|
||||||
typedef struct Renderer Renderer;
|
|
||||||
typedef struct GameState GameState;
|
|
||||||
|
|
||||||
enum UiType
|
|
||||||
{
|
|
||||||
uitype_button,
|
|
||||||
uitype_scrollbar,
|
|
||||||
uitype_textField,
|
|
||||||
uitype_string,
|
|
||||||
uitype_count,
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct UiItem
|
|
||||||
{
|
|
||||||
i32 id;
|
|
||||||
char label[64];
|
|
||||||
enum UiType type;
|
|
||||||
|
|
||||||
Rect rect;
|
|
||||||
|
|
||||||
// TODO(doyle): ECS this? Not all elements need
|
|
||||||
i32 value;
|
|
||||||
i32 maxValue;
|
|
||||||
char string[80];
|
|
||||||
} UiItem;
|
|
||||||
|
|
||||||
typedef struct UiState
|
|
||||||
{
|
|
||||||
i32 uniqueId;
|
|
||||||
|
|
||||||
UiItem uiList[128];
|
|
||||||
i32 numItems;
|
|
||||||
|
|
||||||
i32 hotItem;
|
|
||||||
i32 activeItem;
|
|
||||||
i32 lastWidget;
|
|
||||||
|
|
||||||
i32 kbdItem;
|
|
||||||
enum KeyCode keyEntered;
|
|
||||||
enum KeyCode keyMod;
|
|
||||||
enum KeyCode keyChar;
|
|
||||||
} UiState;
|
|
||||||
|
|
||||||
inline i32 userInterface_generateId(UiState *const uiState)
|
|
||||||
{
|
|
||||||
i32 result = uiState->uniqueId++;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void userInterface_beginState(UiState *state);
|
|
||||||
void userInterface_endState(UiState *state, InputBuffer *input);
|
|
||||||
|
|
||||||
i32 userInterface_button(UiState *const uiState, MemoryArena_ *const arena,
|
|
||||||
AssetManager *const assetManager,
|
|
||||||
Renderer *const renderer, Font *const font,
|
|
||||||
const InputBuffer input, const i32 id, const Rect rect,
|
|
||||||
const char *const label);
|
|
||||||
|
|
||||||
i32 userInterface_textField(UiState *const uiState, MemoryArena_ *const arena,
|
|
||||||
AssetManager *const assetManager,
|
|
||||||
Renderer *const renderer, Font *const font,
|
|
||||||
InputBuffer input, const i32 id, const Rect rect,
|
|
||||||
char *const string);
|
|
||||||
|
|
||||||
i32 userInterface_scrollbar(UiState *const uiState,
|
|
||||||
AssetManager *const assetManager,
|
|
||||||
Renderer *const renderer, const InputBuffer input,
|
|
||||||
const i32 id, const Rect scrollBarRect,
|
|
||||||
i32 *const value, const i32 maxValue);
|
|
||||||
#endif
|
|
Loading…
Reference in New Issue
Block a user