mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-16 11:06:06 -04:00
C client: Minor code cleanup
This commit is contained in:
parent
ab8a35f7c7
commit
6eb08b70e2
@ -1,19 +0,0 @@
|
|||||||
#include "2DStructs.h"
|
|
||||||
|
|
||||||
struct Rectangle2D Rectangle2D_Make(Int32 x, Int32 y, Int32 width, Int32 height) {
|
|
||||||
struct Rectangle2D r;
|
|
||||||
r.X = x; r.Y = y; r.Width = width; r.Height = height;
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Rectangle2D_Equals(struct Rectangle2D a, struct Rectangle2D b) {
|
|
||||||
return a.X == b.X && a.Y == b.Y && a.Width == b.Width && a.Height == b.Height;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Size2D Size2D_Make(Int32 width, Int32 height) {
|
|
||||||
struct Size2D s; s.Width = width; s.Height = height; return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Point2D Point2D_Make(Int32 x, Int32 y) {
|
|
||||||
struct Point2D p; p.X = x; p.Y = y; return p;
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
#ifndef CC_2DSTRUCTS_H
|
|
||||||
#define CC_2DSTRUCTS_H
|
|
||||||
#include "Core.h"
|
|
||||||
/* Represents simple structures useful for 2D operations.
|
|
||||||
Copyright 2017 ClassicalSharp | Licensed under BSD-3
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct Rectangle2D { Int32 X, Y, Width, Height; };
|
|
||||||
struct Rectangle2D Rectangle2D_Empty;
|
|
||||||
|
|
||||||
struct Point2D { Int32 X, Y; };
|
|
||||||
struct Point2D Point2D_Empty;
|
|
||||||
|
|
||||||
struct Size2D { Int32 Width, Height; };
|
|
||||||
struct Size2D Size2D_Empty;
|
|
||||||
|
|
||||||
struct Rectangle2D Rectangle2D_Make(Int32 x, Int32 y, Int32 width, Int32 height);
|
|
||||||
bool Rectangle2D_Equals(struct Rectangle2D a, struct Rectangle2D b);
|
|
||||||
|
|
||||||
struct Size2D Size2D_Make(Int32 width, Int32 height);
|
|
||||||
struct Point2D Point2D_Make(Int32 x, Int32 y);
|
|
||||||
|
|
||||||
struct TextureRec { Real32 U1, V1, U2, V2; };
|
|
||||||
#endif
|
|
@ -11,6 +11,7 @@
|
|||||||
#include "ErrorHandler.h"
|
#include "ErrorHandler.h"
|
||||||
#include "Errors.h"
|
#include "Errors.h"
|
||||||
#include "Stream.h"
|
#include "Stream.h"
|
||||||
|
#include "Bitmap.h"
|
||||||
#define LIQUID_ANIM_MAX 64
|
#define LIQUID_ANIM_MAX 64
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
@ -142,7 +143,7 @@ struct AnimationData {
|
|||||||
Int16 Tick, TickDelay;
|
Int16 Tick, TickDelay;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Bitmap anims_bmp;
|
Bitmap anims_bmp;
|
||||||
struct AnimationData anims_list[ATLAS1D_MAX_ATLASES];
|
struct AnimationData anims_list[ATLAS1D_MAX_ATLASES];
|
||||||
Int32 anims_count;
|
Int32 anims_count;
|
||||||
bool anims_validated, anims_useLavaAnim, anims_useWaterAnim;
|
bool anims_validated, anims_useLavaAnim, anims_useWaterAnim;
|
||||||
@ -215,7 +216,7 @@ static void Animations_Draw(struct AnimationData* data, TextureLoc texLoc, Int32
|
|||||||
|
|
||||||
Int32 index_1D = Atlas1D_Index(texLoc);
|
Int32 index_1D = Atlas1D_Index(texLoc);
|
||||||
Int32 rowId_1D = Atlas1D_RowId(texLoc);
|
Int32 rowId_1D = Atlas1D_RowId(texLoc);
|
||||||
struct Bitmap animPart; Bitmap_Create(&animPart, size, size, buffer);
|
Bitmap animPart; Bitmap_Create(&animPart, size, size, buffer);
|
||||||
|
|
||||||
if (!data) {
|
if (!data) {
|
||||||
if (texLoc == 30) {
|
if (texLoc == 30) {
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
#define CC_ASYNCDOWNLOADER_H
|
#define CC_ASYNCDOWNLOADER_H
|
||||||
#include "Constants.h"
|
#include "Constants.h"
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
#include "Bitmap.h"
|
|
||||||
/* Downloads images, texture packs, skins, etc in async manner.
|
/* Downloads images, texture packs, skins, etc in async manner.
|
||||||
Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
|
Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
|
||||||
*/
|
*/
|
||||||
|
14
src/Bitmap.c
14
src/Bitmap.c
@ -7,11 +7,11 @@
|
|||||||
#include "Stream.h"
|
#include "Stream.h"
|
||||||
#include "Errors.h"
|
#include "Errors.h"
|
||||||
|
|
||||||
void Bitmap_Create(struct Bitmap* bmp, Int32 width, Int32 height, UInt8* scan0) {
|
void Bitmap_Create(Bitmap* bmp, Int32 width, Int32 height, UInt8* scan0) {
|
||||||
bmp->Width = width; bmp->Height = height; bmp->Scan0 = scan0;
|
bmp->Width = width; bmp->Height = height; bmp->Scan0 = scan0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bitmap_CopyBlock(Int32 srcX, Int32 srcY, Int32 dstX, Int32 dstY, struct Bitmap* src, struct Bitmap* dst, Int32 size) {
|
void Bitmap_CopyBlock(Int32 srcX, Int32 srcY, Int32 dstX, Int32 dstY, Bitmap* src, Bitmap* dst, Int32 size) {
|
||||||
Int32 x, y;
|
Int32 x, y;
|
||||||
for (y = 0; y < size; y++) {
|
for (y = 0; y < size; y++) {
|
||||||
UInt32* srcRow = Bitmap_GetRow(src, srcY + y);
|
UInt32* srcRow = Bitmap_GetRow(src, srcY + y);
|
||||||
@ -22,12 +22,12 @@ void Bitmap_CopyBlock(Int32 srcX, Int32 srcY, Int32 dstX, Int32 dstY, struct Bit
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bitmap_Allocate(struct Bitmap* bmp, Int32 width, Int32 height) {
|
void Bitmap_Allocate(Bitmap* bmp, Int32 width, Int32 height) {
|
||||||
bmp->Width = width; bmp->Height = height;
|
bmp->Width = width; bmp->Height = height;
|
||||||
bmp->Scan0 = Mem_Alloc(width * height, BITMAP_SIZEOF_PIXEL, "bitmap data");
|
bmp->Scan0 = Mem_Alloc(width * height, BITMAP_SIZEOF_PIXEL, "bitmap data");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bitmap_AllocateClearedPow2(struct Bitmap* bmp, Int32 width, Int32 height) {
|
void Bitmap_AllocateClearedPow2(Bitmap* bmp, Int32 width, Int32 height) {
|
||||||
width = Math_NextPowOf2(width);
|
width = Math_NextPowOf2(width);
|
||||||
height = Math_NextPowOf2(height);
|
height = Math_NextPowOf2(height);
|
||||||
|
|
||||||
@ -308,7 +308,7 @@ Png_RowExpander Png_GetExpander(UInt8 col, UInt8 bitsPerSample) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Png_ComputeTransparency(struct Bitmap* bmp, UInt32 transparentCol) {
|
static void Png_ComputeTransparency(Bitmap* bmp, UInt32 transparentCol) {
|
||||||
UInt32 trnsRGB = transparentCol & PNG_RGB_MASK;
|
UInt32 trnsRGB = transparentCol & PNG_RGB_MASK;
|
||||||
Int32 x, y, width = bmp->Width, height = bmp->Height;
|
Int32 x, y, width = bmp->Width, height = bmp->Height;
|
||||||
|
|
||||||
@ -324,7 +324,7 @@ static void Png_ComputeTransparency(struct Bitmap* bmp, UInt32 transparentCol) {
|
|||||||
/* Most bits per sample is 16. Most samples per pixel is 4. Add 1 for filter byte. */
|
/* Most bits per sample is 16. Most samples per pixel is 4. Add 1 for filter byte. */
|
||||||
#define PNG_BUFFER_SIZE ((PNG_MAX_DIMS * 2 * 4 + 1) * 2)
|
#define PNG_BUFFER_SIZE ((PNG_MAX_DIMS * 2 * 4 + 1) * 2)
|
||||||
/* TODO: Test a lot of .png files and ensure output is right */
|
/* TODO: Test a lot of .png files and ensure output is right */
|
||||||
ReturnCode Bitmap_DecodePng(struct Bitmap* bmp, struct Stream* stream) {
|
ReturnCode Bitmap_DecodePng(Bitmap* bmp, struct Stream* stream) {
|
||||||
Bitmap_Create(bmp, 0, 0, NULL);
|
Bitmap_Create(bmp, 0, 0, NULL);
|
||||||
UInt8 tmp[PNG_PALETTE * 3];
|
UInt8 tmp[PNG_PALETTE * 3];
|
||||||
ReturnCode res;
|
ReturnCode res;
|
||||||
@ -607,7 +607,7 @@ static void Png_EncodeRow(UInt8* src, UInt8* cur, UInt8* prior, UInt8* best, Int
|
|||||||
best[0] = bestFilter;
|
best[0] = bestFilter;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnCode Bitmap_EncodePng(struct Bitmap* bmp, struct Stream* stream) {
|
ReturnCode Bitmap_EncodePng(Bitmap* bmp, struct Stream* stream) {
|
||||||
ReturnCode res;
|
ReturnCode res;
|
||||||
UInt8 tmp[32];
|
UInt8 tmp[32];
|
||||||
if ((res = Stream_Write(stream, png_sig, PNG_SIG_SIZE))) return res;
|
if ((res = Stream_Write(stream, png_sig, PNG_SIG_SIZE))) return res;
|
||||||
|
13
src/Bitmap.h
13
src/Bitmap.h
@ -5,7 +5,6 @@
|
|||||||
Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
|
Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
|
||||||
*/
|
*/
|
||||||
struct Stream;
|
struct Stream;
|
||||||
struct Bitmap { UInt8* Scan0; Int32 Width, Height; };
|
|
||||||
|
|
||||||
#define PNG_MAX_DIMS 0x8000L
|
#define PNG_MAX_DIMS 0x8000L
|
||||||
#define BITMAP_SIZEOF_PIXEL 4 /* 32 bit ARGB */
|
#define BITMAP_SIZEOF_PIXEL 4 /* 32 bit ARGB */
|
||||||
@ -13,12 +12,12 @@ struct Bitmap { UInt8* Scan0; Int32 Width, Height; };
|
|||||||
#define Bitmap_GetRow(bmp, y) ((UInt32*)((bmp)->Scan0 + ((y) * ((bmp)->Width << 2))))
|
#define Bitmap_GetRow(bmp, y) ((UInt32*)((bmp)->Scan0 + ((y) * ((bmp)->Width << 2))))
|
||||||
#define Bitmap_GetPixel(bmp, x, y) (Bitmap_GetRow(bmp, y)[x])
|
#define Bitmap_GetPixel(bmp, x, y) (Bitmap_GetRow(bmp, y)[x])
|
||||||
|
|
||||||
void Bitmap_Create(struct Bitmap* bmp, Int32 width, Int32 height, UInt8* scan0);
|
void Bitmap_Create(Bitmap* bmp, Int32 width, Int32 height, UInt8* scan0);
|
||||||
void Bitmap_CopyBlock(Int32 srcX, Int32 srcY, Int32 dstX, Int32 dstY, struct Bitmap* src, struct Bitmap* dst, Int32 size);
|
void Bitmap_CopyBlock(Int32 srcX, Int32 srcY, Int32 dstX, Int32 dstY, Bitmap* src, Bitmap* dst, Int32 size);
|
||||||
/* Allocates a new bitmap of the given dimensions. You are responsible for freeing its memory! */
|
/* Allocates a new bitmap of the given dimensions. You are responsible for freeing its memory! */
|
||||||
void Bitmap_Allocate(struct Bitmap* bmp, Int32 width, Int32 height);
|
void Bitmap_Allocate(Bitmap* bmp, Int32 width, Int32 height);
|
||||||
/* Allocates a power-of-2 sized bitmap larger or equal to to the given size, and clears it to 0. You are responsible for freeing its memory! */
|
/* Allocates a power-of-2 sized bitmap larger or equal to to the given size, and clears it to 0. You are responsible for freeing its memory! */
|
||||||
void Bitmap_AllocateClearedPow2(struct Bitmap* bmp, Int32 width, Int32 height);
|
void Bitmap_AllocateClearedPow2(Bitmap* bmp, Int32 width, Int32 height);
|
||||||
|
|
||||||
bool Bitmap_DetectPng(UInt8* data, UInt32 len);
|
bool Bitmap_DetectPng(UInt8* data, UInt32 len);
|
||||||
/*
|
/*
|
||||||
@ -26,6 +25,6 @@ bool Bitmap_DetectPng(UInt8* data, UInt32 len);
|
|||||||
https://handmade.network/forums/wip/t/2363-implementing_a_basic_png_reader_the_handmade_way
|
https://handmade.network/forums/wip/t/2363-implementing_a_basic_png_reader_the_handmade_way
|
||||||
https://github.com/nothings/stb/blob/master/stb_image.h
|
https://github.com/nothings/stb/blob/master/stb_image.h
|
||||||
*/
|
*/
|
||||||
ReturnCode Bitmap_DecodePng(struct Bitmap* bmp, struct Stream* stream);
|
ReturnCode Bitmap_DecodePng(Bitmap* bmp, struct Stream* stream);
|
||||||
ReturnCode Bitmap_EncodePng(struct Bitmap* bmp, struct Stream* stream);
|
ReturnCode Bitmap_EncodePng(Bitmap* bmp, struct Stream* stream);
|
||||||
#endif
|
#endif
|
||||||
|
11
src/Block.c
11
src/Block.c
@ -7,6 +7,7 @@
|
|||||||
#include "Inventory.h"
|
#include "Inventory.h"
|
||||||
#include "Event.h"
|
#include "Event.h"
|
||||||
#include "Platform.h"
|
#include "Platform.h"
|
||||||
|
#include "Bitmap.h"
|
||||||
|
|
||||||
const char* Sound_Names[SOUND_COUNT] = {
|
const char* Sound_Names[SOUND_COUNT] = {
|
||||||
"none", "wood", "gravel", "grass", "stone",
|
"none", "wood", "gravel", "grass", "stone",
|
||||||
@ -275,7 +276,7 @@ void Block_RecalculateSpriteBB(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Real32 Block_GetSpriteBB_MinX(Int32 size, Int32 tileX, Int32 tileY, struct Bitmap* bmp) {
|
static Real32 Block_GetSpriteBB_MinX(Int32 size, Int32 tileX, Int32 tileY, Bitmap* bmp) {
|
||||||
Int32 x, y;
|
Int32 x, y;
|
||||||
for (x = 0; x < size; x++) {
|
for (x = 0; x < size; x++) {
|
||||||
for (y = 0; y < size; y++) {
|
for (y = 0; y < size; y++) {
|
||||||
@ -288,7 +289,7 @@ static Real32 Block_GetSpriteBB_MinX(Int32 size, Int32 tileX, Int32 tileY, struc
|
|||||||
return 1.0f;
|
return 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Real32 Block_GetSpriteBB_MinY(Int32 size, Int32 tileX, Int32 tileY, struct Bitmap* bmp) {
|
static Real32 Block_GetSpriteBB_MinY(Int32 size, Int32 tileX, Int32 tileY, Bitmap* bmp) {
|
||||||
Int32 x, y;
|
Int32 x, y;
|
||||||
for (y = size - 1; y >= 0; y--) {
|
for (y = size - 1; y >= 0; y--) {
|
||||||
UInt32* row = Bitmap_GetRow(bmp, tileY * size + y) + (tileX * size);
|
UInt32* row = Bitmap_GetRow(bmp, tileY * size + y) + (tileX * size);
|
||||||
@ -301,7 +302,7 @@ static Real32 Block_GetSpriteBB_MinY(Int32 size, Int32 tileX, Int32 tileY, struc
|
|||||||
return 1.0f;
|
return 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Real32 Block_GetSpriteBB_MaxX(Int32 size, Int32 tileX, Int32 tileY, struct Bitmap* bmp) {
|
static Real32 Block_GetSpriteBB_MaxX(Int32 size, Int32 tileX, Int32 tileY, Bitmap* bmp) {
|
||||||
Int32 x, y;
|
Int32 x, y;
|
||||||
for (x = size - 1; x >= 0; x--) {
|
for (x = size - 1; x >= 0; x--) {
|
||||||
for (y = 0; y < size; y++) {
|
for (y = 0; y < size; y++) {
|
||||||
@ -314,7 +315,7 @@ static Real32 Block_GetSpriteBB_MaxX(Int32 size, Int32 tileX, Int32 tileY, struc
|
|||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Real32 Block_GetSpriteBB_MaxY(Int32 size, Int32 tileX, Int32 tileY, struct Bitmap* bmp) {
|
static Real32 Block_GetSpriteBB_MaxY(Int32 size, Int32 tileX, Int32 tileY, Bitmap* bmp) {
|
||||||
Int32 x, y;
|
Int32 x, y;
|
||||||
for (y = 0; y < size; y++) {
|
for (y = 0; y < size; y++) {
|
||||||
UInt32* row = Bitmap_GetRow(bmp, tileY * size + y) + (tileX * size);
|
UInt32* row = Bitmap_GetRow(bmp, tileY * size + y) + (tileX * size);
|
||||||
@ -328,7 +329,7 @@ static Real32 Block_GetSpriteBB_MaxY(Int32 size, Int32 tileX, Int32 tileY, struc
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Block_RecalculateBB(BlockID block) {
|
void Block_RecalculateBB(BlockID block) {
|
||||||
struct Bitmap* bmp = &Atlas2D_Bitmap;
|
Bitmap* bmp = &Atlas2D_Bitmap;
|
||||||
Int32 tileSize = Atlas2D_TileSize;
|
Int32 tileSize = Atlas2D_TileSize;
|
||||||
TextureLoc texLoc = Block_GetTexLoc(block, FACE_XMAX);
|
TextureLoc texLoc = Block_GetTexLoc(block, FACE_XMAX);
|
||||||
Int32 x = Atlas2D_TileX(texLoc), y = Atlas2D_TileY(texLoc);
|
Int32 x = Atlas2D_TileX(texLoc), y = Atlas2D_TileY(texLoc);
|
||||||
|
14
src/Camera.c
14
src/Camera.c
@ -34,20 +34,20 @@ static void PerspectiveCamera_GetPickedBlock(struct PickedPos* pos) {
|
|||||||
Picking_CalculatePickedBlock(eyePos, dir, reach, pos);
|
Picking_CalculatePickedBlock(eyePos, dir, reach, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Point2D cam_prev, cam_delta;
|
Point2D cam_prev, cam_delta;
|
||||||
static void PerspectiveCamera_CentreMousePosition(void) {
|
static void PerspectiveCamera_CentreMousePosition(void) {
|
||||||
struct Point2D topLeft = Window_PointToScreen(Point2D_Empty);
|
Point2D topLeft = Window_PointToScreen(0, 0);
|
||||||
Int32 cenX = topLeft.X + Game_Width / 2;
|
Int32 cenX = topLeft.X + Game_Width / 2;
|
||||||
Int32 cenY = topLeft.Y + Game_Height / 2;
|
Int32 cenY = topLeft.Y + Game_Height / 2;
|
||||||
|
|
||||||
Window_SetDesktopCursorPos(Point2D_Make(cenX, cenY));
|
Window_SetDesktopCursorPos(cenX, cenY);
|
||||||
/* Fixes issues with large DPI displays on Windows >= 8.0. */
|
/* Fixes issues with large DPI displays on Windows >= 8.0. */
|
||||||
cam_prev = Window_GetDesktopCursorPos();
|
cam_prev = Window_GetDesktopCursorPos();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void PerspectiveCamera_RegrabMouse(void) {
|
static void PerspectiveCamera_RegrabMouse(void) {
|
||||||
if (!Window_Exists) return;
|
if (!Window_Exists) return;
|
||||||
cam_delta = Point2D_Empty;
|
cam_delta.X = 0; cam_delta.Y = 0;
|
||||||
PerspectiveCamera_CentreMousePosition();
|
PerspectiveCamera_CentreMousePosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,10 +99,10 @@ static void PerspectiveCamera_UpdateMouseRotation(void) {
|
|||||||
static void PerspectiveCamera_UpdateMouse(void) {
|
static void PerspectiveCamera_UpdateMouse(void) {
|
||||||
struct Screen* screen = Gui_GetActiveScreen();
|
struct Screen* screen = Gui_GetActiveScreen();
|
||||||
if (screen->HandlesAllInput) {
|
if (screen->HandlesAllInput) {
|
||||||
cam_delta = Point2D_Empty;
|
cam_delta.X = 0; cam_delta.Y = 0;
|
||||||
} else if (Window_Focused) {
|
} else if (Window_Focused) {
|
||||||
struct Point2D pos = Window_GetDesktopCursorPos();
|
Point2D pos = Window_GetDesktopCursorPos();
|
||||||
cam_delta = Point2D_Make(pos.X - cam_prev.X, pos.Y - cam_prev.Y);
|
cam_delta.X = pos.X - cam_prev.X; cam_delta.Y = pos.Y - cam_prev.Y;
|
||||||
PerspectiveCamera_CentreMousePosition();
|
PerspectiveCamera_CentreMousePosition();
|
||||||
}
|
}
|
||||||
PerspectiveCamera_UpdateMouseRotation();
|
PerspectiveCamera_UpdateMouseRotation();
|
||||||
|
@ -389,8 +389,7 @@ static void ResolutionCommand_Execute(STRING_PURE String* args, Int32 argsCount)
|
|||||||
} else if (width <= 0 || height <= 0) {
|
} else if (width <= 0 || height <= 0) {
|
||||||
Chat_AddRaw("&e/client: &cWidth and height must be above 0.");
|
Chat_AddRaw("&e/client: &cWidth and height must be above 0.");
|
||||||
} else {
|
} else {
|
||||||
struct Size2D size = { width, height };
|
Window_SetClientSize(width, height);
|
||||||
Window_SetClientSize(size);
|
|
||||||
Options_SetInt(OPT_WINDOW_WIDTH, width);
|
Options_SetInt(OPT_WINDOW_WIDTH, width);
|
||||||
Options_SetInt(OPT_WINDOW_HEIGHT, height);
|
Options_SetInt(OPT_WINDOW_HEIGHT, height);
|
||||||
}
|
}
|
||||||
|
@ -187,7 +187,6 @@
|
|||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="2DStructs.h" />
|
|
||||||
<ClInclude Include="AsyncDownloader.h" />
|
<ClInclude Include="AsyncDownloader.h" />
|
||||||
<ClInclude Include="Audio.h" />
|
<ClInclude Include="Audio.h" />
|
||||||
<ClInclude Include="AxisLinesRenderer.h" />
|
<ClInclude Include="AxisLinesRenderer.h" />
|
||||||
@ -255,7 +254,6 @@
|
|||||||
<ClInclude Include="World.h" />
|
<ClInclude Include="World.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="2DStructs.c" />
|
|
||||||
<ClCompile Include="AsyncDownloader.c" />
|
<ClCompile Include="AsyncDownloader.c" />
|
||||||
<ClCompile Include="Audio.c" />
|
<ClCompile Include="Audio.c" />
|
||||||
<ClCompile Include="Camera.c" />
|
<ClCompile Include="Camera.c" />
|
||||||
|
@ -19,9 +19,6 @@
|
|||||||
<Filter Include="Header Files\Generator">
|
<Filter Include="Header Files\Generator">
|
||||||
<UniqueIdentifier>{6acee9ab-36de-4f0d-b434-b915b4b52c02}</UniqueIdentifier>
|
<UniqueIdentifier>{6acee9ab-36de-4f0d-b434-b915b4b52c02}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter Include="Header Files\Defines">
|
|
||||||
<UniqueIdentifier>{405d40c2-3d05-4d42-8ccb-415189b379a4}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Source Files\Platform">
|
<Filter Include="Source Files\Platform">
|
||||||
<UniqueIdentifier>{eab38ecc-57ac-48f4-9ed2-7cbd40effb24}</UniqueIdentifier>
|
<UniqueIdentifier>{eab38ecc-57ac-48f4-9ed2-7cbd40effb24}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
@ -216,12 +213,6 @@
|
|||||||
<ClInclude Include="MapRenderer.h">
|
<ClInclude Include="MapRenderer.h">
|
||||||
<Filter>Header Files\Rendering\Map</Filter>
|
<Filter>Header Files\Rendering\Map</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="Constants.h">
|
|
||||||
<Filter>Header Files\Defines</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="2DStructs.h">
|
|
||||||
<Filter>Header Files\2D\Utils</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="MapGenerator.h">
|
<ClInclude Include="MapGenerator.h">
|
||||||
<Filter>Header Files\Generator</Filter>
|
<Filter>Header Files\Generator</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@ -336,12 +327,15 @@
|
|||||||
<ClInclude Include="Errors.h">
|
<ClInclude Include="Errors.h">
|
||||||
<Filter>Header Files\Utils</Filter>
|
<Filter>Header Files\Utils</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="Core.h">
|
|
||||||
<Filter>Header Files\Defines</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="Model.h">
|
<ClInclude Include="Model.h">
|
||||||
<Filter>Header Files\Entities\Model</Filter>
|
<Filter>Header Files\Entities\Model</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="Constants.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Core.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="String.c">
|
<ClCompile Include="String.c">
|
||||||
@ -386,9 +380,6 @@
|
|||||||
<ClCompile Include="MapRenderer.c">
|
<ClCompile Include="MapRenderer.c">
|
||||||
<Filter>Source Files\Rendering\Map</Filter>
|
<Filter>Source Files\Rendering\Map</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="2DStructs.c">
|
|
||||||
<Filter>Source Files\2D\Utils</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="AxisLinesRenderer.c">
|
<ClCompile Include="AxisLinesRenderer.c">
|
||||||
<Filter>Source Files\SelectionBox</Filter>
|
<Filter>Source Files\SelectionBox</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
@ -47,14 +47,14 @@
|
|||||||
/* Number of faces on a cube. */
|
/* Number of faces on a cube. */
|
||||||
#define FACE_COUNT 6
|
#define FACE_COUNT 6
|
||||||
|
|
||||||
#define SKIN_TYPE_64x32 0
|
enum SKIN_TYPE { SKIN_64x32, SKIN_64x64, SKIN_64x64_SLIM, SKIN_INVALID };
|
||||||
#define SKIN_TYPE_64x64 1
|
enum FONT_STYLE { FONT_STYLE_NORMAL, FONT_STYLE_BOLD, FONT_STYLE_UNDERLINE };
|
||||||
#define SKIN_TYPE_64x64_SLIM 2
|
|
||||||
#define SKIN_TYPE_INVALID 3
|
|
||||||
|
|
||||||
#define FONT_STYLE_NORMAL 0
|
|
||||||
#define FONT_STYLE_BOLD 1
|
|
||||||
#define FONT_STYLE_UNDERLINE 2
|
|
||||||
|
|
||||||
#define DRAWER2D_MAX_COLS 256
|
#define DRAWER2D_MAX_COLS 256
|
||||||
|
|
||||||
|
#define UInt8_MaxValue ((UInt8)255)
|
||||||
|
#define Int16_MinValue ((Int16)-32768)
|
||||||
|
#define Int16_MaxValue ((Int16)32767)
|
||||||
|
#define UInt16_MaxValue ((UInt16)65535)
|
||||||
|
#define Int32_MinValue ((Int32)-2147483647L - (Int32)1L)
|
||||||
|
#define Int32_MaxValue ((Int32)2147483647L)
|
||||||
#endif
|
#endif
|
||||||
|
21
src/Core.h
21
src/Core.h
@ -1,6 +1,6 @@
|
|||||||
#ifndef CC_TYPEDEFS_H
|
#ifndef CC_CORE_H
|
||||||
#define CC_TYPEDEFS_H
|
#define CC_CORE_H
|
||||||
/* Ensures variables are of a fixed size.
|
/* Core fixed-size integer and floating point types, and common small structs.
|
||||||
Copyright 2017 ClassicalSharp | Licensed under BSD-3
|
Copyright 2017 ClassicalSharp | Licensed under BSD-3
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -49,15 +49,12 @@ typedef UInt16 TextureLoc;
|
|||||||
typedef UInt8 Face;
|
typedef UInt8 Face;
|
||||||
typedef UInt32 ReturnCode;
|
typedef UInt32 ReturnCode;
|
||||||
|
|
||||||
struct FontDesc { void* Handle; UInt16 Size, Style; };
|
typedef struct Rect2D_ { Int32 X, Y, Width, Height; } Rect2D;
|
||||||
|
typedef struct Point2D_ { Int32 X, Y; } Point2D;
|
||||||
#define UInt8_MaxValue ((UInt8)255)
|
typedef struct Size2D_ { Int32 Width, Height; } Size2D;
|
||||||
#define Int16_MinValue ((Int16)-32768)
|
typedef struct FontDesc_ { void* Handle; UInt16 Size, Style; } FontDesc;
|
||||||
#define Int16_MaxValue ((Int16)32767)
|
typedef struct TextureRec_ { Real32 U1, V1, U2, V2; } TextureRec;
|
||||||
#define UInt16_MaxValue ((UInt16)65535)
|
typedef struct Bitmap_ { UInt8* Scan0; Int32 Width, Height; } Bitmap;
|
||||||
#define Int32_MinValue ((Int32)-2147483647L - (Int32)1L)
|
|
||||||
#define Int32_MaxValue ((Int32)2147483647L)
|
|
||||||
#define UInt32_MaxValue ((UInt32)4294967295UL)
|
|
||||||
|
|
||||||
#define CC_BUILD_GL11 false
|
#define CC_BUILD_GL11 false
|
||||||
#define CC_BUILD_D3D9 true
|
#define CC_BUILD_D3D9 true
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include "Funcs.h"
|
#include "Funcs.h"
|
||||||
#include "Game.h"
|
#include "Game.h"
|
||||||
#include "ExtMath.h"
|
#include "ExtMath.h"
|
||||||
|
#include "Bitmap.h"
|
||||||
|
|
||||||
//#define D3D_DISABLE_9EX causes compile errors
|
//#define D3D_DISABLE_9EX causes compile errors
|
||||||
#if CC_BUILD_WIN
|
#if CC_BUILD_WIN
|
||||||
@ -163,7 +164,7 @@ void Gfx_Free(void) {
|
|||||||
D3D9_FreeResource(&d3d);
|
D3D9_FreeResource(&d3d);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void D3D9_SetTextureData(IDirect3DTexture9* texture, struct Bitmap* bmp, Int32 lvl) {
|
static void D3D9_SetTextureData(IDirect3DTexture9* texture, Bitmap* bmp, Int32 lvl) {
|
||||||
D3DLOCKED_RECT rect;
|
D3DLOCKED_RECT rect;
|
||||||
ReturnCode hresult = IDirect3DTexture9_LockRect(texture, lvl, &rect, NULL, 0);
|
ReturnCode hresult = IDirect3DTexture9_LockRect(texture, lvl, &rect, NULL, 0);
|
||||||
ErrorHandler_CheckOrFail(hresult, "D3D9_SetTextureData - Lock");
|
ErrorHandler_CheckOrFail(hresult, "D3D9_SetTextureData - Lock");
|
||||||
@ -175,7 +176,7 @@ static void D3D9_SetTextureData(IDirect3DTexture9* texture, struct Bitmap* bmp,
|
|||||||
ErrorHandler_CheckOrFail(hresult, "D3D9_SetTextureData - Unlock");
|
ErrorHandler_CheckOrFail(hresult, "D3D9_SetTextureData - Unlock");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void D3D9_SetTexturePartData(IDirect3DTexture9* texture, Int32 x, Int32 y, struct Bitmap* bmp, Int32 lvl) {
|
static void D3D9_SetTexturePartData(IDirect3DTexture9* texture, Int32 x, Int32 y, Bitmap* bmp, Int32 lvl) {
|
||||||
RECT part;
|
RECT part;
|
||||||
part.left = x; part.right = x + bmp->Width;
|
part.left = x; part.right = x + bmp->Width;
|
||||||
part.top = y; part.bottom = y + bmp->Height;
|
part.top = y; part.bottom = y + bmp->Height;
|
||||||
@ -200,7 +201,7 @@ static void D3D9_SetTexturePartData(IDirect3DTexture9* texture, Int32 x, Int32 y
|
|||||||
ErrorHandler_CheckOrFail(hresult, "D3D9_SetTexturePartData - Unlock");
|
ErrorHandler_CheckOrFail(hresult, "D3D9_SetTexturePartData - Unlock");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void D3D9_DoMipmaps(IDirect3DTexture9* texture, Int32 x, Int32 y, struct Bitmap* bmp, bool partial) {
|
static void D3D9_DoMipmaps(IDirect3DTexture9* texture, Int32 x, Int32 y, Bitmap* bmp, bool partial) {
|
||||||
UInt8* prev = bmp->Scan0;
|
UInt8* prev = bmp->Scan0;
|
||||||
Int32 lvls = GfxCommon_MipmapsLevels(bmp->Width, bmp->Height);
|
Int32 lvls = GfxCommon_MipmapsLevels(bmp->Width, bmp->Height);
|
||||||
Int32 lvl, width = bmp->Width, height = bmp->Height;
|
Int32 lvl, width = bmp->Width, height = bmp->Height;
|
||||||
@ -213,7 +214,7 @@ static void D3D9_DoMipmaps(IDirect3DTexture9* texture, Int32 x, Int32 y, struct
|
|||||||
UInt8* cur = Mem_Alloc(width * height, BITMAP_SIZEOF_PIXEL, "mipmaps");
|
UInt8* cur = Mem_Alloc(width * height, BITMAP_SIZEOF_PIXEL, "mipmaps");
|
||||||
GfxCommon_GenMipmaps(width, height, cur, prev);
|
GfxCommon_GenMipmaps(width, height, cur, prev);
|
||||||
|
|
||||||
struct Bitmap mipmap;
|
Bitmap mipmap;
|
||||||
Bitmap_Create(&mipmap, width, height, cur);
|
Bitmap_Create(&mipmap, width, height, cur);
|
||||||
if (partial) {
|
if (partial) {
|
||||||
D3D9_SetTexturePartData(texture, x, y, &mipmap, lvl);
|
D3D9_SetTexturePartData(texture, x, y, &mipmap, lvl);
|
||||||
@ -227,7 +228,7 @@ static void D3D9_DoMipmaps(IDirect3DTexture9* texture, Int32 x, Int32 y, struct
|
|||||||
if (prev != bmp->Scan0) Mem_Free(prev);
|
if (prev != bmp->Scan0) Mem_Free(prev);
|
||||||
}
|
}
|
||||||
|
|
||||||
GfxResourceID Gfx_CreateTexture(struct Bitmap* bmp, bool managedPool, bool mipmaps) {
|
GfxResourceID Gfx_CreateTexture(Bitmap* bmp, bool managedPool, bool mipmaps) {
|
||||||
IDirect3DTexture9* texture;
|
IDirect3DTexture9* texture;
|
||||||
ReturnCode hresult;
|
ReturnCode hresult;
|
||||||
Int32 mipmapsLevels = GfxCommon_MipmapsLevels(bmp->Width, bmp->Height);
|
Int32 mipmapsLevels = GfxCommon_MipmapsLevels(bmp->Width, bmp->Height);
|
||||||
@ -262,7 +263,7 @@ GfxResourceID Gfx_CreateTexture(struct Bitmap* bmp, bool managedPool, bool mipma
|
|||||||
return texture;
|
return texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gfx_UpdateTexturePart(GfxResourceID texId, Int32 x, Int32 y, struct Bitmap* part, bool mipmaps) {
|
void Gfx_UpdateTexturePart(GfxResourceID texId, Int32 x, Int32 y, Bitmap* part, bool mipmaps) {
|
||||||
IDirect3DTexture9* texture = (IDirect3DTexture9*)texId;
|
IDirect3DTexture9* texture = (IDirect3DTexture9*)texId;
|
||||||
D3D9_SetTexturePartData(texture, x, y, part, 0);
|
D3D9_SetTexturePartData(texture, x, y, part, 0);
|
||||||
if (mipmaps) D3D9_DoMipmaps(texture, x, y, part, true);
|
if (mipmaps) D3D9_DoMipmaps(texture, x, y, part, true);
|
||||||
@ -592,7 +593,7 @@ ReturnCode Gfx_TakeScreenshot(struct Stream* output, Int32 width, Int32 height)
|
|||||||
res = IDirect3DSurface9_LockRect(temp, &rect, NULL, D3DLOCK_READONLY | D3DLOCK_NO_DIRTY_UPDATE);
|
res = IDirect3DSurface9_LockRect(temp, &rect, NULL, D3DLOCK_READONLY | D3DLOCK_NO_DIRTY_UPDATE);
|
||||||
if (res) goto finished;
|
if (res) goto finished;
|
||||||
{
|
{
|
||||||
struct Bitmap bmp; Bitmap_Create(&bmp, width, height, rect.pBits);
|
Bitmap bmp; Bitmap_Create(&bmp, width, height, rect.pBits);
|
||||||
res = Bitmap_EncodePng(&bmp, output);
|
res = Bitmap_EncodePng(&bmp, output);
|
||||||
if (res) { IDirect3DSurface9_UnlockRect(temp); goto finished; }
|
if (res) { IDirect3DSurface9_UnlockRect(temp); goto finished; }
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#ifndef CC_DISPLAYDEVICE_H
|
#ifndef CC_DISPLAYDEVICE_H
|
||||||
#define CC_DISPLAYDEVICE_H
|
#define CC_DISPLAYDEVICE_H
|
||||||
#include "Core.h"
|
#include "Core.h"
|
||||||
#include "2DStructs.h"
|
|
||||||
/* Contains structs related to monitor displays.
|
/* Contains structs related to monitor displays.
|
||||||
Copyright 2017 ClassicalSharp | Licensed under BSD-3 | Based originally on OpenTK
|
Copyright 2017 ClassicalSharp | Licensed under BSD-3 | Based originally on OpenTK
|
||||||
*/
|
*/
|
||||||
@ -12,7 +11,7 @@
|
|||||||
* See license.txt for licensing detailed licensing details.
|
* See license.txt for licensing detailed licensing details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct DisplayDevice { Int32 BitsPerPixel; struct Rectangle2D Bounds; };
|
struct DisplayDevice { Int32 BitsPerPixel; Rect2D Bounds; };
|
||||||
struct DisplayDevice DisplayDevice_Default;
|
struct DisplayDevice DisplayDevice_Default;
|
||||||
void* DisplayDevice_Meta[3];
|
void* DisplayDevice_Meta[3];
|
||||||
|
|
||||||
|
@ -5,21 +5,22 @@
|
|||||||
#include "ExtMath.h"
|
#include "ExtMath.h"
|
||||||
#include "ErrorHandler.h"
|
#include "ErrorHandler.h"
|
||||||
#include "GraphicsCommon.h"
|
#include "GraphicsCommon.h"
|
||||||
|
#include "Bitmap.h"
|
||||||
|
|
||||||
void DrawTextArgs_Make(struct DrawTextArgs* args, STRING_REF String* text, struct FontDesc* font, bool useShadow) {
|
void DrawTextArgs_Make(struct DrawTextArgs* args, STRING_REF String* text, FontDesc* font, bool useShadow) {
|
||||||
args->Text = *text;
|
args->Text = *text;
|
||||||
args->Font = *font;
|
args->Font = *font;
|
||||||
args->UseShadow = useShadow;
|
args->UseShadow = useShadow;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawTextArgs_MakeEmpty(struct DrawTextArgs* args, struct FontDesc* font, bool useShadow) {
|
void DrawTextArgs_MakeEmpty(struct DrawTextArgs* args, FontDesc* font, bool useShadow) {
|
||||||
args->Text = String_MakeNull();
|
args->Text = String_MakeNull();
|
||||||
args->Font = *font;
|
args->Font = *font;
|
||||||
args->UseShadow = useShadow;
|
args->UseShadow = useShadow;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Bitmap Drawer2D_FontBitmap;
|
Bitmap Drawer2D_FontBitmap;
|
||||||
struct Bitmap* Drawer2D_Cur;
|
Bitmap* Drawer2D_Cur;
|
||||||
Int32 Drawer2D_BoxSize = 8; /* avoid divide by 0 if default.png missing */
|
Int32 Drawer2D_BoxSize = 8; /* avoid divide by 0 if default.png missing */
|
||||||
/* So really 16 characters per row */
|
/* So really 16 characters per row */
|
||||||
#define DRAWER2D_LOG2_CHARS_PER_ROW 4
|
#define DRAWER2D_LOG2_CHARS_PER_ROW 4
|
||||||
@ -60,7 +61,7 @@ static void Drawer2D_FreeFontBitmap(void) {
|
|||||||
Drawer2D_FontBitmap.Scan0 = NULL;
|
Drawer2D_FontBitmap.Scan0 = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Drawer2D_SetFontBitmap(struct Bitmap* bmp) {
|
void Drawer2D_SetFontBitmap(Bitmap* bmp) {
|
||||||
Drawer2D_FreeFontBitmap();
|
Drawer2D_FreeFontBitmap();
|
||||||
Drawer2D_FontBitmap = *bmp;
|
Drawer2D_FontBitmap = *bmp;
|
||||||
Drawer2D_BoxSize = bmp->Width >> DRAWER2D_LOG2_CHARS_PER_ROW;
|
Drawer2D_BoxSize = bmp->Width >> DRAWER2D_LOG2_CHARS_PER_ROW;
|
||||||
@ -96,7 +97,7 @@ void Drawer2D_Free(void) {
|
|||||||
Drawer2D_FreeFontBitmap();
|
Drawer2D_FreeFontBitmap();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Drawer2D_Begin(struct Bitmap* bmp) {
|
void Drawer2D_Begin(Bitmap* bmp) {
|
||||||
if (!Drawer2D_UseBitmappedChat) Platform_SetBitmap(bmp);
|
if (!Drawer2D_UseBitmappedChat) Platform_SetBitmap(bmp);
|
||||||
Drawer2D_Cur = bmp;
|
Drawer2D_Cur = bmp;
|
||||||
}
|
}
|
||||||
@ -107,9 +108,9 @@ void Drawer2D_End(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Draws a 2D flat rectangle. */
|
/* Draws a 2D flat rectangle. */
|
||||||
void Drawer2D_Rect(struct Bitmap* bmp, PackedCol col, Int32 x, Int32 y, Int32 width, Int32 height);
|
void Drawer2D_Rect(Bitmap* bmp, PackedCol col, Int32 x, Int32 y, Int32 width, Int32 height);
|
||||||
|
|
||||||
void Drawer2D_Clear(struct Bitmap* bmp, PackedCol col, Int32 x, Int32 y, Int32 width, Int32 height) {
|
void Drawer2D_Clear(Bitmap* bmp, PackedCol col, Int32 x, Int32 y, Int32 width, Int32 height) {
|
||||||
if (x < 0 || y < 0 || (x + width) > bmp->Width || (y + height) > bmp->Height) {
|
if (x < 0 || y < 0 || (x + width) > bmp->Width || (y + height) > bmp->Height) {
|
||||||
ErrorHandler_Fail("Drawer2D_Clear - tried to clear at invalid coords");
|
ErrorHandler_Fail("Drawer2D_Clear - tried to clear at invalid coords");
|
||||||
}
|
}
|
||||||
@ -122,7 +123,7 @@ void Drawer2D_Clear(struct Bitmap* bmp, PackedCol col, Int32 x, Int32 y, Int32 w
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Int32 Drawer2D_FontHeight(struct FontDesc* font, bool useShadow) {
|
Int32 Drawer2D_FontHeight(FontDesc* font, bool useShadow) {
|
||||||
struct DrawTextArgs args;
|
struct DrawTextArgs args;
|
||||||
String text = String_FromConst("I");
|
String text = String_FromConst("I");
|
||||||
DrawTextArgs_Make(&args, &text, font, useShadow);
|
DrawTextArgs_Make(&args, &text, font, useShadow);
|
||||||
@ -130,13 +131,13 @@ Int32 Drawer2D_FontHeight(struct FontDesc* font, bool useShadow) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Drawer2D_MakeTextTexture(struct Texture* tex, struct DrawTextArgs* args, Int32 X, Int32 Y) {
|
void Drawer2D_MakeTextTexture(struct Texture* tex, struct DrawTextArgs* args, Int32 X, Int32 Y) {
|
||||||
struct Size2D size = Drawer2D_MeasureText(args);
|
Size2D size = Drawer2D_MeasureText(args);
|
||||||
if (size.Width == 0 && size.Height == 0) {
|
if (size.Width == 0 && size.Height == 0) {
|
||||||
struct Texture empty = { NULL, TEX_RECT(X,Y, 0,0), TEX_UV(0,0, 1,1) };
|
struct Texture empty = { NULL, TEX_RECT(X,Y, 0,0), TEX_UV(0,0, 1,1) };
|
||||||
*tex = empty; return;
|
*tex = empty; return;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Bitmap bmp; Bitmap_AllocateClearedPow2(&bmp, size.Width, size.Height);
|
Bitmap bmp; Bitmap_AllocateClearedPow2(&bmp, size.Width, size.Height);
|
||||||
Drawer2D_Begin(&bmp);
|
Drawer2D_Begin(&bmp);
|
||||||
{
|
{
|
||||||
Drawer2D_DrawText(args, 0, 0);
|
Drawer2D_DrawText(args, 0, 0);
|
||||||
@ -147,7 +148,7 @@ void Drawer2D_MakeTextTexture(struct Texture* tex, struct DrawTextArgs* args, In
|
|||||||
Mem_Free(bmp.Scan0);
|
Mem_Free(bmp.Scan0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Drawer2D_Make2DTexture(struct Texture* tex, struct Bitmap* bmp, struct Size2D used, Int32 X, Int32 Y) {
|
void Drawer2D_Make2DTexture(struct Texture* tex, Bitmap* bmp, Size2D used, Int32 X, Int32 Y) {
|
||||||
GfxResourceID texId = Gfx_CreateTexture(bmp, false, false);
|
GfxResourceID texId = Gfx_CreateTexture(bmp, false, false);
|
||||||
Real32 u2 = (Real32)used.Width / (Real32)bmp->Width;
|
Real32 u2 = (Real32)used.Width / (Real32)bmp->Width;
|
||||||
Real32 v2 = (Real32)used.Height / (Real32)bmp->Height;
|
Real32 v2 = (Real32)used.Height / (Real32)bmp->Height;
|
||||||
@ -315,7 +316,7 @@ static void Drawer2D_DrawUnderline(struct DrawTextArgs* args, Int32 x, Int32 y,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Drawer2D_DrawBitmapText(struct DrawTextArgs* args, Int32 x, Int32 y) {
|
static void Drawer2D_DrawBitmapText(struct DrawTextArgs* args, Int32 x, Int32 y) {
|
||||||
bool ul = args->Font.Style == FONT_STYLE_UNDERLINE;
|
bool ul = args->Font.Style == FONT_STYLE_UNDERLINE;
|
||||||
Int32 offset = Drawer2D_ShadowOffset(args->Font.Size);
|
Int32 offset = Drawer2D_ShadowOffset(args->Font.Size);
|
||||||
|
|
||||||
@ -328,11 +329,11 @@ void Drawer2D_DrawBitmapText(struct DrawTextArgs* args, Int32 x, Int32 y) {
|
|||||||
if (ul) Drawer2D_DrawUnderline(args, x, y, false);
|
if (ul) Drawer2D_DrawUnderline(args, x, y, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Size2D Drawer2D_MeasureBitmapText(struct DrawTextArgs* args) {
|
static Size2D Drawer2D_MeasureBitmapText(struct DrawTextArgs* args) {
|
||||||
Int32 point = args->Font.Size;
|
Int32 point = args->Font.Size;
|
||||||
/* adjust coords to make drawn text match GDI fonts */
|
/* adjust coords to make drawn text match GDI fonts */
|
||||||
Int32 xPadding = Drawer2D_XPadding(point), i;
|
Int32 xPadding = Drawer2D_XPadding(point), i;
|
||||||
struct Size2D total = { 0, Drawer2D_AdjHeight(point) };
|
Size2D total = { 0, Drawer2D_AdjHeight(point) };
|
||||||
|
|
||||||
String text = args->Text;
|
String text = args->Text;
|
||||||
for (i = 0; i < text.length; i++) {
|
for (i = 0; i < text.length; i++) {
|
||||||
@ -388,26 +389,26 @@ void Drawer2D_DrawText(struct DrawTextArgs* args, Int32 x, Int32 y) {
|
|||||||
Platform_TextDraw(args, x + DRAWER2D_OFFSET, y + DRAWER2D_OFFSET, backCol);
|
Platform_TextDraw(args, x + DRAWER2D_OFFSET, y + DRAWER2D_OFFSET, backCol);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Size2D partSize = Platform_TextDraw(args, x, y, col);
|
Size2D partSize = Platform_TextDraw(args, x, y, col);
|
||||||
x += partSize.Width;
|
x += partSize.Width;
|
||||||
}
|
}
|
||||||
args->Text = value;
|
args->Text = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Size2D Drawer2D_MeasureText(struct DrawTextArgs* args) {
|
Size2D Drawer2D_MeasureText(struct DrawTextArgs* args) {
|
||||||
if (Drawer2D_IsEmptyText(&args->Text)) return Size2D_Empty;
|
Size2D size = { 0, 0 };
|
||||||
|
if (Drawer2D_IsEmptyText(&args->Text)) return size;
|
||||||
if (Drawer2D_UseBitmappedChat) return Drawer2D_MeasureBitmapText(args);
|
if (Drawer2D_UseBitmappedChat) return Drawer2D_MeasureBitmapText(args);
|
||||||
|
|
||||||
String value = args->Text;
|
String value = args->Text;
|
||||||
char nextCol = 'f';
|
char nextCol = 'f';
|
||||||
Int32 i = 0;
|
Int32 i = 0;
|
||||||
struct Size2D size = { 0, 0 };
|
|
||||||
|
|
||||||
while (i < value.length) {
|
while (i < value.length) {
|
||||||
i = Drawer2D_NextPart(i, &value, &args->Text, &nextCol);
|
i = Drawer2D_NextPart(i, &value, &args->Text, &nextCol);
|
||||||
if (!args->Text.length) continue;
|
if (!args->Text.length) continue;
|
||||||
|
|
||||||
struct Size2D partSize = Platform_TextMeasure(args);
|
Size2D partSize = Platform_TextMeasure(args);
|
||||||
size.Width += partSize.Width;
|
size.Width += partSize.Width;
|
||||||
size.Height = max(size.Height, partSize.Height);
|
size.Height = max(size.Height, partSize.Height);
|
||||||
}
|
}
|
||||||
|
@ -1,18 +1,16 @@
|
|||||||
#ifndef CC_DRAWER2D_H
|
#ifndef CC_DRAWER2D_H
|
||||||
#define CC_DRAWER2D_H
|
#define CC_DRAWER2D_H
|
||||||
#include "2DStructs.h"
|
|
||||||
#include "PackedCol.h"
|
#include "PackedCol.h"
|
||||||
#include "Constants.h"
|
#include "Constants.h"
|
||||||
/* Responsible for performing drawing operations on bitmaps, and for converting bitmaps into textures.
|
/* Responsible for performing drawing operations on bitmaps, and for converting bitmaps into textures.
|
||||||
Copyright 2017 ClassicalSharp | Licensed under BSD-3
|
Copyright 2017 ClassicalSharp | Licensed under BSD-3
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct DrawTextArgs { String Text; struct FontDesc Font; bool UseShadow; };
|
struct DrawTextArgs { String Text; FontDesc Font; bool UseShadow; };
|
||||||
struct Bitmap;
|
|
||||||
struct Texture;
|
struct Texture;
|
||||||
|
|
||||||
void DrawTextArgs_Make(struct DrawTextArgs* args, STRING_REF String* text, struct FontDesc* font, bool useShadow);
|
void DrawTextArgs_Make(struct DrawTextArgs* args, STRING_REF String* text, FontDesc* font, bool useShadow);
|
||||||
void DrawTextArgs_MakeEmpty(struct DrawTextArgs* args, struct FontDesc* font, bool useShadow);
|
void DrawTextArgs_MakeEmpty(struct DrawTextArgs* args, FontDesc* font, bool useShadow);
|
||||||
|
|
||||||
/* Whether chat text should be drawn and measuring using the currently bitmapped font,
|
/* Whether chat text should be drawn and measuring using the currently bitmapped font,
|
||||||
false uses the font supplied as the DrawTextArgs argument supplied to the function. */
|
false uses the font supplied as the DrawTextArgs argument supplied to the function. */
|
||||||
@ -26,20 +24,20 @@ void Drawer2D_Init(void);
|
|||||||
void Drawer2D_Free(void);
|
void Drawer2D_Free(void);
|
||||||
|
|
||||||
/* Sets the underlying bitmap that text operations are performed on. */
|
/* Sets the underlying bitmap that text operations are performed on. */
|
||||||
void Drawer2D_Begin(struct Bitmap* bmp);
|
void Drawer2D_Begin(Bitmap* bmp);
|
||||||
/* Frees any resources associated with the underlying bitmap. */
|
/* Frees any resources associated with the underlying bitmap. */
|
||||||
void Drawer2D_End(void);
|
void Drawer2D_End(void);
|
||||||
/* Draws a 2D flat rectangle. */
|
/* Draws a 2D flat rectangle. */
|
||||||
void Drawer2D_Rect(struct Bitmap* bmp, PackedCol col, Int32 x, Int32 y, Int32 width, Int32 height);
|
void Drawer2D_Rect(Bitmap* bmp, PackedCol col, Int32 x, Int32 y, Int32 width, Int32 height);
|
||||||
/* Clears the entire given area to the specified colour. */
|
/* Clears the entire given area to the specified colour. */
|
||||||
void Drawer2D_Clear(struct Bitmap* bmp, PackedCol col, Int32 x, Int32 y, Int32 width, Int32 height);
|
void Drawer2D_Clear(Bitmap* bmp, PackedCol col, Int32 x, Int32 y, Int32 width, Int32 height);
|
||||||
|
|
||||||
void Drawer2D_DrawText(struct DrawTextArgs* args, Int32 x, Int32 y);
|
void Drawer2D_DrawText(struct DrawTextArgs* args, Int32 x, Int32 y);
|
||||||
struct Size2D Drawer2D_MeasureText(struct DrawTextArgs* args);
|
Size2D Drawer2D_MeasureText(struct DrawTextArgs* args);
|
||||||
Int32 Drawer2D_FontHeight(struct FontDesc* font, bool useShadow);
|
Int32 Drawer2D_FontHeight(FontDesc* font, bool useShadow);
|
||||||
|
|
||||||
void Drawer2D_MakeTextTexture(struct Texture* tex, struct DrawTextArgs* args, Int32 X, Int32 Y);
|
void Drawer2D_MakeTextTexture(struct Texture* tex, struct DrawTextArgs* args, Int32 X, Int32 Y);
|
||||||
void Drawer2D_Make2DTexture(struct Texture* tex, struct Bitmap* bmp, struct Size2D used, Int32 X, Int32 Y);
|
void Drawer2D_Make2DTexture(struct Texture* tex, Bitmap* bmp, Size2D used, Int32 X, Int32 Y);
|
||||||
|
|
||||||
bool Drawer2D_ValidColCodeAt(STRING_PURE String* text, Int32 i);
|
bool Drawer2D_ValidColCodeAt(STRING_PURE String* text, Int32 i);
|
||||||
bool Drawer2D_ValidColCode(char c);
|
bool Drawer2D_ValidColCode(char c);
|
||||||
@ -50,5 +48,5 @@ bool Drawer2D_IsWhiteCol(char c);
|
|||||||
|
|
||||||
void Drawer2D_ReducePadding_Tex(struct Texture* tex, Int32 point, Int32 scale);
|
void Drawer2D_ReducePadding_Tex(struct Texture* tex, Int32 point, Int32 scale);
|
||||||
void Drawer2D_ReducePadding_Height(Int32* height, Int32 point, Int32 scale);
|
void Drawer2D_ReducePadding_Height(Int32* height, Int32 point, Int32 scale);
|
||||||
void Drawer2D_SetFontBitmap(struct Bitmap* bmp);
|
void Drawer2D_SetFontBitmap(Bitmap* bmp);
|
||||||
#endif
|
#endif
|
||||||
|
23
src/Entity.c
23
src/Entity.c
@ -19,6 +19,7 @@
|
|||||||
#include "Input.h"
|
#include "Input.h"
|
||||||
#include "Gui.h"
|
#include "Gui.h"
|
||||||
#include "Stream.h"
|
#include "Stream.h"
|
||||||
|
#include "Bitmap.h"
|
||||||
|
|
||||||
const char* NameMode_Names[NAME_MODE_COUNT] = { "None", "Hovered", "All", "AllHovered", "AllUnscaled" };
|
const char* NameMode_Names[NAME_MODE_COUNT] = { "None", "Hovered", "All", "AllHovered", "AllUnscaled" };
|
||||||
const char* ShadowMode_Names[SHADOW_MODE_COUNT] = { "None", "SnapToBlock", "Circle", "CircleAll" };
|
const char* ShadowMode_Names[SHADOW_MODE_COUNT] = { "None", "SnapToBlock", "Circle", "CircleAll" };
|
||||||
@ -452,7 +453,7 @@ void TabList_MakeComponent(struct IGameComponent* comp) {
|
|||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
#define PLAYER_NAME_EMPTY_TEX -30000
|
#define PLAYER_NAME_EMPTY_TEX -30000
|
||||||
static void Player_MakeNameTexture(struct Player* player) {
|
static void Player_MakeNameTexture(struct Player* player) {
|
||||||
struct FontDesc font;
|
FontDesc font;
|
||||||
Font_Make(&font, &Game_FontName, 24, FONT_STYLE_NORMAL);
|
Font_Make(&font, &Game_FontName, 24, FONT_STYLE_NORMAL);
|
||||||
|
|
||||||
String displayName = String_FromRawArray(player->DisplayNameRaw);
|
String displayName = String_FromRawArray(player->DisplayNameRaw);
|
||||||
@ -462,7 +463,7 @@ static void Player_MakeNameTexture(struct Player* player) {
|
|||||||
/* we want names to always be drawn not using the system font */
|
/* we want names to always be drawn not using the system font */
|
||||||
bool bitmapped = Drawer2D_UseBitmappedChat;
|
bool bitmapped = Drawer2D_UseBitmappedChat;
|
||||||
Drawer2D_UseBitmappedChat = true;
|
Drawer2D_UseBitmappedChat = true;
|
||||||
struct Size2D size = Drawer2D_MeasureText(&args);
|
Size2D size = Drawer2D_MeasureText(&args);
|
||||||
|
|
||||||
if (size.Width == 0) {
|
if (size.Width == 0) {
|
||||||
player->NameTex.ID = NULL;
|
player->NameTex.ID = NULL;
|
||||||
@ -472,7 +473,7 @@ static void Player_MakeNameTexture(struct Player* player) {
|
|||||||
String shadowName = String_FromArray(buffer);
|
String shadowName = String_FromArray(buffer);
|
||||||
|
|
||||||
size.Width += 3; size.Height += 3;
|
size.Width += 3; size.Height += 3;
|
||||||
struct Bitmap bmp; Bitmap_AllocateClearedPow2(&bmp, size.Width, size.Height);
|
Bitmap bmp; Bitmap_AllocateClearedPow2(&bmp, size.Width, size.Height);
|
||||||
Drawer2D_Begin(&bmp);
|
Drawer2D_Begin(&bmp);
|
||||||
{
|
{
|
||||||
PackedCol origWhiteCol = Drawer2D_Cols['f'];
|
PackedCol origWhiteCol = Drawer2D_Cols['f'];
|
||||||
@ -527,7 +528,7 @@ static void Player_DrawName(struct Player* player) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
VertexP3fT2fC4b vertices[4];
|
VertexP3fT2fC4b vertices[4];
|
||||||
struct TextureRec rec = { 0.0f, 0.0f, player->NameTex.U2, player->NameTex.V2 };
|
TextureRec rec = { 0.0f, 0.0f, player->NameTex.U2, player->NameTex.V2 };
|
||||||
PackedCol col = PACKEDCOL_WHITE;
|
PackedCol col = PACKEDCOL_WHITE;
|
||||||
Particle_DoRender(&size, &pos, &rec, col, vertices);
|
Particle_DoRender(&size, &pos, &rec, col, vertices);
|
||||||
|
|
||||||
@ -587,7 +588,7 @@ void Player_ResetSkin(struct Player* player) {
|
|||||||
entity->uScale = 1.0f; entity->vScale = 1.0f;
|
entity->uScale = 1.0f; entity->vScale = 1.0f;
|
||||||
entity->MobTextureId = NULL;
|
entity->MobTextureId = NULL;
|
||||||
entity->TextureId = NULL;
|
entity->TextureId = NULL;
|
||||||
entity->SkinType = SKIN_TYPE_64x32;
|
entity->SkinType = SKIN_64x32;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Apply or reset skin, for all players with same skin */
|
/* Apply or reset skin, for all players with same skin */
|
||||||
@ -610,9 +611,9 @@ static void Player_SetSkinAll(struct Player* player, bool reset) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Player_ClearHat(struct Bitmap* bmp, UInt8 skinType) {
|
static void Player_ClearHat(Bitmap* bmp, UInt8 skinType) {
|
||||||
Int32 sizeX = (bmp->Width / 64) * 32;
|
Int32 sizeX = (bmp->Width / 64) * 32;
|
||||||
Int32 yScale = skinType == SKIN_TYPE_64x32 ? 32 : 64;
|
Int32 yScale = skinType == SKIN_64x32 ? 32 : 64;
|
||||||
Int32 sizeY = (bmp->Height / yScale) * 16;
|
Int32 sizeY = (bmp->Height / yScale) * 16;
|
||||||
Int32 x, y;
|
Int32 x, y;
|
||||||
|
|
||||||
@ -639,12 +640,12 @@ static void Player_ClearHat(struct Bitmap* bmp, UInt8 skinType) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Player_EnsurePow2(struct Player* player, struct Bitmap* bmp) {
|
static void Player_EnsurePow2(struct Player* player, Bitmap* bmp) {
|
||||||
Int32 width = Math_NextPowOf2(bmp->Width);
|
Int32 width = Math_NextPowOf2(bmp->Width);
|
||||||
Int32 height = Math_NextPowOf2(bmp->Height);
|
Int32 height = Math_NextPowOf2(bmp->Height);
|
||||||
if (width == bmp->Width && height == bmp->Height) return;
|
if (width == bmp->Width && height == bmp->Height) return;
|
||||||
|
|
||||||
struct Bitmap scaled; Bitmap_Allocate(&scaled, width, height);
|
Bitmap scaled; Bitmap_Allocate(&scaled, width, height);
|
||||||
Int32 y;
|
Int32 y;
|
||||||
UInt32 stride = (UInt32)(bmp->Width) * BITMAP_SIZEOF_PIXEL;
|
UInt32 stride = (UInt32)(bmp->Width) * BITMAP_SIZEOF_PIXEL;
|
||||||
for (y = 0; y < bmp->Height; y++) {
|
for (y = 0; y < bmp->Height; y++) {
|
||||||
@ -680,7 +681,7 @@ static void Player_CheckSkin(struct Player* player) {
|
|||||||
if (!item.ResultData) { Player_SetSkinAll(player, true); return; }
|
if (!item.ResultData) { Player_SetSkinAll(player, true); return; }
|
||||||
|
|
||||||
String url = String_FromRawArray(item.URL);
|
String url = String_FromRawArray(item.URL);
|
||||||
struct Stream mem; struct Bitmap bmp;
|
struct Stream mem; Bitmap bmp;
|
||||||
Stream_ReadonlyMemory(&mem, item.ResultData, item.ResultSize);
|
Stream_ReadonlyMemory(&mem, item.ResultData, item.ResultSize);
|
||||||
|
|
||||||
ReturnCode res = Bitmap_DecodePng(&bmp, &mem);
|
ReturnCode res = Bitmap_DecodePng(&bmp, &mem);
|
||||||
@ -694,7 +695,7 @@ static void Player_CheckSkin(struct Player* player) {
|
|||||||
Player_EnsurePow2(player, &bmp);
|
Player_EnsurePow2(player, &bmp);
|
||||||
entity->SkinType = Utils_GetSkinType(&bmp);
|
entity->SkinType = Utils_GetSkinType(&bmp);
|
||||||
|
|
||||||
if (entity->SkinType == SKIN_TYPE_INVALID) {
|
if (entity->SkinType == SKIN_INVALID) {
|
||||||
Player_SetSkinAll(player, true);
|
Player_SetSkinAll(player, true);
|
||||||
} else {
|
} else {
|
||||||
if (entity->Model->UsesHumanSkin) {
|
if (entity->Model->UsesHumanSkin) {
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include "Physics.h"
|
#include "Physics.h"
|
||||||
#include "Model.h"
|
#include "Model.h"
|
||||||
#include "Audio.h"
|
#include "Audio.h"
|
||||||
|
#include "Bitmap.h"
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*----------------------------------------------------AnimatedComponent----------------------------------------------------*
|
*----------------------------------------------------AnimatedComponent----------------------------------------------------*
|
||||||
@ -589,7 +590,7 @@ static bool ShadowComponent_GetBlocks(struct Entity* entity, Int32 x, Int32 y, I
|
|||||||
#define sh_half (sh_size / 2)
|
#define sh_half (sh_size / 2)
|
||||||
static void ShadowComponent_MakeTex(void) {
|
static void ShadowComponent_MakeTex(void) {
|
||||||
UInt8 pixels[Bitmap_DataSize(sh_size, sh_size)];
|
UInt8 pixels[Bitmap_DataSize(sh_size, sh_size)];
|
||||||
struct Bitmap bmp; Bitmap_Create(&bmp, sh_size, sh_size, pixels);
|
Bitmap bmp; Bitmap_Create(&bmp, sh_size, sh_size, pixels);
|
||||||
|
|
||||||
UInt32 inPix = PackedCol_ARGB(0, 0, 0, 200);
|
UInt32 inPix = PackedCol_ARGB(0, 0, 0, 200);
|
||||||
UInt32 outPix = PackedCol_ARGB(0, 0, 0, 0);
|
UInt32 outPix = PackedCol_ARGB(0, 0, 0, 0);
|
||||||
|
@ -534,13 +534,17 @@ static void EnvRenderer_MakeBorderTex(GfxResourceID* texId, BlockID block) {
|
|||||||
*texId = Atlas2D_LoadTile(texLoc);
|
*texId = Atlas2D_LoadTile(texLoc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void EnvRenderer_CalcBorderRects(struct Rectangle2D* rects) {
|
static Rect2D EnvRenderer_Rect(Int32 x, Int32 y, Int32 width, Int32 height) {
|
||||||
Int32 extent = Utils_AdjViewDist(Game_ViewDistance);
|
Rect2D r; r.X = x; r.Y = y; r.Width = width; r.Height = height; return r;
|
||||||
rects[0] = Rectangle2D_Make(-extent, -extent, extent + World_Width + extent, extent);
|
}
|
||||||
rects[1] = Rectangle2D_Make(-extent, World_Length, extent + World_Width + extent, extent);
|
|
||||||
|
|
||||||
rects[2] = Rectangle2D_Make(-extent, 0, extent, World_Length);
|
static void EnvRenderer_CalcBorderRects(Rect2D* rects) {
|
||||||
rects[3] = Rectangle2D_Make(World_Width, 0, extent, World_Length);
|
Int32 extent = Utils_AdjViewDist(Game_ViewDistance);
|
||||||
|
rects[0] = EnvRenderer_Rect(-extent, -extent, extent + World_Width + extent, extent);
|
||||||
|
rects[1] = EnvRenderer_Rect(-extent, World_Length, extent + World_Width + extent, extent);
|
||||||
|
|
||||||
|
rects[2] = EnvRenderer_Rect(-extent, 0, extent, World_Length);
|
||||||
|
rects[3] = EnvRenderer_Rect(World_Width, 0, extent, World_Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void EnvRenderer_UpdateBorderTextures(void) {
|
static void EnvRenderer_UpdateBorderTextures(void) {
|
||||||
@ -629,12 +633,12 @@ static void EnvRenderer_UpdateMapSides(void) {
|
|||||||
BlockID block = WorldEnv_SidesBlock;
|
BlockID block = WorldEnv_SidesBlock;
|
||||||
|
|
||||||
if (Block_Draw[block] == DRAW_GAS) return;
|
if (Block_Draw[block] == DRAW_GAS) return;
|
||||||
struct Rectangle2D rects[4];
|
Rect2D rects[4];
|
||||||
EnvRenderer_CalcBorderRects(rects);
|
EnvRenderer_CalcBorderRects(rects);
|
||||||
|
|
||||||
Int32 i; sides_vertices = 0;
|
Int32 i; sides_vertices = 0;
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
struct Rectangle2D r = rects[i];
|
Rect2D r = rects[i];
|
||||||
sides_vertices += EnvRenderer_Vertices(r.Width, r.Height); /* YQuads outside */
|
sides_vertices += EnvRenderer_Vertices(r.Width, r.Height); /* YQuads outside */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -656,7 +660,7 @@ static void EnvRenderer_UpdateMapSides(void) {
|
|||||||
Block_Tint(col, block)
|
Block_Tint(col, block)
|
||||||
|
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
struct Rectangle2D r = rects[i];
|
Rect2D r = rects[i];
|
||||||
EnvRenderer_DrawBorderY(r.X, r.Y, r.X + r.Width, r.Y + r.Height, (Real32)y, col,
|
EnvRenderer_DrawBorderY(r.X, r.Y, r.X + r.Width, r.Y + r.Height, (Real32)y, col,
|
||||||
0, borders_YOffset(block), &temp);
|
0, borders_YOffset(block), &temp);
|
||||||
}
|
}
|
||||||
@ -680,12 +684,12 @@ static void EnvRenderer_UpdateMapEdges(void) {
|
|||||||
BlockID block = WorldEnv_EdgeBlock;
|
BlockID block = WorldEnv_EdgeBlock;
|
||||||
|
|
||||||
if (Block_Draw[block] == DRAW_GAS) return;
|
if (Block_Draw[block] == DRAW_GAS) return;
|
||||||
struct Rectangle2D rects[4];
|
Rect2D rects[4];
|
||||||
EnvRenderer_CalcBorderRects(rects);
|
EnvRenderer_CalcBorderRects(rects);
|
||||||
|
|
||||||
Int32 i; edges_vertices = 0;
|
Int32 i; edges_vertices = 0;
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
struct Rectangle2D r = rects[i];
|
Rect2D r = rects[i];
|
||||||
edges_vertices += EnvRenderer_Vertices(r.Width, r.Height); /* YPlanes outside */
|
edges_vertices += EnvRenderer_Vertices(r.Width, r.Height); /* YPlanes outside */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -703,7 +707,7 @@ static void EnvRenderer_UpdateMapEdges(void) {
|
|||||||
|
|
||||||
Real32 y = (Real32)WorldEnv_EdgeHeight;
|
Real32 y = (Real32)WorldEnv_EdgeHeight;
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
struct Rectangle2D r = rects[i];
|
Rect2D r = rects[i];
|
||||||
EnvRenderer_DrawBorderY(r.X, r.Y, r.X + r.Width, r.Y + r.Height, y, col,
|
EnvRenderer_DrawBorderY(r.X, r.Y, r.X + r.Width, r.Y + r.Height, y, col,
|
||||||
borders_HorOffset(block), borders_YOffset(block), &temp);
|
borders_HorOffset(block), borders_YOffset(block), &temp);
|
||||||
}
|
}
|
||||||
|
21
src/Game.c
21
src/Game.c
@ -36,6 +36,7 @@
|
|||||||
#include "Audio.h"
|
#include "Audio.h"
|
||||||
#include "DisplayDevice.h"
|
#include "DisplayDevice.h"
|
||||||
#include "Stream.h"
|
#include "Stream.h"
|
||||||
|
#include "Bitmap.h"
|
||||||
|
|
||||||
struct IGameComponent Game_Components[26];
|
struct IGameComponent Game_Components[26];
|
||||||
Int32 Game_ComponentsCount;
|
Int32 Game_ComponentsCount;
|
||||||
@ -121,7 +122,7 @@ void Game_SetDefaultTexturePack(STRING_PURE String* texPack) {
|
|||||||
Options_Set(OPT_DEFAULT_TEX_PACK, texPack);
|
Options_Set(OPT_DEFAULT_TEX_PACK, texPack);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Game_ChangeTerrainAtlas(struct Bitmap* atlas) {
|
bool Game_ChangeTerrainAtlas(Bitmap* atlas) {
|
||||||
String terrain = String_FromConst("terrain.png");
|
String terrain = String_FromConst("terrain.png");
|
||||||
if (!Game_ValidateBitmap(&terrain, atlas)) return false;
|
if (!Game_ValidateBitmap(&terrain, atlas)) return false;
|
||||||
|
|
||||||
@ -206,7 +207,7 @@ bool Game_CanPick(BlockID block) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Game_UpdateTexture(GfxResourceID* texId, struct Stream* src, STRING_PURE String* file, UInt8* skinType) {
|
bool Game_UpdateTexture(GfxResourceID* texId, struct Stream* src, STRING_PURE String* file, UInt8* skinType) {
|
||||||
struct Bitmap bmp;
|
Bitmap bmp;
|
||||||
ReturnCode res = Bitmap_DecodePng(&bmp, src);
|
ReturnCode res = Bitmap_DecodePng(&bmp, src);
|
||||||
if (res) { Chat_LogError(res, "decoding", file); }
|
if (res) { Chat_LogError(res, "decoding", file); }
|
||||||
|
|
||||||
@ -221,7 +222,7 @@ bool Game_UpdateTexture(GfxResourceID* texId, struct Stream* src, STRING_PURE St
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Game_ValidateBitmap(STRING_PURE String* file, struct Bitmap* bmp) {
|
bool Game_ValidateBitmap(STRING_PURE String* file, Bitmap* bmp) {
|
||||||
if (!bmp->Scan0) {
|
if (!bmp->Scan0) {
|
||||||
Chat_Add1("&cError loading %s from the texture pack.", file);
|
Chat_Add1("&cError loading %s from the texture pack.", file);
|
||||||
return false;
|
return false;
|
||||||
@ -260,7 +261,7 @@ Int32 Game_CalcRenderType(STRING_PURE String* type) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void Game_UpdateClientSize(void) {
|
static void Game_UpdateClientSize(void) {
|
||||||
struct Size2D size = Window_ClientSize;
|
Size2D size = Window_ClientSize;
|
||||||
Game_Width = max(size.Width, 1);
|
Game_Width = max(size.Width, 1);
|
||||||
Game_Height = max(size.Height, 1);
|
Game_Height = max(size.Height, 1);
|
||||||
}
|
}
|
||||||
@ -287,7 +288,7 @@ static void Game_OnNewMapLoadedCore(void* obj) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void Game_TextureChangedCore(void* obj, struct Stream* src, String* name) {
|
static void Game_TextureChangedCore(void* obj, struct Stream* src, String* name) {
|
||||||
struct Bitmap bmp;
|
Bitmap bmp;
|
||||||
if (String_CaselessEqualsConst(name, "terrain.png")) {
|
if (String_CaselessEqualsConst(name, "terrain.png")) {
|
||||||
ReturnCode res = Bitmap_DecodePng(&bmp, src);
|
ReturnCode res = Bitmap_DecodePng(&bmp, src);
|
||||||
|
|
||||||
@ -751,11 +752,11 @@ void Game_Run(Int32 width, Int32 height, STRING_PURE String* title, struct Displ
|
|||||||
#include "Builder.h"
|
#include "Builder.h"
|
||||||
void AdvLightingBuilder_SetActive(void) { NormalBuilder_SetActive(); }
|
void AdvLightingBuilder_SetActive(void) { NormalBuilder_SetActive(); }
|
||||||
#if CC_BUILD_NIX
|
#if CC_BUILD_NIX
|
||||||
void Font_Make(struct FontDesc* desc, STRING_PURE String* fontName, UInt16 size, UInt16 style) { desc->Size = size; desc->Style = style; }
|
void Font_Make(FontDesc* desc, STRING_PURE String* fontName, UInt16 size, UInt16 style) { desc->Size = size; desc->Style = style; }
|
||||||
void Font_Free(struct FontDesc* desc) { }
|
void Font_Free(FontDesc* desc) { }
|
||||||
void Font_GetNames(StringsBuffer* buffer) { }
|
void Font_GetNames(StringsBuffer* buffer) { }
|
||||||
struct Size2D Platform_TextMeasure(struct DrawTextArgs* args) { }
|
Size2D Platform_TextMeasure(struct DrawTextArgs* args) { }
|
||||||
void Platform_SetBitmap(struct Bitmap* bmp) { }
|
void Platform_SetBitmap(Bitmap* bmp) { }
|
||||||
struct Size2D Platform_TextDraw(struct DrawTextArgs* args, Int32 x, Int32 y, PackedCol col) { }
|
Size2D Platform_TextDraw(struct DrawTextArgs* args, Int32 x, Int32 y, PackedCol col) { }
|
||||||
void Platform_ReleaseBitmap(void) { }
|
void Platform_ReleaseBitmap(void) { }
|
||||||
#endif
|
#endif
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
|
Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct Bitmap;
|
|
||||||
struct DisplayDevice;
|
struct DisplayDevice;
|
||||||
struct Stream;
|
struct Stream;
|
||||||
|
|
||||||
@ -79,14 +78,14 @@ Real32 Game_GetChatScale(void);
|
|||||||
void Game_GetDefaultTexturePack(STRING_TRANSIENT String* texPack);
|
void Game_GetDefaultTexturePack(STRING_TRANSIENT String* texPack);
|
||||||
void Game_SetDefaultTexturePack(STRING_PURE String* texPack);
|
void Game_SetDefaultTexturePack(STRING_PURE String* texPack);
|
||||||
|
|
||||||
bool Game_ChangeTerrainAtlas(struct Bitmap* atlas);
|
bool Game_ChangeTerrainAtlas(Bitmap* atlas);
|
||||||
void Game_SetViewDistance(Int32 distance, bool userDist);
|
void Game_SetViewDistance(Int32 distance, bool userDist);
|
||||||
void Game_UpdateProjection(void);
|
void Game_UpdateProjection(void);
|
||||||
void Game_Disconnect(STRING_PURE String* title, STRING_PURE String* reason);
|
void Game_Disconnect(STRING_PURE String* title, STRING_PURE String* reason);
|
||||||
void Game_UpdateBlock(Int32 x, Int32 y, Int32 z, BlockID block);
|
void Game_UpdateBlock(Int32 x, Int32 y, Int32 z, BlockID block);
|
||||||
bool Game_CanPick(BlockID block);
|
bool Game_CanPick(BlockID block);
|
||||||
bool Game_UpdateTexture(GfxResourceID* texId, struct Stream* src, STRING_PURE String* file, UInt8* skinType);
|
bool Game_UpdateTexture(GfxResourceID* texId, struct Stream* src, STRING_PURE String* file, UInt8* skinType);
|
||||||
bool Game_ValidateBitmap(STRING_PURE String* file, struct Bitmap* bmp);
|
bool Game_ValidateBitmap(STRING_PURE String* file, Bitmap* bmp);
|
||||||
Int32 Game_CalcRenderType(STRING_PURE String* type);
|
Int32 Game_CalcRenderType(STRING_PURE String* type);
|
||||||
void Game_SetFpsLimit(FpsLimit method);
|
void Game_SetFpsLimit(FpsLimit method);
|
||||||
Real32 Game_CalcLimitMillis(FpsLimit method);
|
Real32 Game_CalcLimitMillis(FpsLimit method);
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#ifndef CC_GFXAPI_H
|
#ifndef CC_GFXAPI_H
|
||||||
#define CC_GFXAPI_H
|
#define CC_GFXAPI_H
|
||||||
#include "Bitmap.h"
|
|
||||||
#include "PackedCol.h"
|
#include "PackedCol.h"
|
||||||
#include "Vectors.h"
|
#include "Vectors.h"
|
||||||
#include "GameStructs.h"
|
#include "GameStructs.h"
|
||||||
@ -44,8 +43,8 @@ struct Matrix Gfx_View, Gfx_Projection;
|
|||||||
/* Callback invoked when the current context is lost, and is repeatedly invoked until the context can be retrieved. */
|
/* Callback invoked when the current context is lost, and is repeatedly invoked until the context can be retrieved. */
|
||||||
ScheduledTaskCallback Gfx_LostContextFunction;
|
ScheduledTaskCallback Gfx_LostContextFunction;
|
||||||
|
|
||||||
GfxResourceID Gfx_CreateTexture(struct Bitmap* bmp, bool managedPool, bool mipmaps);
|
GfxResourceID Gfx_CreateTexture(Bitmap* bmp, bool managedPool, bool mipmaps);
|
||||||
void Gfx_UpdateTexturePart(GfxResourceID texId, Int32 x, Int32 y, struct Bitmap* part, bool mipmaps);
|
void Gfx_UpdateTexturePart(GfxResourceID texId, Int32 x, Int32 y, Bitmap* part, bool mipmaps);
|
||||||
void Gfx_BindTexture(GfxResourceID texId);
|
void Gfx_BindTexture(GfxResourceID texId);
|
||||||
void Gfx_DeleteTexture(GfxResourceID* texId);
|
void Gfx_DeleteTexture(GfxResourceID* texId);
|
||||||
void Gfx_SetTexturing(bool enabled);
|
void Gfx_SetTexturing(bool enabled);
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include "InputHandler.h"
|
#include "InputHandler.h"
|
||||||
#include "ErrorHandler.h"
|
#include "ErrorHandler.h"
|
||||||
#include "Platform.h"
|
#include "Platform.h"
|
||||||
|
#include "Bitmap.h"
|
||||||
|
|
||||||
struct Screen* Gui_Status;
|
struct Screen* Gui_Status;
|
||||||
void Gui_DefaultRecreate(void* elem) {
|
void Gui_DefaultRecreate(void* elem) {
|
||||||
@ -226,15 +227,15 @@ void Gui_CalcCursorVisible(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void TextAtlas_Make(struct TextAtlas* atlas, STRING_PURE String* chars, struct FontDesc* font, STRING_PURE String* prefix) {
|
void TextAtlas_Make(struct TextAtlas* atlas, STRING_PURE String* chars, FontDesc* font, STRING_PURE String* prefix) {
|
||||||
struct DrawTextArgs args; DrawTextArgs_Make(&args, prefix, font, true);
|
struct DrawTextArgs args; DrawTextArgs_Make(&args, prefix, font, true);
|
||||||
struct Size2D size = Drawer2D_MeasureText(&args);
|
Size2D size = Drawer2D_MeasureText(&args);
|
||||||
atlas->Offset = size.Width;
|
atlas->Offset = size.Width;
|
||||||
atlas->FontSize = font->Size;
|
atlas->FontSize = font->Size;
|
||||||
size.Width += 16 * chars->length;
|
size.Width += 16 * chars->length;
|
||||||
|
|
||||||
Mem_Set(atlas->Widths, 0, sizeof(atlas->Widths));
|
Mem_Set(atlas->Widths, 0, sizeof(atlas->Widths));
|
||||||
struct Bitmap bmp; Bitmap_AllocateClearedPow2(&bmp, size.Width, size.Height);
|
Bitmap bmp; Bitmap_AllocateClearedPow2(&bmp, size.Width, size.Height);
|
||||||
Drawer2D_Begin(&bmp);
|
Drawer2D_Begin(&bmp);
|
||||||
{
|
{
|
||||||
Drawer2D_DrawText(&args, 0, 0);
|
Drawer2D_DrawText(&args, 0, 0);
|
||||||
|
@ -110,7 +110,7 @@ struct TextAtlas {
|
|||||||
Real32 uScale;
|
Real32 uScale;
|
||||||
Int32 Widths[TEXTATLAS_MAX_WIDTHS];
|
Int32 Widths[TEXTATLAS_MAX_WIDTHS];
|
||||||
};
|
};
|
||||||
void TextAtlas_Make(struct TextAtlas* atlas, STRING_PURE String* chars, struct FontDesc* font, STRING_PURE String* prefix);
|
void TextAtlas_Make(struct TextAtlas* atlas, STRING_PURE String* chars, FontDesc* font, STRING_PURE String* prefix);
|
||||||
void TextAtlas_Free(struct TextAtlas* atlas);
|
void TextAtlas_Free(struct TextAtlas* atlas);
|
||||||
void TextAtlas_Add(struct TextAtlas* atlas, Int32 charI, VertexP3fT2fC4b** vertices);
|
void TextAtlas_Add(struct TextAtlas* atlas, Int32 charI, VertexP3fT2fC4b** vertices);
|
||||||
void TextAtlas_AddInt(struct TextAtlas* atlas, Int32 value, VertexP3fT2fC4b** vertices);
|
void TextAtlas_AddInt(struct TextAtlas* atlas, Int32 value, VertexP3fT2fC4b** vertices);
|
||||||
|
@ -70,7 +70,7 @@ static TextureLoc IsometricDrawer_GetTexLoc(BlockID block, Face face) {
|
|||||||
#define AddVertex *iso_vertices = v; iso_vertices++;
|
#define AddVertex *iso_vertices = v; iso_vertices++;
|
||||||
static void IsometricDrawer_SpriteZQuad(BlockID block, bool firstPart) {
|
static void IsometricDrawer_SpriteZQuad(BlockID block, bool firstPart) {
|
||||||
TextureLoc texLoc = Block_GetTexLoc(block, FACE_ZMAX);
|
TextureLoc texLoc = Block_GetTexLoc(block, FACE_ZMAX);
|
||||||
struct TextureRec rec = Atlas1D_TexRec(texLoc, 1, &iso_texIndex);
|
TextureRec rec = Atlas1D_TexRec(texLoc, 1, &iso_texIndex);
|
||||||
if (iso_lastTexIndex != iso_texIndex) IsometricDrawer_Flush();
|
if (iso_lastTexIndex != iso_texIndex) IsometricDrawer_Flush();
|
||||||
|
|
||||||
VertexP3fT2fC4b v;
|
VertexP3fT2fC4b v;
|
||||||
@ -95,7 +95,7 @@ static void IsometricDrawer_SpriteZQuad(BlockID block, bool firstPart) {
|
|||||||
|
|
||||||
static void IsometricDrawer_SpriteXQuad(BlockID block, bool firstPart) {
|
static void IsometricDrawer_SpriteXQuad(BlockID block, bool firstPart) {
|
||||||
TextureLoc texLoc = Block_GetTexLoc(block, FACE_XMAX);
|
TextureLoc texLoc = Block_GetTexLoc(block, FACE_XMAX);
|
||||||
struct TextureRec rec = Atlas1D_TexRec(texLoc, 1, &iso_texIndex);
|
TextureRec rec = Atlas1D_TexRec(texLoc, 1, &iso_texIndex);
|
||||||
if (iso_lastTexIndex != iso_texIndex) IsometricDrawer_Flush();
|
if (iso_lastTexIndex != iso_texIndex) IsometricDrawer_Flush();
|
||||||
|
|
||||||
VertexP3fT2fC4b v;
|
VertexP3fT2fC4b v;
|
||||||
|
16
src/Menus.c
16
src/Menus.c
@ -39,7 +39,7 @@ struct ListScreen;
|
|||||||
struct ListScreen {
|
struct ListScreen {
|
||||||
MenuBase_Layout
|
MenuBase_Layout
|
||||||
struct ButtonWidget Buttons[LIST_SCREEN_BUTTONS];
|
struct ButtonWidget Buttons[LIST_SCREEN_BUTTONS];
|
||||||
struct FontDesc Font;
|
FontDesc Font;
|
||||||
Real32 WheelAcc;
|
Real32 WheelAcc;
|
||||||
Int32 CurrentIndex;
|
Int32 CurrentIndex;
|
||||||
Widget_LeftClick EntryClick;
|
Widget_LeftClick EntryClick;
|
||||||
@ -50,7 +50,7 @@ struct ListScreen {
|
|||||||
StringsBuffer Entries; /* NOTE: this is the last member so we can avoid memsetting it to 0 */
|
StringsBuffer Entries; /* NOTE: this is the last member so we can avoid memsetting it to 0 */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MenuScreen_Layout MenuBase_Layout struct FontDesc TitleFont, TextFont;
|
#define MenuScreen_Layout MenuBase_Layout FontDesc TitleFont, TextFont;
|
||||||
struct MenuScreen { MenuScreen_Layout };
|
struct MenuScreen { MenuScreen_Layout };
|
||||||
|
|
||||||
struct PauseScreen {
|
struct PauseScreen {
|
||||||
@ -161,7 +161,7 @@ struct TexPackOverlay {
|
|||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*--------------------------------------------------------Menu base--------------------------------------------------------*
|
*--------------------------------------------------------Menu base--------------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
static void Menu_Button(void* s, Int32 i, struct ButtonWidget* btn, Int32 width, String* text, struct FontDesc* font, Widget_LeftClick onClick, UInt8 horAnchor, UInt8 verAnchor, Int32 x, Int32 y) {
|
static void Menu_Button(void* s, Int32 i, struct ButtonWidget* btn, Int32 width, String* text, FontDesc* font, Widget_LeftClick onClick, UInt8 horAnchor, UInt8 verAnchor, Int32 x, Int32 y) {
|
||||||
struct Menu* menu = (struct Menu*)s;
|
struct Menu* menu = (struct Menu*)s;
|
||||||
ButtonWidget_Create(btn, width, text, font, onClick);
|
ButtonWidget_Create(btn, width, text, font, onClick);
|
||||||
|
|
||||||
@ -169,7 +169,7 @@ static void Menu_Button(void* s, Int32 i, struct ButtonWidget* btn, Int32 width,
|
|||||||
Widget_SetLocation(menu->Widgets[i], horAnchor, verAnchor, x, y);
|
Widget_SetLocation(menu->Widgets[i], horAnchor, verAnchor, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Menu_Label(void* s, Int32 i, struct TextWidget* label, String* text, struct FontDesc* font, UInt8 horAnchor, UInt8 verAnchor, Int32 x, Int32 y) {
|
static void Menu_Label(void* s, Int32 i, struct TextWidget* label, String* text, FontDesc* font, UInt8 horAnchor, UInt8 verAnchor, Int32 x, Int32 y) {
|
||||||
struct Menu* menu = (struct Menu*)s;
|
struct Menu* menu = (struct Menu*)s;
|
||||||
TextWidget_Create(label, text, font);
|
TextWidget_Create(label, text, font);
|
||||||
|
|
||||||
@ -177,7 +177,7 @@ static void Menu_Label(void* s, Int32 i, struct TextWidget* label, String* text,
|
|||||||
Widget_SetLocation(menu->Widgets[i], horAnchor, verAnchor, x, y);
|
Widget_SetLocation(menu->Widgets[i], horAnchor, verAnchor, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Menu_Input(void* s, Int32 i, struct MenuInputWidget* input, Int32 width, String* text, struct FontDesc* font, struct MenuInputValidator* v, UInt8 horAnchor, UInt8 verAnchor, Int32 x, Int32 y) {
|
static void Menu_Input(void* s, Int32 i, struct MenuInputWidget* input, Int32 width, String* text, FontDesc* font, struct MenuInputValidator* v, UInt8 horAnchor, UInt8 verAnchor, Int32 x, Int32 y) {
|
||||||
struct Menu* menu = (struct Menu*)s;
|
struct Menu* menu = (struct Menu*)s;
|
||||||
MenuInputWidget_Create(input, width, 30, text, font, v);
|
MenuInputWidget_Create(input, width, 30, text, font, v);
|
||||||
|
|
||||||
@ -186,7 +186,7 @@ static void Menu_Input(void* s, Int32 i, struct MenuInputWidget* input, Int32 wi
|
|||||||
input->Base.ShowCaret = true;
|
input->Base.ShowCaret = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Menu_Back(void* s, Int32 i, struct ButtonWidget* btn, const char* label, struct FontDesc* font, Widget_LeftClick onClick) {
|
static void Menu_Back(void* s, Int32 i, struct ButtonWidget* btn, const char* label, FontDesc* font, Widget_LeftClick onClick) {
|
||||||
Int32 width = Game_UseClassicOptions ? 400 : 200;
|
Int32 width = Game_UseClassicOptions ? 400 : 200;
|
||||||
String msg = String_FromReadonly(label);
|
String msg = String_FromReadonly(label);
|
||||||
Menu_Button(s, i, btn, width, &msg, font, onClick, ANCHOR_CENTRE, ANCHOR_MAX, 0, 25);
|
Menu_Button(s, i, btn, width, &msg, font, onClick, ANCHOR_CENTRE, ANCHOR_MAX, 0, 25);
|
||||||
@ -613,7 +613,7 @@ static void PauseScreen_CheckHacksAllowed(void* screen) {
|
|||||||
|
|
||||||
static void PauseScreen_ContextRecreated(void* screen) {
|
static void PauseScreen_ContextRecreated(void* screen) {
|
||||||
struct PauseScreen* s = screen;
|
struct PauseScreen* s = screen;
|
||||||
struct FontDesc* font = &s->TitleFont;
|
FontDesc* font = &s->TitleFont;
|
||||||
|
|
||||||
if (Game_UseClassicOptions) {
|
if (Game_UseClassicOptions) {
|
||||||
PauseScreen_MakeClassic(s, 0, -100, "Options...", Menu_SwitchClassicOptions);
|
PauseScreen_MakeClassic(s, 0, -100, "Options...", Menu_SwitchClassicOptions);
|
||||||
@ -1436,7 +1436,7 @@ static void FontListScreen_EntryClick(void* screen, void* widget) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void FontListScreen_UpdateEntry(struct ListScreen* s, struct ButtonWidget* button, STRING_PURE String* text) {
|
static void FontListScreen_UpdateEntry(struct ListScreen* s, struct ButtonWidget* button, STRING_PURE String* text) {
|
||||||
struct FontDesc font = { 0 };
|
FontDesc font = { 0 };
|
||||||
Font_Make(&font, text, 16, FONT_STYLE_NORMAL);
|
Font_Make(&font, text, 16, FONT_STYLE_NORMAL);
|
||||||
ButtonWidget_Set(button, text, &font);
|
ButtonWidget_Set(button, text, &font);
|
||||||
Font_Free(&font);
|
Font_Free(&font);
|
||||||
|
@ -108,7 +108,7 @@ void Model_SetupState(struct Model* model, struct Entity* entity) {
|
|||||||
model->index = 0;
|
model->index = 0;
|
||||||
PackedCol col = entity->VTABLE->GetCol(entity);
|
PackedCol col = entity->VTABLE->GetCol(entity);
|
||||||
|
|
||||||
bool _64x64 = entity->SkinType != SKIN_TYPE_64x32;
|
bool _64x64 = entity->SkinType != SKIN_64x32;
|
||||||
/* only apply when using humanoid skins */
|
/* only apply when using humanoid skins */
|
||||||
_64x64 &= model->UsesHumanSkin || entity->MobTextureId;
|
_64x64 &= model->UsesHumanSkin || entity->MobTextureId;
|
||||||
|
|
||||||
@ -150,7 +150,7 @@ void Model_ApplyTexture(struct Entity* entity) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Gfx_BindTexture(tex);
|
Gfx_BindTexture(tex);
|
||||||
bool _64x64 = Model_skinType != SKIN_TYPE_64x32;
|
bool _64x64 = Model_skinType != SKIN_64x32;
|
||||||
Model_uScale = entity->uScale * 0.015625f;
|
Model_uScale = entity->uScale * 0.015625f;
|
||||||
Model_vScale = entity->vScale * (_64x64 ? 0.015625f : 0.03125f);
|
Model_vScale = entity->vScale * (_64x64 ? 0.015625f : 0.03125f);
|
||||||
}
|
}
|
||||||
|
@ -807,7 +807,7 @@ static void HumanModel_DrawModel(struct Entity* entity, struct ModelSet* model)
|
|||||||
Gfx_SetAlphaTest(false);
|
Gfx_SetAlphaTest(false);
|
||||||
|
|
||||||
UInt8 type = Model_skinType;
|
UInt8 type = Model_skinType;
|
||||||
struct ModelLimbs* set = &model->Limbs[type == SKIN_TYPE_64x64_SLIM ? 2 : (type == SKIN_TYPE_64x64 ? 1 : 0)];
|
struct ModelLimbs* set = &model->Limbs[type == SKIN_64x64_SLIM ? 2 : (type == SKIN_64x64 ? 1 : 0)];
|
||||||
|
|
||||||
Model_DrawRotate(-entity->HeadX * MATH_DEG2RAD, 0, 0, &model->Head, true);
|
Model_DrawRotate(-entity->HeadX * MATH_DEG2RAD, 0, 0, &model->Head, true);
|
||||||
Model_DrawPart(&model->Torso);
|
Model_DrawPart(&model->Torso);
|
||||||
@ -821,7 +821,7 @@ static void HumanModel_DrawModel(struct Entity* entity, struct ModelSet* model)
|
|||||||
Model_UpdateVB();
|
Model_UpdateVB();
|
||||||
|
|
||||||
Gfx_SetAlphaTest(true);
|
Gfx_SetAlphaTest(true);
|
||||||
if (type != SKIN_TYPE_64x32) {
|
if (type != SKIN_64x32) {
|
||||||
Model_DrawPart(&model->TorsoLayer);
|
Model_DrawPart(&model->TorsoLayer);
|
||||||
Model_DrawRotate(entity->Anim.LeftLegX, 0, entity->Anim.LeftLegZ, &set->LeftLegLayer, false);
|
Model_DrawRotate(entity->Anim.LeftLegX, 0, entity->Anim.LeftLegZ, &set->LeftLegLayer, false);
|
||||||
Model_DrawRotate(entity->Anim.RightLegX, 0, entity->Anim.RightLegZ, &set->RightLegLayer, false);
|
Model_DrawRotate(entity->Anim.RightLegX, 0, entity->Anim.RightLegZ, &set->RightLegLayer, false);
|
||||||
@ -837,10 +837,10 @@ static void HumanModel_DrawModel(struct Entity* entity, struct ModelSet* model)
|
|||||||
|
|
||||||
static void HumanModel_DrawArm(struct Entity* entity, struct ModelSet* model) {
|
static void HumanModel_DrawArm(struct Entity* entity, struct ModelSet* model) {
|
||||||
UInt8 type = Model_skinType;
|
UInt8 type = Model_skinType;
|
||||||
struct ModelLimbs* set = &model->Limbs[type == SKIN_TYPE_64x64_SLIM ? 2 : (type == SKIN_TYPE_64x64 ? 1 : 0)];
|
struct ModelLimbs* set = &model->Limbs[type == SKIN_64x64_SLIM ? 2 : (type == SKIN_64x64 ? 1 : 0)];
|
||||||
|
|
||||||
Model_DrawArmPart(&set->RightArm);
|
Model_DrawArmPart(&set->RightArm);
|
||||||
if (type != SKIN_TYPE_64x32) {
|
if (type != SKIN_64x32) {
|
||||||
Model_DrawArmPart(&set->RightArmLayer);
|
Model_DrawArmPart(&set->RightArmLayer);
|
||||||
}
|
}
|
||||||
Model_UpdateVB();
|
Model_UpdateVB();
|
||||||
@ -1166,7 +1166,7 @@ if (Block_Tinted[block]) {\
|
|||||||
|
|
||||||
static void BlockModel_SpriteZQuad(bool firstPart, bool mirror) {
|
static void BlockModel_SpriteZQuad(bool firstPart, bool mirror) {
|
||||||
TextureLoc texLoc = Block_GetTexLoc(BlockModel_block, FACE_ZMAX);
|
TextureLoc texLoc = Block_GetTexLoc(BlockModel_block, FACE_ZMAX);
|
||||||
struct TextureRec rec = Atlas1D_TexRec(texLoc, 1, &BlockModel_texIndex);
|
TextureRec rec = Atlas1D_TexRec(texLoc, 1, &BlockModel_texIndex);
|
||||||
BlockModel_FlushIfNotSame;
|
BlockModel_FlushIfNotSame;
|
||||||
|
|
||||||
PackedCol col = Model_Cols[0];
|
PackedCol col = Model_Cols[0];
|
||||||
@ -1193,7 +1193,7 @@ static void BlockModel_SpriteZQuad(bool firstPart, bool mirror) {
|
|||||||
|
|
||||||
static void BlockModel_SpriteXQuad(bool firstPart, bool mirror) {
|
static void BlockModel_SpriteXQuad(bool firstPart, bool mirror) {
|
||||||
TextureLoc texLoc = Block_GetTexLoc(BlockModel_block, FACE_XMAX);
|
TextureLoc texLoc = Block_GetTexLoc(BlockModel_block, FACE_XMAX);
|
||||||
struct TextureRec rec = Atlas1D_TexRec(texLoc, 1, &BlockModel_texIndex);
|
TextureRec rec = Atlas1D_TexRec(texLoc, 1, &BlockModel_texIndex);
|
||||||
BlockModel_FlushIfNotSame;
|
BlockModel_FlushIfNotSame;
|
||||||
|
|
||||||
PackedCol col = Model_Cols[0];
|
PackedCol col = Model_Cols[0];
|
||||||
|
@ -165,7 +165,7 @@ static void Window_RefreshBorders(void) {
|
|||||||
static void Window_RefreshBounds(XEvent* e) {
|
static void Window_RefreshBounds(XEvent* e) {
|
||||||
Window_RefreshBorders();
|
Window_RefreshBorders();
|
||||||
|
|
||||||
struct Point2D loc = { e->xconfigure.x - borderLeft, e->xconfigure.y - borderTop };
|
Point2D loc = { e->xconfigure.x - borderLeft, e->xconfigure.y - borderTop };
|
||||||
if (loc.X != Window_Bounds.X || loc.Y != Window_Bounds.Y) {
|
if (loc.X != Window_Bounds.X || loc.Y != Window_Bounds.Y) {
|
||||||
Window_Bounds.X = loc.X; Window_Bounds.Y = loc.Y;
|
Window_Bounds.X = loc.X; Window_Bounds.Y = loc.Y;
|
||||||
Event_RaiseVoid(&WindowEvents_Moved);
|
Event_RaiseVoid(&WindowEvents_Moved);
|
||||||
@ -173,14 +173,14 @@ static void Window_RefreshBounds(XEvent* e) {
|
|||||||
|
|
||||||
/* Note: width and height denote the internal (client) size.
|
/* Note: width and height denote the internal (client) size.
|
||||||
To get the external (window) size, we need to add the border size. */
|
To get the external (window) size, we need to add the border size. */
|
||||||
struct Size2D size = {
|
Size2D size = {
|
||||||
e->xconfigure.width + borderLeft + borderRight,
|
e->xconfigure.width + borderLeft + borderRight,
|
||||||
e->xconfigure.height + borderTop + borderBottom
|
e->xconfigure.height + borderTop + borderBottom
|
||||||
};
|
};
|
||||||
|
|
||||||
if (size.Width != Window_Bounds.Width || size.Height != Window_Bounds.Height) {
|
if (size.Width != Window_Bounds.Width || size.Height != Window_Bounds.Height) {
|
||||||
Window_Bounds.Width = size.Width; Window_Bounds.Height = size.Height;
|
Window_ClientSize.Width = e->xconfigure.width; Window_Bounds.Width = size.Width;
|
||||||
Window_ClientSize = Size2D_Make(e->xconfigure.width, e->xconfigure.height);
|
Window_ClientSize.Height = e->xconfigure.height; Window_Bounds.Height = size.Height;
|
||||||
Event_RaiseVoid(&WindowEvents_Resized);
|
Event_RaiseVoid(&WindowEvents_Resized);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -380,7 +380,7 @@ void Window_SetWindowState(UInt8 state) {
|
|||||||
Window_ProcessEvents();
|
Window_ProcessEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window_SetBounds(struct Rectangle2D rect) {
|
void Window_SetBounds(Rect2D rect) {
|
||||||
Int32 width = rect.Width - borderLeft - borderRight;
|
Int32 width = rect.Width - borderLeft - borderRight;
|
||||||
Int32 height = rect.Height - borderTop - borderBottom;
|
Int32 height = rect.Height - borderTop - borderBottom;
|
||||||
XMoveResizeWindow(win_display, win_handle, rect.X, rect.Y,
|
XMoveResizeWindow(win_display, win_handle, rect.X, rect.Y,
|
||||||
@ -388,21 +388,20 @@ void Window_SetBounds(struct Rectangle2D rect) {
|
|||||||
Window_ProcessEvents();
|
Window_ProcessEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window_SetLocation(struct Point2D point) {
|
void Window_SetLocation(Int32 x, Int32 y) {
|
||||||
XMoveWindow(win_display, win_handle, point.X, point.Y);
|
XMoveWindow(win_display, win_handle, x, y);
|
||||||
Window_ProcessEvents();
|
Window_ProcessEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window_SetSize(struct Size2D size) {
|
void Window_SetSize(Int32 width, Int32 height) {
|
||||||
Int32 width = size.Width - borderLeft - borderRight;
|
Int32 adjWidth = width - borderLeft - borderRight;
|
||||||
Int32 height = size.Height - borderTop - borderBottom;
|
Int32 adjHeight = height - borderTop - borderBottom;
|
||||||
XResizeWindow(win_display, win_handle,
|
XResizeWindow(win_display, win_handle, adjWidth, adjHeight);
|
||||||
max(width, 1), max(height, 1));
|
|
||||||
Window_ProcessEvents();
|
Window_ProcessEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window_SetClientSize(struct Size2D size) {
|
void Window_SetClientSize(Int32 width, Int32 height) {
|
||||||
XResizeWindow(win_display, win_handle, size.Width, size.Height);
|
XResizeWindow(win_display, win_handle, width, height);
|
||||||
Window_ProcessEvents();
|
Window_ProcessEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -618,29 +617,29 @@ void Window_ProcessEvents(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Point2D Window_PointToClient(struct Point2D point) {
|
Point2D Window_PointToClient(Int32 x, Int32 y) {
|
||||||
int ox, oy;
|
int ox, oy;
|
||||||
Window child;
|
Window child;
|
||||||
XTranslateCoordinates(win_display, win_rootWin, win_handle, point.X, point.Y, &ox, &oy, &child);
|
XTranslateCoordinates(win_display, win_rootWin, win_handle, x, y, &ox, &oy, &child);
|
||||||
return Point2D_Make(ox, oy);
|
Point2D p = { ox, oy }; return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Point2D Window_PointToScreen(struct Point2D point) {
|
Point2D Window_PointToScreen(Int32 x, Int32 y) {
|
||||||
int ox, oy;
|
int ox, oy;
|
||||||
Window child;
|
Window child;
|
||||||
XTranslateCoordinates(win_display, win_handle, win_rootWin, point.X, point.Y, &ox, &oy, &child);
|
XTranslateCoordinates(win_display, win_handle, win_rootWin, x, y, &ox, &oy, &child);
|
||||||
return Point2D_Make(ox, oy);
|
Point2D p = { ox, oy }; return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Point2D Window_GetDesktopCursorPos(void) {
|
Point2D Window_GetDesktopCursorPos(void) {
|
||||||
Window root, child;
|
Window root, child;
|
||||||
int rootX, rootY, childX, childY, mask;
|
int rootX, rootY, childX, childY, mask;
|
||||||
XQueryPointer(win_display, win_rootWin, &root, &child, &rootX, &rootY, &childX, &childY, &mask);
|
XQueryPointer(win_display, win_rootWin, &root, &child, &rootX, &rootY, &childX, &childY, &mask);
|
||||||
return Point2D_Make(rootX, rootY);
|
Point2D p = { rootX, rootY }; return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window_SetDesktopCursorPos(struct Point2D point) {
|
void Window_SetDesktopCursorPos(Int32 x, Int32 y) {
|
||||||
XWarpPointer(win_display, NULL, win_rootWin, 0, 0, 0, 0, point.X, point.Y);
|
XWarpPointer(win_display, NULL, win_rootWin, 0, 0, 0, 0, x, y);
|
||||||
XFlush(win_display); /* TODO: not sure if XFlush call is necessary */
|
XFlush(win_display); /* TODO: not sure if XFlush call is necessary */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include "Chat.h"
|
#include "Chat.h"
|
||||||
#include "Game.h"
|
#include "Game.h"
|
||||||
#include "ExtMath.h"
|
#include "ExtMath.h"
|
||||||
|
#include "Bitmap.h"
|
||||||
|
|
||||||
#if CC_BUILD_WIN
|
#if CC_BUILD_WIN
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
@ -115,7 +116,7 @@ void Gfx_Free(void) {
|
|||||||
|
|
||||||
#define gl_Toggle(cap) if (enabled) { glEnable(cap); } else { glDisable(cap); }
|
#define gl_Toggle(cap) if (enabled) { glEnable(cap); } else { glDisable(cap); }
|
||||||
|
|
||||||
static void GL_DoMipmaps(GfxResourceID texId, Int32 x, Int32 y, struct Bitmap* bmp, bool partial) {
|
static void GL_DoMipmaps(GfxResourceID texId, Int32 x, Int32 y, Bitmap* bmp, bool partial) {
|
||||||
UInt8* prev = bmp->Scan0;
|
UInt8* prev = bmp->Scan0;
|
||||||
Int32 lvls = GfxCommon_MipmapsLevels(bmp->Width, bmp->Height);
|
Int32 lvls = GfxCommon_MipmapsLevels(bmp->Width, bmp->Height);
|
||||||
Int32 lvl, width = bmp->Width, height = bmp->Height;
|
Int32 lvl, width = bmp->Width, height = bmp->Height;
|
||||||
@ -140,7 +141,7 @@ static void GL_DoMipmaps(GfxResourceID texId, Int32 x, Int32 y, struct Bitmap* b
|
|||||||
if (prev != bmp->Scan0) Mem_Free(prev);
|
if (prev != bmp->Scan0) Mem_Free(prev);
|
||||||
}
|
}
|
||||||
|
|
||||||
GfxResourceID Gfx_CreateTexture(struct Bitmap* bmp, bool managedPool, bool mipmaps) {
|
GfxResourceID Gfx_CreateTexture(Bitmap* bmp, bool managedPool, bool mipmaps) {
|
||||||
UInt32 texId;
|
UInt32 texId;
|
||||||
glGenTextures(1, &texId);
|
glGenTextures(1, &texId);
|
||||||
glBindTexture(GL_TEXTURE_2D, texId);
|
glBindTexture(GL_TEXTURE_2D, texId);
|
||||||
@ -166,7 +167,7 @@ GfxResourceID Gfx_CreateTexture(struct Bitmap* bmp, bool managedPool, bool mipma
|
|||||||
return texId;
|
return texId;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gfx_UpdateTexturePart(GfxResourceID texId, Int32 x, Int32 y, struct Bitmap* part, bool mipmaps) {
|
void Gfx_UpdateTexturePart(GfxResourceID texId, Int32 x, Int32 y, Bitmap* part, bool mipmaps) {
|
||||||
glBindTexture(GL_TEXTURE_2D, texId);
|
glBindTexture(GL_TEXTURE_2D, texId);
|
||||||
glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, part->Width, part->Height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, part->Scan0);
|
glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, part->Width, part->Height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, part->Scan0);
|
||||||
if (mipmaps) GL_DoMipmaps(texId, x, y, part, true);
|
if (mipmaps) GL_DoMipmaps(texId, x, y, part, true);
|
||||||
@ -523,7 +524,7 @@ void Gfx_CalcPerspectiveMatrix(Real32 fov, Real32 aspect, Real32 zNear, Real32 z
|
|||||||
|
|
||||||
|
|
||||||
ReturnCode Gfx_TakeScreenshot(struct Stream* output, Int32 width, Int32 height) {
|
ReturnCode Gfx_TakeScreenshot(struct Stream* output, Int32 width, Int32 height) {
|
||||||
struct Bitmap bmp; Bitmap_Allocate(&bmp, width, height);
|
Bitmap bmp; Bitmap_Allocate(&bmp, width, height);
|
||||||
glReadPixels(0, 0, width, height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, bmp.Scan0);
|
glReadPixels(0, 0, width, height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, bmp.Scan0);
|
||||||
UInt8 tmp[PNG_MAX_DIMS * BITMAP_SIZEOF_PIXEL];
|
UInt8 tmp[PNG_MAX_DIMS * BITMAP_SIZEOF_PIXEL];
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ GfxResourceID Particles_TexId, Particles_VB;
|
|||||||
Random rnd;
|
Random rnd;
|
||||||
bool particle_hitTerrain;
|
bool particle_hitTerrain;
|
||||||
|
|
||||||
void Particle_DoRender(Vector2* size, Vector3* pos, struct TextureRec* rec, PackedCol col, VertexP3fT2fC4b* vertices) {
|
void Particle_DoRender(Vector2* size, Vector3* pos, TextureRec* rec, PackedCol col, VertexP3fT2fC4b* vertices) {
|
||||||
Real32 sX = size->X * 0.5f, sY = size->Y * 0.5f;
|
Real32 sX = size->X * 0.5f, sY = size->Y * 0.5f;
|
||||||
Vector3 centre = *pos; centre.Y += sY;
|
Vector3 centre = *pos; centre.Y += sY;
|
||||||
|
|
||||||
@ -141,7 +141,7 @@ static bool RainParticle_Tick(struct RainParticle* p, Real64 delta) {
|
|||||||
return Particle_PhysicsTick(&p->Base, 3.5f, false, delta) || particle_hitTerrain;
|
return Particle_PhysicsTick(&p->Base, 3.5f, false, delta) || particle_hitTerrain;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct TextureRec Rain_Rec = { 2.0f / 128.0f, 14.0f / 128.0f, 5.0f / 128.0f, 16.0f / 128.0f };
|
TextureRec Rain_Rec = { 2.0f / 128.0f, 14.0f / 128.0f, 5.0f / 128.0f, 16.0f / 128.0f };
|
||||||
static void RainParticle_Render(struct RainParticle* p, Real32 t, VertexP3fT2fC4b* vertices) {
|
static void RainParticle_Render(struct RainParticle* p, Real32 t, VertexP3fT2fC4b* vertices) {
|
||||||
Vector3 pos;
|
Vector3 pos;
|
||||||
Vector3_Lerp(&pos, &p->Base.LastPos, &p->Base.NextPos, t);
|
Vector3_Lerp(&pos, &p->Base.LastPos, &p->Base.NextPos, t);
|
||||||
@ -191,7 +191,7 @@ static void Rain_Tick(Real64 delta) {
|
|||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
struct TerrainParticle {
|
struct TerrainParticle {
|
||||||
struct Particle Base;
|
struct Particle Base;
|
||||||
struct TextureRec Rec;
|
TextureRec Rec;
|
||||||
TextureLoc TexLoc;
|
TextureLoc TexLoc;
|
||||||
BlockID Block;
|
BlockID Block;
|
||||||
};
|
};
|
||||||
@ -360,7 +360,7 @@ void Particles_BreakBlockEffect(Vector3I coords, BlockID old, BlockID now) {
|
|||||||
Vector3I_ToVector3(&worldPos, &coords);
|
Vector3I_ToVector3(&worldPos, &coords);
|
||||||
TextureLoc texLoc = Block_GetTexLoc(old, FACE_XMIN);
|
TextureLoc texLoc = Block_GetTexLoc(old, FACE_XMIN);
|
||||||
Int32 texIndex;
|
Int32 texIndex;
|
||||||
struct TextureRec baseRec = Atlas1D_TexRec(texLoc, 1, &texIndex);
|
TextureRec baseRec = Atlas1D_TexRec(texLoc, 1, &texIndex);
|
||||||
Real32 uScale = (1.0f / 16.0f), vScale = (1.0f / 16.0f) * Atlas1D_InvTileSize;
|
Real32 uScale = (1.0f / 16.0f), vScale = (1.0f / 16.0f) * Atlas1D_InvTileSize;
|
||||||
|
|
||||||
Vector3 minBB = Block_MinBB[old];
|
Vector3 minBB = Block_MinBB[old];
|
||||||
@ -395,7 +395,7 @@ void Particles_BreakBlockEffect(Vector3I coords, BlockID old, BlockID now) {
|
|||||||
velocity.Y = CELL_CENTRE + (cellY - 0.0f) + (Random_Float(&rnd) * 0.4f - 0.2f);
|
velocity.Y = CELL_CENTRE + (cellY - 0.0f) + (Random_Float(&rnd) * 0.4f - 0.2f);
|
||||||
velocity.Z = CELL_CENTRE + (cellZ - 0.5f) + (Random_Float(&rnd) * 0.4f - 0.2f);
|
velocity.Z = CELL_CENTRE + (cellZ - 0.5f) + (Random_Float(&rnd) * 0.4f - 0.2f);
|
||||||
|
|
||||||
struct TextureRec rec = baseRec;
|
TextureRec rec = baseRec;
|
||||||
rec.U1 = baseRec.U1 + Random_Range(&rnd, minU, maxUsedU) * uScale;
|
rec.U1 = baseRec.U1 + Random_Range(&rnd, minU, maxUsedU) * uScale;
|
||||||
rec.V1 = baseRec.V1 + Random_Range(&rnd, minV, maxUsedV) * vScale;
|
rec.V1 = baseRec.V1 + Random_Range(&rnd, minV, maxUsedV) * vScale;
|
||||||
rec.U2 = rec.U1 + 4 * uScale;
|
rec.U2 = rec.U1 + 4 * uScale;
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
#define CC_PARTICLE_H
|
#define CC_PARTICLE_H
|
||||||
#include "Vectors.h"
|
#include "Vectors.h"
|
||||||
#include "VertexStructs.h"
|
#include "VertexStructs.h"
|
||||||
#include "2DStructs.h"
|
|
||||||
/* Represents particle effects, and manages rendering and spawning particles.
|
/* Represents particle effects, and manages rendering and spawning particles.
|
||||||
Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
|
Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
|
||||||
*/
|
*/
|
||||||
@ -17,7 +16,7 @@ struct Particle {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* http://www.opengl-tutorial.org/intermediate-tutorials/billboards-particles/billboards/ */
|
/* http://www.opengl-tutorial.org/intermediate-tutorials/billboards-particles/billboards/ */
|
||||||
void Particle_DoRender(Vector2* size, Vector3* pos, struct TextureRec* rec, PackedCol col, VertexP3fT2fC4b* vertices);
|
void Particle_DoRender(Vector2* size, Vector3* pos, TextureRec* rec, PackedCol col, VertexP3fT2fC4b* vertices);
|
||||||
void Particles_MakeComponent(struct IGameComponent* comp);
|
void Particles_MakeComponent(struct IGameComponent* comp);
|
||||||
void Particles_Render(Real64 delta, Real32 t);
|
void Particles_Render(Real64 delta, Real32 t);
|
||||||
void Particles_Tick(struct ScheduledTask* task);
|
void Particles_Tick(struct ScheduledTask* task);
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include "Drawer2D.h"
|
#include "Drawer2D.h"
|
||||||
#include "Funcs.h"
|
#include "Funcs.h"
|
||||||
#include "AsyncDownloader.h"
|
#include "AsyncDownloader.h"
|
||||||
|
#include "Bitmap.h"
|
||||||
|
|
||||||
#if CC_BUILD_WIN
|
#if CC_BUILD_WIN
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
@ -681,7 +682,7 @@ void Font_GetNames(StringsBuffer* buffer) {
|
|||||||
EnumFontFamiliesW(hdc, NULL, Font_GetNamesCallback, buffer);
|
EnumFontFamiliesW(hdc, NULL, Font_GetNamesCallback, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Font_Make(struct FontDesc* desc, STRING_PURE String* fontName, UInt16 size, UInt16 style) {
|
void Font_Make(FontDesc* desc, STRING_PURE String* fontName, UInt16 size, UInt16 style) {
|
||||||
desc->Size = size;
|
desc->Size = size;
|
||||||
desc->Style = style;
|
desc->Style = style;
|
||||||
LOGFONTA font = { 0 };
|
LOGFONTA font = { 0 };
|
||||||
@ -697,33 +698,33 @@ void Font_Make(struct FontDesc* desc, STRING_PURE String* fontName, UInt16 size,
|
|||||||
if (!desc->Handle) ErrorHandler_Fail("Creating font handle failed");
|
if (!desc->Handle) ErrorHandler_Fail("Creating font handle failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Font_Free(struct FontDesc* desc) {
|
void Font_Free(FontDesc* desc) {
|
||||||
if (!DeleteObject(desc->Handle)) ErrorHandler_Fail("Deleting font handle failed");
|
if (!DeleteObject(desc->Handle)) ErrorHandler_Fail("Deleting font handle failed");
|
||||||
desc->Handle = NULL;
|
desc->Handle = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: not associate font with device so much */
|
/* TODO: not associate font with device so much */
|
||||||
struct Size2D Platform_TextMeasure(struct DrawTextArgs* args) {
|
Size2D Platform_TextMeasure(struct DrawTextArgs* args) {
|
||||||
WCHAR str[300]; Platform_ConvertString(str, &args->Text);
|
WCHAR str[300]; Platform_ConvertString(str, &args->Text);
|
||||||
HGDIOBJ oldFont = SelectObject(hdc, args->Font.Handle);
|
HGDIOBJ oldFont = SelectObject(hdc, args->Font.Handle);
|
||||||
SIZE area; GetTextExtentPointW(hdc, str, args->Text.length, &area);
|
SIZE area; GetTextExtentPointW(hdc, str, args->Text.length, &area);
|
||||||
|
|
||||||
SelectObject(hdc, oldFont);
|
SelectObject(hdc, oldFont);
|
||||||
return Size2D_Make(area.cx, area.cy);
|
Size2D s = { area.cx, area.cy }; return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
HBITMAP platform_dib;
|
HBITMAP platform_dib;
|
||||||
HBITMAP platform_oldBmp;
|
HBITMAP platform_oldBmp;
|
||||||
struct Bitmap* platform_bmp;
|
Bitmap* platform_bmp;
|
||||||
void* platform_bits;
|
void* platform_bits;
|
||||||
|
|
||||||
void Platform_SetBitmap(struct Bitmap* bmp) {
|
void Platform_SetBitmap(Bitmap* bmp) {
|
||||||
platform_bmp = bmp;
|
platform_bmp = bmp;
|
||||||
platform_bits = NULL;
|
platform_bits = NULL;
|
||||||
|
|
||||||
BITMAPINFO bmi = { 0 };
|
BITMAPINFO bmi = { 0 };
|
||||||
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
||||||
bmi.bmiHeader.biWidth = bmp->Width;
|
bmi.bmiHeader.biWidth = bmp->Width;
|
||||||
bmi.bmiHeader.biHeight = -bmp->Height;
|
bmi.bmiHeader.biHeight = -bmp->Height;
|
||||||
bmi.bmiHeader.biPlanes = 1;
|
bmi.bmiHeader.biPlanes = 1;
|
||||||
bmi.bmiHeader.biBitCount = 32;
|
bmi.bmiHeader.biBitCount = 32;
|
||||||
@ -737,7 +738,7 @@ void Platform_SetBitmap(struct Bitmap* bmp) {
|
|||||||
/* TODO: check return codes and stuff */
|
/* TODO: check return codes and stuff */
|
||||||
/* TODO: make text prettier.. somehow? */
|
/* TODO: make text prettier.. somehow? */
|
||||||
/* TODO: Do we need to / 255 instead of >> 8 ? */
|
/* TODO: Do we need to / 255 instead of >> 8 ? */
|
||||||
struct Size2D Platform_TextDraw(struct DrawTextArgs* args, Int32 x, Int32 y, PackedCol col) {
|
Size2D Platform_TextDraw(struct DrawTextArgs* args, Int32 x, Int32 y, PackedCol col) {
|
||||||
WCHAR str[300]; Platform_ConvertString(str, &args->Text);
|
WCHAR str[300]; Platform_ConvertString(str, &args->Text);
|
||||||
|
|
||||||
HGDIOBJ oldFont = (HFONT)SelectObject(hdc, (HFONT)args->Font.Handle);
|
HGDIOBJ oldFont = (HFONT)SelectObject(hdc, (HFONT)args->Font.Handle);
|
||||||
@ -745,7 +746,7 @@ struct Size2D Platform_TextDraw(struct DrawTextArgs* args, Int32 x, Int32 y, Pac
|
|||||||
TextOutW(hdc, 0, 0, str, args->Text.length);
|
TextOutW(hdc, 0, 0, str, args->Text.length);
|
||||||
|
|
||||||
Int32 xx, yy;
|
Int32 xx, yy;
|
||||||
struct Bitmap* bmp = platform_bmp;
|
Bitmap* bmp = platform_bmp;
|
||||||
for (yy = 0; yy < area.cy; yy++) {
|
for (yy = 0; yy < area.cy; yy++) {
|
||||||
UInt8* src = (UInt8*)platform_bits + (yy * (bmp->Width << 2));
|
UInt8* src = (UInt8*)platform_bits + (yy * (bmp->Width << 2));
|
||||||
UInt8* dst = (UInt8*)Bitmap_GetRow(bmp, y + yy); dst += x * BITMAP_SIZEOF_PIXEL;
|
UInt8* dst = (UInt8*)Bitmap_GetRow(bmp, y + yy); dst += x * BITMAP_SIZEOF_PIXEL;
|
||||||
@ -764,7 +765,7 @@ struct Size2D Platform_TextDraw(struct DrawTextArgs* args, Int32 x, Int32 y, Pac
|
|||||||
SelectObject(hdc, oldFont);
|
SelectObject(hdc, oldFont);
|
||||||
//DrawTextA(hdc, args->Text.buffer, args->Text.length,
|
//DrawTextA(hdc, args->Text.buffer, args->Text.length,
|
||||||
// &r, DT_NOPREFIX | DT_SINGLELINE | DT_NOCLIP);
|
// &r, DT_NOPREFIX | DT_SINGLELINE | DT_NOCLIP);
|
||||||
return Size2D_Make(area.cx, area.cy);
|
Size2D s = { area.cx, area.cy }; return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Platform_ReleaseBitmap(void) {
|
void Platform_ReleaseBitmap(void) {
|
||||||
|
@ -1,14 +1,11 @@
|
|||||||
#ifndef CC_PLATFORM_H
|
#ifndef CC_PLATFORM_H
|
||||||
#define CC_PLATFORM_H
|
#define CC_PLATFORM_H
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
#include "2DStructs.h"
|
|
||||||
#include "PackedCol.h"
|
#include "PackedCol.h"
|
||||||
/* Abstracts platform specific memory management, I/O, etc.
|
/* Abstracts platform specific memory management, I/O, etc.
|
||||||
Copyright 2017 ClassicalSharp | Licensed under BSD-3
|
Copyright 2017 ClassicalSharp | Licensed under BSD-3
|
||||||
*/
|
*/
|
||||||
struct DrawTextArgs;
|
struct DrawTextArgs;
|
||||||
struct FontDesc;
|
|
||||||
struct Bitmap;
|
|
||||||
struct AsyncRequest;
|
struct AsyncRequest;
|
||||||
|
|
||||||
enum SOCKET_SELECT { SOCKET_SELECT_READ, SOCKET_SELECT_WRITE };
|
enum SOCKET_SELECT { SOCKET_SELECT_READ, SOCKET_SELECT_WRITE };
|
||||||
@ -89,11 +86,11 @@ void Waitable_Wait(void* handle);
|
|||||||
void Waitable_WaitFor(void* handle, UInt32 milliseconds);
|
void Waitable_WaitFor(void* handle, UInt32 milliseconds);
|
||||||
|
|
||||||
void Font_GetNames(StringsBuffer* buffer);
|
void Font_GetNames(StringsBuffer* buffer);
|
||||||
void Font_Make(struct FontDesc* desc, STRING_PURE String* fontName, UInt16 size, UInt16 style);
|
void Font_Make(FontDesc* desc, STRING_PURE String* fontName, UInt16 size, UInt16 style);
|
||||||
void Font_Free(struct FontDesc* desc);
|
void Font_Free(FontDesc* desc);
|
||||||
struct Size2D Platform_TextMeasure(struct DrawTextArgs* args);
|
Size2D Platform_TextMeasure(struct DrawTextArgs* args);
|
||||||
void Platform_SetBitmap(struct Bitmap* bmp);
|
void Platform_SetBitmap(Bitmap* bmp);
|
||||||
struct Size2D Platform_TextDraw(struct DrawTextArgs* args, Int32 x, Int32 y, PackedCol col);
|
Size2D Platform_TextDraw(struct DrawTextArgs* args, Int32 x, Int32 y, PackedCol col);
|
||||||
void Platform_ReleaseBitmap(void);
|
void Platform_ReleaseBitmap(void);
|
||||||
|
|
||||||
void Socket_Create(SocketPtr* socket);
|
void Socket_Create(SocketPtr* socket);
|
||||||
|
@ -23,14 +23,14 @@
|
|||||||
|
|
||||||
struct InventoryScreen {
|
struct InventoryScreen {
|
||||||
Screen_Layout
|
Screen_Layout
|
||||||
struct FontDesc Font;
|
FontDesc Font;
|
||||||
struct TableWidget Table;
|
struct TableWidget Table;
|
||||||
bool ReleasedInv, DeferredSelect;
|
bool ReleasedInv, DeferredSelect;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct StatusScreen {
|
struct StatusScreen {
|
||||||
Screen_Layout
|
Screen_Layout
|
||||||
struct FontDesc Font;
|
FontDesc Font;
|
||||||
struct TextWidget Status, HackStates;
|
struct TextWidget Status, HackStates;
|
||||||
struct TextAtlas PosAtlas;
|
struct TextAtlas PosAtlas;
|
||||||
Real64 Accumulator;
|
Real64 Accumulator;
|
||||||
@ -44,13 +44,13 @@ struct HUDScreen {
|
|||||||
struct Screen* Chat;
|
struct Screen* Chat;
|
||||||
struct HotbarWidget Hotbar;
|
struct HotbarWidget Hotbar;
|
||||||
struct PlayerListWidget PlayerList;
|
struct PlayerListWidget PlayerList;
|
||||||
struct FontDesc PlayerFont;
|
FontDesc PlayerFont;
|
||||||
bool ShowingList, WasShowingList;
|
bool ShowingList, WasShowingList;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct LoadingScreen {
|
struct LoadingScreen {
|
||||||
Screen_Layout
|
Screen_Layout
|
||||||
struct FontDesc Font;
|
FontDesc Font;
|
||||||
Real32 Progress;
|
Real32 Progress;
|
||||||
|
|
||||||
struct TextWidget Title, Message;
|
struct TextWidget Title, Message;
|
||||||
@ -71,7 +71,7 @@ struct ChatScreen {
|
|||||||
bool SuppressNextPress;
|
bool SuppressNextPress;
|
||||||
Int32 ChatIndex;
|
Int32 ChatIndex;
|
||||||
Int32 LastDownloadStatus;
|
Int32 LastDownloadStatus;
|
||||||
struct FontDesc ChatFont, ChatUrlFont, AnnouncementFont;
|
FontDesc ChatFont, ChatUrlFont, AnnouncementFont;
|
||||||
struct TextWidget Announcement;
|
struct TextWidget Announcement;
|
||||||
struct ChatInputWidget Input;
|
struct ChatInputWidget Input;
|
||||||
struct TextGroupWidget Status, BottomRight, Chat, ClientStatus;
|
struct TextGroupWidget Status, BottomRight, Chat, ClientStatus;
|
||||||
@ -98,7 +98,7 @@ struct DisconnectScreen {
|
|||||||
Int32 LastSecsLeft;
|
Int32 LastSecsLeft;
|
||||||
struct ButtonWidget Reconnect;
|
struct ButtonWidget Reconnect;
|
||||||
|
|
||||||
struct FontDesc TitleFont, MessageFont;
|
FontDesc TitleFont, MessageFont;
|
||||||
struct TextWidget Title, Message;
|
struct TextWidget Title, Message;
|
||||||
char __TitleBuffer[STRING_SIZE];
|
char __TitleBuffer[STRING_SIZE];
|
||||||
char __MessageBuffer[STRING_SIZE];
|
char __MessageBuffer[STRING_SIZE];
|
||||||
@ -523,7 +523,7 @@ static void LoadingScreen_DrawBackground(void) {
|
|||||||
PackedCol col = PACKEDCOL_CONST(64, 64, 64, 255);
|
PackedCol col = PACKEDCOL_CONST(64, 64, 64, 255);
|
||||||
|
|
||||||
TextureLoc texLoc = Block_GetTexLoc(BLOCK_DIRT, FACE_YMAX);
|
TextureLoc texLoc = Block_GetTexLoc(BLOCK_DIRT, FACE_YMAX);
|
||||||
struct TextureRec rec = Atlas1D_TexRec(texLoc, 1, &atlasIndex);
|
TextureRec rec = Atlas1D_TexRec(texLoc, 1, &atlasIndex);
|
||||||
|
|
||||||
Real32 u2 = (Real32)Game_Width / (Real32)LOADING_TILE_SIZE;
|
Real32 u2 = (Real32)Game_Width / (Real32)LOADING_TILE_SIZE;
|
||||||
struct Texture tex = { NULL, TEX_RECT(0,0, Game_Width,LOADING_TILE_SIZE), TEX_UV(0,rec.V1, u2,rec.V2) };
|
struct Texture tex = { NULL, TEX_RECT(0,0, Game_Width,LOADING_TILE_SIZE), TEX_UV(0,rec.V1, u2,rec.V2) };
|
||||||
@ -618,7 +618,6 @@ static void GeneratingScreen_Init(void* screen) {
|
|||||||
Gen_Done = false;
|
Gen_Done = false;
|
||||||
LoadingScreen_Init(screen);
|
LoadingScreen_Init(screen);
|
||||||
|
|
||||||
void* threadHandle;
|
|
||||||
if (Gen_Vanilla) {
|
if (Gen_Vanilla) {
|
||||||
Thread_Start(&NotchyGen_Generate, true);
|
Thread_Start(&NotchyGen_Generate, true);
|
||||||
} else {
|
} else {
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#include "GraphicsAPI.h"
|
#include "GraphicsAPI.h"
|
||||||
#include "Platform.h"
|
#include "Platform.h"
|
||||||
|
|
||||||
void Atlas2D_UpdateState(struct Bitmap* bmp) {
|
void Atlas2D_UpdateState(Bitmap* bmp) {
|
||||||
Atlas2D_Bitmap = *bmp;
|
Atlas2D_Bitmap = *bmp;
|
||||||
Atlas2D_TileSize = bmp->Width / ATLAS2D_TILES_PER_ROW;
|
Atlas2D_TileSize = bmp->Width / ATLAS2D_TILES_PER_ROW;
|
||||||
Atlas2D_RowsCount = bmp->Height / Atlas2D_TileSize;
|
Atlas2D_RowsCount = bmp->Height / Atlas2D_TileSize;
|
||||||
@ -14,7 +14,7 @@ void Atlas2D_UpdateState(struct Bitmap* bmp) {
|
|||||||
Block_RecalculateSpriteBB();
|
Block_RecalculateSpriteBB();
|
||||||
}
|
}
|
||||||
|
|
||||||
static GfxResourceID Atlas2D_LoadTextureElement_Raw(TextureLoc texLoc, struct Bitmap* element) {
|
static GfxResourceID Atlas2D_LoadTextureElement_Raw(TextureLoc texLoc, Bitmap* element) {
|
||||||
Int32 size = Atlas2D_TileSize;
|
Int32 size = Atlas2D_TileSize;
|
||||||
Int32 x = Atlas2D_TileX(texLoc), y = Atlas2D_TileY(texLoc);
|
Int32 x = Atlas2D_TileX(texLoc), y = Atlas2D_TileY(texLoc);
|
||||||
if (y >= Atlas2D_RowsCount) return NULL;
|
if (y >= Atlas2D_RowsCount) return NULL;
|
||||||
@ -25,7 +25,7 @@ static GfxResourceID Atlas2D_LoadTextureElement_Raw(TextureLoc texLoc, struct Bi
|
|||||||
|
|
||||||
GfxResourceID Atlas2D_LoadTile(TextureLoc texLoc) {
|
GfxResourceID Atlas2D_LoadTile(TextureLoc texLoc) {
|
||||||
Int32 size = Atlas2D_TileSize;
|
Int32 size = Atlas2D_TileSize;
|
||||||
struct Bitmap tile;
|
Bitmap tile;
|
||||||
|
|
||||||
/* Try to allocate bitmap on stack if possible */
|
/* Try to allocate bitmap on stack if possible */
|
||||||
if (size > 64) {
|
if (size > 64) {
|
||||||
@ -46,12 +46,12 @@ void Atlas2D_Free(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct TextureRec Atlas1D_TexRec(TextureLoc texLoc, Int32 uCount, Int32* index) {
|
TextureRec Atlas1D_TexRec(TextureLoc texLoc, Int32 uCount, Int32* index) {
|
||||||
*index = Atlas1D_Index(texLoc);
|
*index = Atlas1D_Index(texLoc);
|
||||||
Int32 y = Atlas1D_RowId(texLoc);
|
Int32 y = Atlas1D_RowId(texLoc);
|
||||||
|
|
||||||
/* Adjust coords to be slightly inside - fixes issues with AMD/ATI cards. */
|
/* Adjust coords to be slightly inside - fixes issues with AMD/ATI cards. */
|
||||||
struct TextureRec rec;
|
TextureRec rec;
|
||||||
rec.U1 = 0.0f;
|
rec.U1 = 0.0f;
|
||||||
rec.V1 = y * Atlas1D_InvTileSize;
|
rec.V1 = y * Atlas1D_InvTileSize;
|
||||||
rec.U2 = (uCount - 1) + UV2_Scale;
|
rec.U2 = (uCount - 1) + UV2_Scale;
|
||||||
@ -61,7 +61,7 @@ struct TextureRec Atlas1D_TexRec(TextureLoc texLoc, Int32 uCount, Int32* index)
|
|||||||
|
|
||||||
static void Atlas1D_Make1DTexture(Int32 i, Int32 atlas1DHeight, Int32* index) {
|
static void Atlas1D_Make1DTexture(Int32 i, Int32 atlas1DHeight, Int32* index) {
|
||||||
Int32 tileSize = Atlas2D_TileSize;
|
Int32 tileSize = Atlas2D_TileSize;
|
||||||
struct Bitmap atlas1D;
|
Bitmap atlas1D;
|
||||||
Bitmap_Allocate(&atlas1D, tileSize, atlas1DHeight);
|
Bitmap_Allocate(&atlas1D, tileSize, atlas1DHeight);
|
||||||
|
|
||||||
Int32 index1D;
|
Int32 index1D;
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#ifndef CC_TERRAINATLAS_H
|
#ifndef CC_TERRAINATLAS_H
|
||||||
#define CC_TERRAINATLAS_H
|
#define CC_TERRAINATLAS_H
|
||||||
#include "Bitmap.h"
|
#include "Core.h"
|
||||||
#include "2DStructs.h"
|
|
||||||
/* Represents the 2D texture atlas of terrain.png, and converted into an array of 1D textures.
|
/* Represents the 2D texture atlas of terrain.png, and converted into an array of 1D textures.
|
||||||
Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
|
Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
|
||||||
*/
|
*/
|
||||||
@ -12,7 +11,7 @@
|
|||||||
#define ATLAS2D_MAX_ROWS_COUNT 32
|
#define ATLAS2D_MAX_ROWS_COUNT 32
|
||||||
#define ATLAS1D_MAX_ATLASES (ATLAS2D_TILES_PER_ROW * ATLAS2D_MAX_ROWS_COUNT)
|
#define ATLAS1D_MAX_ATLASES (ATLAS2D_TILES_PER_ROW * ATLAS2D_MAX_ROWS_COUNT)
|
||||||
|
|
||||||
struct Bitmap Atlas2D_Bitmap;
|
Bitmap Atlas2D_Bitmap;
|
||||||
Int32 Atlas2D_TileSize, Atlas2D_RowsCount;
|
Int32 Atlas2D_TileSize, Atlas2D_RowsCount;
|
||||||
Int32 Atlas1D_Count, Atlas1D_TilesPerAtlas;
|
Int32 Atlas1D_Count, Atlas1D_TilesPerAtlas;
|
||||||
Int32 Atlas1D_Mask, Atlas1D_Shift;
|
Int32 Atlas1D_Mask, Atlas1D_Shift;
|
||||||
@ -26,10 +25,10 @@ GfxResourceID Atlas1D_TexIds[ATLAS1D_MAX_ATLASES];
|
|||||||
/* Returns the index of the 1D atlas within the array of 1D atlases that contains the given tile id */
|
/* Returns the index of the 1D atlas within the array of 1D atlases that contains the given tile id */
|
||||||
#define Atlas1D_Index(texLoc) ((texLoc) >> Atlas1D_Shift) /* texLoc / Atlas1D_TilesPerAtlas */
|
#define Atlas1D_Index(texLoc) ((texLoc) >> Atlas1D_Shift) /* texLoc / Atlas1D_TilesPerAtlas */
|
||||||
|
|
||||||
void Atlas2D_UpdateState(struct Bitmap* bmp);
|
void Atlas2D_UpdateState(Bitmap* bmp);
|
||||||
GfxResourceID Atlas2D_LoadTile(TextureLoc texLoc);
|
GfxResourceID Atlas2D_LoadTile(TextureLoc texLoc);
|
||||||
void Atlas2D_Free(void);
|
void Atlas2D_Free(void);
|
||||||
struct TextureRec Atlas1D_TexRec(TextureLoc texLoc, Int32 uCount, Int32* index);
|
TextureRec Atlas1D_TexRec(TextureLoc texLoc, Int32 uCount, Int32* index);
|
||||||
void Atlas1D_UpdateState(void);
|
void Atlas1D_UpdateState(void);
|
||||||
Int32 Atlas1D_UsedAtlasesCount(void);
|
Int32 Atlas1D_UsedAtlasesCount(void);
|
||||||
void Atlas1D_Free(void);
|
void Atlas1D_Free(void);
|
||||||
|
@ -440,7 +440,7 @@ void TexturePack_ExtractZip_File(STRING_PURE String* filename) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ReturnCode TexturePack_ExtractTerrainPng(struct Stream* stream) {
|
ReturnCode TexturePack_ExtractTerrainPng(struct Stream* stream) {
|
||||||
struct Bitmap bmp;
|
Bitmap bmp;
|
||||||
ReturnCode res = Bitmap_DecodePng(&bmp, stream);
|
ReturnCode res = Bitmap_DecodePng(&bmp, stream);
|
||||||
|
|
||||||
if (!res) {
|
if (!res) {
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
|
Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
|
||||||
*/
|
*/
|
||||||
struct Stream;
|
struct Stream;
|
||||||
struct Bitmap;
|
|
||||||
struct AsyncRequest;
|
struct AsyncRequest;
|
||||||
|
|
||||||
struct ZipEntry { UInt32 CompressedSize, UncompressedSize, LocalHeaderOffset, Crc32; };
|
struct ZipEntry { UInt32 CompressedSize, UncompressedSize, LocalHeaderOffset, Crc32; };
|
||||||
|
@ -145,15 +145,15 @@ Int32 Utils_AccumulateWheelDelta(Real32* accmulator, Real32 delta) {
|
|||||||
return steps;
|
return steps;
|
||||||
}
|
}
|
||||||
|
|
||||||
UInt8 Utils_GetSkinType(struct Bitmap* bmp) {
|
UInt8 Utils_GetSkinType(Bitmap* bmp) {
|
||||||
if (bmp->Width == bmp->Height * 2) return SKIN_TYPE_64x32;
|
if (bmp->Width == bmp->Height * 2) return SKIN_64x32;
|
||||||
if (bmp->Width != bmp->Height) return SKIN_TYPE_INVALID;
|
if (bmp->Width != bmp->Height) return SKIN_INVALID;
|
||||||
|
|
||||||
/* Minecraft alex skins have this particular pixel with alpha of 0 */
|
/* Minecraft alex skins have this particular pixel with alpha of 0 */
|
||||||
Int32 scale = bmp->Width / 64;
|
Int32 scale = bmp->Width / 64;
|
||||||
UInt32 pixel = Bitmap_GetPixel(bmp, 54 * scale, 20 * scale);
|
UInt32 pixel = Bitmap_GetPixel(bmp, 54 * scale, 20 * scale);
|
||||||
UInt8 alpha = PackedCol_ARGB_A(pixel);
|
UInt8 alpha = PackedCol_ARGB_A(pixel);
|
||||||
return alpha >= 127 ? SKIN_TYPE_64x64 : SKIN_TYPE_64x64_SLIM;
|
return alpha >= 127 ? SKIN_64x64 : SKIN_64x64_SLIM;
|
||||||
}
|
}
|
||||||
|
|
||||||
UInt32 Utils_CRC32(UInt8* data, UInt32 length) {
|
UInt32 Utils_CRC32(UInt8* data, UInt32 length) {
|
||||||
|
@ -15,7 +15,6 @@ typedef struct DateTime_ {
|
|||||||
UInt8 Second; /* Second, ranges from 0 to 59 */
|
UInt8 Second; /* Second, ranges from 0 to 59 */
|
||||||
UInt16 Milli; /* Milliseconds, ranges from 0 to 999 */
|
UInt16 Milli; /* Milliseconds, ranges from 0 to 999 */
|
||||||
} DateTime;
|
} DateTime;
|
||||||
struct Bitmap;
|
|
||||||
|
|
||||||
#define DATETIME_MILLIS_PER_SEC 1000
|
#define DATETIME_MILLIS_PER_SEC 1000
|
||||||
UInt64 DateTime_TotalMs(DateTime* time);
|
UInt64 DateTime_TotalMs(DateTime* time);
|
||||||
@ -31,7 +30,7 @@ void Utils_UNSAFE_GetFilename(STRING_TRANSIENT String* str);
|
|||||||
Int32 Utils_AccumulateWheelDelta(Real32* accmulator, Real32 delta);
|
Int32 Utils_AccumulateWheelDelta(Real32* accmulator, Real32 delta);
|
||||||
#define Utils_AdjViewDist(value) ((Int32)(1.4142135f * (value)))
|
#define Utils_AdjViewDist(value) ((Int32)(1.4142135f * (value)))
|
||||||
|
|
||||||
UInt8 Utils_GetSkinType(struct Bitmap* bmp);
|
UInt8 Utils_GetSkinType(Bitmap* bmp);
|
||||||
UInt32 Utils_CRC32(UInt8* data, UInt32 length);
|
UInt32 Utils_CRC32(UInt8* data, UInt32 length);
|
||||||
extern UInt32 Utils_Crc32Table[256];
|
extern UInt32 Utils_Crc32Table[256];
|
||||||
void Utils_Resize(void** buffer, UInt32* maxElems, UInt32 elemSize, UInt32 defElems, UInt32 expandElems);
|
void Utils_Resize(void** buffer, UInt32* maxElems, UInt32 elemSize, UInt32 defElems, UInt32 expandElems);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include "Vectors.h"
|
#include "Vectors.h"
|
||||||
#include "ExtMath.h"
|
#include "ExtMath.h"
|
||||||
#include "Funcs.h"
|
#include "Funcs.h"
|
||||||
|
#include "Constants.h"
|
||||||
|
|
||||||
Vector3 Vector3_Create1(Real32 value) {
|
Vector3 Vector3_Create1(Real32 value) {
|
||||||
Vector3 v; v.X = value; v.Y = value; v.Z = value; return v;
|
Vector3 v; v.X = value; v.Y = value; v.Z = value; return v;
|
||||||
|
@ -188,6 +188,7 @@ static UInt32 Codebook_Lookup1Values(UInt32 entries, UInt32 dimensions) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define CODEWORD_UNUSED UInt8_MaxValue
|
||||||
static bool Codebook_CalcCodewords(struct Codebook* c, UInt8* len) {
|
static bool Codebook_CalcCodewords(struct Codebook* c, UInt8* len) {
|
||||||
c->Codewords = Mem_Alloc(c->NumCodewords, sizeof(UInt32), "codewords");
|
c->Codewords = Mem_Alloc(c->NumCodewords, sizeof(UInt32), "codewords");
|
||||||
c->CodewordLens = Mem_Alloc(c->NumCodewords, sizeof(UInt8), "raw codeword lens");
|
c->CodewordLens = Mem_Alloc(c->NumCodewords, sizeof(UInt8), "raw codeword lens");
|
||||||
@ -199,7 +200,7 @@ static bool Codebook_CalcCodewords(struct Codebook* c, UInt8* len) {
|
|||||||
|
|
||||||
/* add codeword 0 to tree */
|
/* add codeword 0 to tree */
|
||||||
for (i = 0; i < c->Entries; i++) {
|
for (i = 0; i < c->Entries; i++) {
|
||||||
if (len[i] == UInt8_MaxValue) continue;
|
if (len[i] == CODEWORD_UNUSED) continue;
|
||||||
|
|
||||||
c->Codewords[0] = 0;
|
c->Codewords[0] = 0;
|
||||||
c->CodewordLens[0] = len[i];
|
c->CodewordLens[0] = len[i];
|
||||||
@ -215,7 +216,7 @@ static bool Codebook_CalcCodewords(struct Codebook* c, UInt8* len) {
|
|||||||
i++; /* first codeword was already handled */
|
i++; /* first codeword was already handled */
|
||||||
for (j = 1; i < c->Entries; i++) {
|
for (j = 1; i < c->Entries; i++) {
|
||||||
UInt32 root = len[i];
|
UInt32 root = len[i];
|
||||||
if (root == UInt8_MaxValue) continue;
|
if (root == CODEWORD_UNUSED) continue;
|
||||||
|
|
||||||
/* per spec, find lowest possible value (leftmost) */
|
/* per spec, find lowest possible value (leftmost) */
|
||||||
while (root && next_codewords[root] == 0) root--;
|
while (root && next_codewords[root] == 0) root--;
|
||||||
@ -251,7 +252,7 @@ static ReturnCode Codebook_DecodeSetup(struct VorbisState* ctx, struct Codebook*
|
|||||||
if (sparse) {
|
if (sparse) {
|
||||||
Int32 flag = Vorbis_ReadBits(ctx, 1);
|
Int32 flag = Vorbis_ReadBits(ctx, 1);
|
||||||
if (!flag) {
|
if (!flag) {
|
||||||
codewordLens[i] = UInt8_MaxValue;
|
codewordLens[i] = CODEWORD_UNUSED;
|
||||||
continue; /* unused entry */
|
continue; /* unused entry */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,9 +16,12 @@
|
|||||||
#include "Chat.h"
|
#include "Chat.h"
|
||||||
#include "Game.h"
|
#include "Game.h"
|
||||||
#include "ErrorHandler.h"
|
#include "ErrorHandler.h"
|
||||||
|
#include "Bitmap.h"
|
||||||
|
|
||||||
#define WIDGET_UV(u1,v1, u2,v2) u1/256.0f,v1/256.0f, u2/256.0f,v2/256.0f
|
#define WIDGET_UV(u1,v1, u2,v2) u1/256.0f,v1/256.0f, u2/256.0f,v2/256.0f
|
||||||
static void Widget_NullFunc(void* widget) { }
|
static void Widget_NullFunc(void* widget) { }
|
||||||
|
Size2D Size2D_Empty;
|
||||||
|
|
||||||
static bool Widget_Mouse(void* elem, Int32 x, Int32 y, MouseButton btn) { return false; }
|
static bool Widget_Mouse(void* elem, Int32 x, Int32 y, MouseButton btn) { return false; }
|
||||||
static bool Widget_Key(void* elem, Key key) { return false; }
|
static bool Widget_Key(void* elem, Key key) { return false; }
|
||||||
static bool Widget_KeyPress(void* elem, char keyChar) { return false; }
|
static bool Widget_KeyPress(void* elem, char keyChar) { return false; }
|
||||||
@ -59,12 +62,12 @@ void TextWidget_Make(struct TextWidget* w) {
|
|||||||
PackedCol col = PACKEDCOL_WHITE; w->Col = col;
|
PackedCol col = PACKEDCOL_WHITE; w->Col = col;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextWidget_Create(struct TextWidget* w, STRING_PURE String* text, struct FontDesc* font) {
|
void TextWidget_Create(struct TextWidget* w, STRING_PURE String* text, FontDesc* font) {
|
||||||
TextWidget_Make(w);
|
TextWidget_Make(w);
|
||||||
TextWidget_Set(w, text, font);
|
TextWidget_Set(w, text, font);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextWidget_Set(struct TextWidget* w, STRING_PURE String* text, struct FontDesc* font) {
|
void TextWidget_Set(struct TextWidget* w, STRING_PURE String* text, FontDesc* font) {
|
||||||
Gfx_DeleteTexture(&w->Texture.ID);
|
Gfx_DeleteTexture(&w->Texture.ID);
|
||||||
if (Drawer2D_IsEmptyText(text)) {
|
if (Drawer2D_IsEmptyText(text)) {
|
||||||
w->Texture.Width = 0;
|
w->Texture.Width = 0;
|
||||||
@ -151,7 +154,7 @@ struct WidgetVTABLE ButtonWidget_VTABLE = {
|
|||||||
Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll,
|
Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll,
|
||||||
ButtonWidget_Reposition,
|
ButtonWidget_Reposition,
|
||||||
};
|
};
|
||||||
void ButtonWidget_Create(struct ButtonWidget* w, Int32 minWidth, STRING_PURE String* text, struct FontDesc* font, Widget_LeftClick onClick) {
|
void ButtonWidget_Create(struct ButtonWidget* w, Int32 minWidth, STRING_PURE String* text, FontDesc* font, Widget_LeftClick onClick) {
|
||||||
Widget_Reset(w);
|
Widget_Reset(w);
|
||||||
w->VTABLE = &ButtonWidget_VTABLE;
|
w->VTABLE = &ButtonWidget_VTABLE;
|
||||||
w->OptName = NULL;
|
w->OptName = NULL;
|
||||||
@ -160,7 +163,7 @@ void ButtonWidget_Create(struct ButtonWidget* w, Int32 minWidth, STRING_PURE Str
|
|||||||
ButtonWidget_Set(w, text, font);
|
ButtonWidget_Set(w, text, font);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ButtonWidget_Set(struct ButtonWidget* w, STRING_PURE String* text, struct FontDesc* font) {
|
void ButtonWidget_Set(struct ButtonWidget* w, STRING_PURE String* text, FontDesc* font) {
|
||||||
Gfx_DeleteTexture(&w->Texture.ID);
|
Gfx_DeleteTexture(&w->Texture.ID);
|
||||||
if (Drawer2D_IsEmptyText(text)) {
|
if (Drawer2D_IsEmptyText(text)) {
|
||||||
w->Texture.Width = 0;
|
w->Texture.Width = 0;
|
||||||
@ -514,9 +517,9 @@ static void TableWidget_MoveCursorToSelected(struct TableWidget* w) {
|
|||||||
TableWidget_GetCoords(w, i, &x, &y);
|
TableWidget_GetCoords(w, i, &x, &y);
|
||||||
x += w->BlockSize / 2; y += w->BlockSize / 2;
|
x += w->BlockSize / 2; y += w->BlockSize / 2;
|
||||||
|
|
||||||
struct Point2D topLeft = Window_PointToScreen(Point2D_Empty);
|
Point2D topLeft = Window_PointToScreen(0, 0);
|
||||||
x += topLeft.X; y += topLeft.Y;
|
x += topLeft.X; y += topLeft.Y;
|
||||||
Window_SetDesktopCursorPos(Point2D_Make(x, y));
|
Window_SetDesktopCursorPos(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void TableWidget_MakeBlockDesc(STRING_TRANSIENT String* desc, BlockID block) {
|
static void TableWidget_MakeBlockDesc(STRING_TRANSIENT String* desc, BlockID block) {
|
||||||
@ -887,7 +890,7 @@ static void InputWidget_CalculateLineSizes(struct InputWidget* w) {
|
|||||||
InputWidget_FormatLine(w, y, &line);
|
InputWidget_FormatLine(w, y, &line);
|
||||||
args.Text = line;
|
args.Text = line;
|
||||||
|
|
||||||
struct Size2D textSize = Drawer2D_MeasureText(&args);
|
Size2D textSize = Drawer2D_MeasureText(&args);
|
||||||
w->LineSizes[y].Width += textSize.Width;
|
w->LineSizes[y].Width += textSize.Width;
|
||||||
w->LineSizes[y].Height = textSize.Height;
|
w->LineSizes[y].Height = textSize.Height;
|
||||||
}
|
}
|
||||||
@ -931,7 +934,7 @@ static void InputWidget_UpdateCaret(struct InputWidget* w) {
|
|||||||
InputWidget_FormatLine(w, w->CaretY, &line);
|
InputWidget_FormatLine(w, w->CaretY, &line);
|
||||||
|
|
||||||
args.Text = String_UNSAFE_Substring(&line, 0, w->CaretX);
|
args.Text = String_UNSAFE_Substring(&line, 0, w->CaretX);
|
||||||
struct Size2D trimmedSize = Drawer2D_MeasureText(&args);
|
Size2D trimmedSize = Drawer2D_MeasureText(&args);
|
||||||
if (w->CaretY == 0) { trimmedSize.Width += w->PrefixWidth; }
|
if (w->CaretY == 0) { trimmedSize.Width += w->PrefixWidth; }
|
||||||
|
|
||||||
w->CaretTex.X = w->X + w->Padding + trimmedSize.Width;
|
w->CaretTex.X = w->X + w->Padding + trimmedSize.Width;
|
||||||
@ -1246,7 +1249,7 @@ static bool InputWidget_MouseDown(void* widget, Int32 x, Int32 y, MouseButton bu
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
NOINLINE_ static void InputWidget_Create(struct InputWidget* w, struct FontDesc* font, STRING_REF String* prefix) {
|
NOINLINE_ static void InputWidget_Create(struct InputWidget* w, FontDesc* font, STRING_REF String* prefix) {
|
||||||
Widget_Reset(w);
|
Widget_Reset(w);
|
||||||
w->Font = *font;
|
w->Font = *font;
|
||||||
w->Prefix = *prefix;
|
w->Prefix = *prefix;
|
||||||
@ -1262,7 +1265,7 @@ NOINLINE_ static void InputWidget_Create(struct InputWidget* w, struct FontDesc*
|
|||||||
|
|
||||||
if (!prefix->length) return;
|
if (!prefix->length) return;
|
||||||
DrawTextArgs_Make(&args, prefix, font, true);
|
DrawTextArgs_Make(&args, prefix, font, true);
|
||||||
struct Size2D size = Drawer2D_MeasureText(&args);
|
Size2D size = Drawer2D_MeasureText(&args);
|
||||||
w->PrefixWidth = size.Width; w->Width = size.Width;
|
w->PrefixWidth = size.Width; w->Width = size.Width;
|
||||||
w->PrefixHeight = size.Height; w->Height = size.Height;
|
w->PrefixHeight = size.Height; w->Height = size.Height;
|
||||||
}
|
}
|
||||||
@ -1442,7 +1445,7 @@ static void MenuInputWidget_RemakeTexture(void* widget) {
|
|||||||
struct MenuInputWidget* w = widget;
|
struct MenuInputWidget* w = widget;
|
||||||
struct DrawTextArgs args;
|
struct DrawTextArgs args;
|
||||||
DrawTextArgs_Make(&args, &w->Base.Lines[0], &w->Base.Font, false);
|
DrawTextArgs_Make(&args, &w->Base.Lines[0], &w->Base.Font, false);
|
||||||
struct Size2D size = Drawer2D_MeasureText(&args);
|
Size2D size = Drawer2D_MeasureText(&args);
|
||||||
w->Base.CaretAccumulator = 0.0;
|
w->Base.CaretAccumulator = 0.0;
|
||||||
|
|
||||||
char rangeBuffer[STRING_SIZE];
|
char rangeBuffer[STRING_SIZE];
|
||||||
@ -1459,15 +1462,15 @@ static void MenuInputWidget_RemakeTexture(void* widget) {
|
|||||||
|
|
||||||
w->Base.Width = max(size.Width, w->MinWidth);
|
w->Base.Width = max(size.Width, w->MinWidth);
|
||||||
w->Base.Height = max(size.Height, w->MinHeight);
|
w->Base.Height = max(size.Height, w->MinHeight);
|
||||||
struct Size2D adjSize = size; adjSize.Width = w->Base.Width;
|
Size2D adjSize = size; adjSize.Width = w->Base.Width;
|
||||||
|
|
||||||
struct Bitmap bmp; Bitmap_AllocateClearedPow2(&bmp, adjSize.Width, adjSize.Height);
|
Bitmap bmp; Bitmap_AllocateClearedPow2(&bmp, adjSize.Width, adjSize.Height);
|
||||||
Drawer2D_Begin(&bmp);
|
Drawer2D_Begin(&bmp);
|
||||||
{
|
{
|
||||||
Drawer2D_DrawText(&args, w->Base.Padding, 0);
|
Drawer2D_DrawText(&args, w->Base.Padding, 0);
|
||||||
|
|
||||||
args.Text = range;
|
args.Text = range;
|
||||||
struct Size2D hintSize = Drawer2D_MeasureText(&args);
|
Size2D hintSize = Drawer2D_MeasureText(&args);
|
||||||
Int32 hintX = adjSize.Width - hintSize.Width;
|
Int32 hintX = adjSize.Width - hintSize.Width;
|
||||||
if (size.Width + 3 < hintX) {
|
if (size.Width + 3 < hintX) {
|
||||||
Drawer2D_DrawText(&args, hintX, 0);
|
Drawer2D_DrawText(&args, hintX, 0);
|
||||||
@ -1509,7 +1512,7 @@ struct WidgetVTABLE MenuInputWidget_VTABLE = {
|
|||||||
InputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll,
|
InputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll,
|
||||||
InputWidget_Reposition,
|
InputWidget_Reposition,
|
||||||
};
|
};
|
||||||
void MenuInputWidget_Create(struct MenuInputWidget* w, Int32 width, Int32 height, STRING_PURE String* text, struct FontDesc* font, struct MenuInputValidator* validator) {
|
void MenuInputWidget_Create(struct MenuInputWidget* w, Int32 width, Int32 height, STRING_PURE String* text, FontDesc* font, struct MenuInputValidator* validator) {
|
||||||
String empty = String_MakeNull();
|
String empty = String_MakeNull();
|
||||||
InputWidget_Create(&w->Base, font, &empty);
|
InputWidget_Create(&w->Base, font, &empty);
|
||||||
w->Base.VTABLE = &MenuInputWidget_VTABLE;
|
w->Base.VTABLE = &MenuInputWidget_VTABLE;
|
||||||
@ -1544,10 +1547,10 @@ static void ChatInputWidget_RemakeTexture(void* widget) {
|
|||||||
totalHeight += w->LineSizes[i].Height;
|
totalHeight += w->LineSizes[i].Height;
|
||||||
maxWidth = max(maxWidth, w->LineSizes[i].Width);
|
maxWidth = max(maxWidth, w->LineSizes[i].Width);
|
||||||
}
|
}
|
||||||
struct Size2D size = { maxWidth, totalHeight };
|
Size2D size = { maxWidth, totalHeight };
|
||||||
|
|
||||||
Int32 realHeight = 0;
|
Int32 realHeight = 0;
|
||||||
struct Bitmap bmp; Bitmap_AllocateClearedPow2(&bmp, size.Width, size.Height);
|
Bitmap bmp; Bitmap_AllocateClearedPow2(&bmp, size.Width, size.Height);
|
||||||
Drawer2D_Begin(&bmp);
|
Drawer2D_Begin(&bmp);
|
||||||
|
|
||||||
struct DrawTextArgs args; DrawTextArgs_MakeEmpty(&args, &w->Font, true);
|
struct DrawTextArgs args; DrawTextArgs_MakeEmpty(&args, &w->Font, true);
|
||||||
@ -1758,7 +1761,7 @@ struct WidgetVTABLE ChatInputWidget_VTABLE = {
|
|||||||
InputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll,
|
InputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll,
|
||||||
InputWidget_Reposition,
|
InputWidget_Reposition,
|
||||||
};
|
};
|
||||||
void ChatInputWidget_Create(struct ChatInputWidget* w, struct FontDesc* font) {
|
void ChatInputWidget_Create(struct ChatInputWidget* w, FontDesc* font) {
|
||||||
String prefix = String_FromConst("> ");
|
String prefix = String_FromConst("> ");
|
||||||
InputWidget_Create(&w->Base, font, &prefix);
|
InputWidget_Create(&w->Base, font, &prefix);
|
||||||
w->TypingLogPos = Chat_InputLog.Count; /* Index of newest entry + 1. */
|
w->TypingLogPos = Chat_InputLog.Count; /* Index of newest entry + 1. */
|
||||||
@ -2136,7 +2139,7 @@ struct WidgetVTABLE PlayerListWidget_VTABLE = {
|
|||||||
Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll,
|
Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll,
|
||||||
PlayerListWidget_Reposition,
|
PlayerListWidget_Reposition,
|
||||||
};
|
};
|
||||||
void PlayerListWidget_Create(struct PlayerListWidget* w, struct FontDesc* font, bool classic) {
|
void PlayerListWidget_Create(struct PlayerListWidget* w, FontDesc* font, bool classic) {
|
||||||
Widget_Reset(w);
|
Widget_Reset(w);
|
||||||
w->VTABLE = &PlayerListWidget_VTABLE;
|
w->VTABLE = &PlayerListWidget_VTABLE;
|
||||||
w->HorAnchor = ANCHOR_CENTRE;
|
w->HorAnchor = ANCHOR_CENTRE;
|
||||||
@ -2447,8 +2450,8 @@ void TextGroupWidget_DrawAdvanced(struct TextGroupWidget* w, struct Texture* tex
|
|||||||
struct Portion portions[2 * (TEXTGROUPWIDGET_LEN / TEXTGROUPWIDGET_HTTP_LEN)];
|
struct Portion portions[2 * (TEXTGROUPWIDGET_LEN / TEXTGROUPWIDGET_HTTP_LEN)];
|
||||||
Int32 i, x, portionsCount = TextGroupWidget_Reduce(w, chars, index, portions);
|
Int32 i, x, portionsCount = TextGroupWidget_Reduce(w, chars, index, portions);
|
||||||
|
|
||||||
struct Size2D total = Size2D_Empty;
|
Size2D total = { 0, 0 };
|
||||||
struct Size2D partSizes[Array_Elems(portions)];
|
Size2D partSizes[Array_Elems(portions)];
|
||||||
|
|
||||||
for (i = 0; i < portionsCount; i++) {
|
for (i = 0; i < portionsCount; i++) {
|
||||||
struct Portion bit = portions[i];
|
struct Portion bit = portions[i];
|
||||||
@ -2460,7 +2463,7 @@ void TextGroupWidget_DrawAdvanced(struct TextGroupWidget* w, struct Texture* tex
|
|||||||
total.Width += partSizes[i].Width;
|
total.Width += partSizes[i].Width;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Bitmap bmp;
|
Bitmap bmp;
|
||||||
Bitmap_AllocateClearedPow2(&bmp, total.Width, total.Height);
|
Bitmap_AllocateClearedPow2(&bmp, total.Width, total.Height);
|
||||||
Drawer2D_Begin(&bmp);
|
Drawer2D_Begin(&bmp);
|
||||||
{
|
{
|
||||||
@ -2548,7 +2551,7 @@ struct WidgetVTABLE TextGroupWidget_VTABLE = {
|
|||||||
Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll,
|
Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll,
|
||||||
TextGroupWidget_Reposition,
|
TextGroupWidget_Reposition,
|
||||||
};
|
};
|
||||||
void TextGroupWidget_Create(struct TextGroupWidget* w, Int32 linesCount, struct FontDesc* font, struct FontDesc* underlineFont, STRING_REF struct Texture* textures, STRING_REF char* buffer) {
|
void TextGroupWidget_Create(struct TextGroupWidget* w, Int32 linesCount, FontDesc* font, FontDesc* underlineFont, STRING_REF struct Texture* textures, STRING_REF char* buffer) {
|
||||||
Widget_Reset(w);
|
Widget_Reset(w);
|
||||||
w->VTABLE = &TextGroupWidget_VTABLE;
|
w->VTABLE = &TextGroupWidget_VTABLE;
|
||||||
|
|
||||||
@ -2583,7 +2586,7 @@ static void SpecialInputWidget_UpdateColString(struct SpecialInputWidget* w) {
|
|||||||
static bool SpecialInputWidget_IntersectsHeader(struct SpecialInputWidget* w, Int32 x, Int32 y) {
|
static bool SpecialInputWidget_IntersectsHeader(struct SpecialInputWidget* w, Int32 x, Int32 y) {
|
||||||
Int32 titleX = 0, i;
|
Int32 titleX = 0, i;
|
||||||
for (i = 0; i < Array_Elems(w->Tabs); i++) {
|
for (i = 0; i < Array_Elems(w->Tabs); i++) {
|
||||||
struct Size2D size = w->Tabs[i].TitleSize;
|
Size2D size = w->Tabs[i].TitleSize;
|
||||||
if (Gui_Contains(titleX, 0, size.Width, size.Height, x, y)) {
|
if (Gui_Contains(titleX, 0, size.Width, size.Height, x, y)) {
|
||||||
w->SelectedIndex = i;
|
w->SelectedIndex = i;
|
||||||
return true;
|
return true;
|
||||||
@ -2655,7 +2658,7 @@ static Int32 SpecialInputWidget_MeasureTitles(struct SpecialInputWidget* w) {
|
|||||||
return totalWidth;
|
return totalWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SpecialInputWidget_DrawTitles(struct SpecialInputWidget* w, struct Bitmap* bmp) {
|
static void SpecialInputWidget_DrawTitles(struct SpecialInputWidget* w, Bitmap* bmp) {
|
||||||
Int32 x = 0;
|
Int32 x = 0;
|
||||||
struct DrawTextArgs args; DrawTextArgs_MakeEmpty(&args, &w->Font, false);
|
struct DrawTextArgs args; DrawTextArgs_MakeEmpty(&args, &w->Font, false);
|
||||||
|
|
||||||
@ -2665,7 +2668,7 @@ static void SpecialInputWidget_DrawTitles(struct SpecialInputWidget* w, struct B
|
|||||||
for (i = 0; i < Array_Elems(w->Tabs); i++) {
|
for (i = 0; i < Array_Elems(w->Tabs); i++) {
|
||||||
args.Text = w->Tabs[i].Title;
|
args.Text = w->Tabs[i].Title;
|
||||||
PackedCol col = i == w->SelectedIndex ? col_selected : col_inactive;
|
PackedCol col = i == w->SelectedIndex ? col_selected : col_inactive;
|
||||||
struct Size2D size = w->Tabs[i].TitleSize;
|
Size2D size = w->Tabs[i].TitleSize;
|
||||||
|
|
||||||
Drawer2D_Clear(bmp, col, x, 0, size.Width, size.Height);
|
Drawer2D_Clear(bmp, col, x, 0, size.Width, size.Height);
|
||||||
Drawer2D_DrawText(&args, x + SPECIAL_TITLE_SPACING / 2, 0);
|
Drawer2D_DrawText(&args, x + SPECIAL_TITLE_SPACING / 2, 0);
|
||||||
@ -2673,7 +2676,7 @@ static void SpecialInputWidget_DrawTitles(struct SpecialInputWidget* w, struct B
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct Size2D SpecialInputWidget_CalculateContentSize(struct SpecialInputTab* tab, struct Size2D* sizes, struct Size2D* elemSize) {
|
static Size2D SpecialInputWidget_CalculateContentSize(struct SpecialInputTab* tab, Size2D* sizes, Size2D* elemSize) {
|
||||||
*elemSize = Size2D_Empty;
|
*elemSize = Size2D_Empty;
|
||||||
Int32 i;
|
Int32 i;
|
||||||
for (i = 0; i < tab->Contents.length; i += tab->CharsPerItem) {
|
for (i = 0; i < tab->Contents.length; i += tab->CharsPerItem) {
|
||||||
@ -2683,10 +2686,10 @@ static struct Size2D SpecialInputWidget_CalculateContentSize(struct SpecialInput
|
|||||||
elemSize->Width += SPECIAL_CONTENT_SPACING;
|
elemSize->Width += SPECIAL_CONTENT_SPACING;
|
||||||
elemSize->Height = sizes[0].Height + SPECIAL_CONTENT_SPACING;
|
elemSize->Height = sizes[0].Height + SPECIAL_CONTENT_SPACING;
|
||||||
Int32 rows = Math_CeilDiv(tab->Contents.length / tab->CharsPerItem, tab->ItemsPerRow);
|
Int32 rows = Math_CeilDiv(tab->Contents.length / tab->CharsPerItem, tab->ItemsPerRow);
|
||||||
return Size2D_Make(elemSize->Width * tab->ItemsPerRow, elemSize->Height * rows);
|
Size2D s = { elemSize->Width * tab->ItemsPerRow, elemSize->Height * rows }; return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SpecialInputWidget_MeasureContentSizes(struct SpecialInputWidget* w, struct SpecialInputTab* tab, struct Size2D* sizes) {
|
static void SpecialInputWidget_MeasureContentSizes(struct SpecialInputWidget* w, struct SpecialInputTab* tab, Size2D* sizes) {
|
||||||
char buffer[STRING_SIZE];
|
char buffer[STRING_SIZE];
|
||||||
String s = String_FromArray(buffer);
|
String s = String_FromArray(buffer);
|
||||||
s.length = tab->CharsPerItem;
|
s.length = tab->CharsPerItem;
|
||||||
@ -2721,15 +2724,16 @@ static void SpecialInputWidget_DrawContent(struct SpecialInputWidget* w, struct
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void SpecialInputWidget_Make(struct SpecialInputWidget* w, struct SpecialInputTab* tab) {
|
static void SpecialInputWidget_Make(struct SpecialInputWidget* w, struct SpecialInputTab* tab) {
|
||||||
struct Size2D sizes[DRAWER2D_MAX_COLS];
|
Size2D sizes[DRAWER2D_MAX_COLS];
|
||||||
SpecialInputWidget_MeasureContentSizes(w, tab, sizes);
|
SpecialInputWidget_MeasureContentSizes(w, tab, sizes);
|
||||||
struct Size2D bodySize = SpecialInputWidget_CalculateContentSize(tab, sizes, &w->ElementSize);
|
Size2D bodySize = SpecialInputWidget_CalculateContentSize(tab, sizes, &w->ElementSize);
|
||||||
Int32 titleWidth = SpecialInputWidget_MeasureTitles(w);
|
|
||||||
|
Int32 titleWidth = SpecialInputWidget_MeasureTitles(w);
|
||||||
Int32 titleHeight = w->Tabs[0].TitleSize.Height;
|
Int32 titleHeight = w->Tabs[0].TitleSize.Height;
|
||||||
struct Size2D size = Size2D_Make(max(bodySize.Width, titleWidth), bodySize.Height + titleHeight);
|
Size2D size = { max(bodySize.Width, titleWidth), bodySize.Height + titleHeight };
|
||||||
Gfx_DeleteTexture(&w->Tex.ID);
|
Gfx_DeleteTexture(&w->Tex.ID);
|
||||||
|
|
||||||
struct Bitmap bmp; Bitmap_AllocateClearedPow2(&bmp, size.Width, size.Height);
|
Bitmap bmp; Bitmap_AllocateClearedPow2(&bmp, size.Width, size.Height);
|
||||||
Drawer2D_Begin(&bmp);
|
Drawer2D_Begin(&bmp);
|
||||||
{
|
{
|
||||||
SpecialInputWidget_DrawTitles(w, &bmp);
|
SpecialInputWidget_DrawTitles(w, &bmp);
|
||||||
@ -2798,7 +2802,7 @@ struct WidgetVTABLE SpecialInputWidget_VTABLE = {
|
|||||||
SpecialInputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll,
|
SpecialInputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll,
|
||||||
Widget_CalcPosition,
|
Widget_CalcPosition,
|
||||||
};
|
};
|
||||||
void SpecialInputWidget_Create(struct SpecialInputWidget* w, struct FontDesc* font, struct InputWidget* appendObj) {
|
void SpecialInputWidget_Create(struct SpecialInputWidget* w, FontDesc* font, struct InputWidget* appendObj) {
|
||||||
Widget_Reset(w);
|
Widget_Reset(w);
|
||||||
w->VTABLE = &SpecialInputWidget_VTABLE;
|
w->VTABLE = &SpecialInputWidget_VTABLE;
|
||||||
w->VerAnchor = ANCHOR_MAX;
|
w->VerAnchor = ANCHOR_MAX;
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
#include "BlockID.h"
|
#include "BlockID.h"
|
||||||
#include "Constants.h"
|
#include "Constants.h"
|
||||||
#include "Entity.h"
|
#include "Entity.h"
|
||||||
#include "2DStructs.h"
|
|
||||||
/* Contains all 2D widget implementations.
|
/* Contains all 2D widget implementations.
|
||||||
Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
|
Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
|
||||||
*/
|
*/
|
||||||
@ -17,8 +16,8 @@ struct TextWidget {
|
|||||||
PackedCol Col;
|
PackedCol Col;
|
||||||
};
|
};
|
||||||
NOINLINE_ void TextWidget_Make(struct TextWidget* w);
|
NOINLINE_ void TextWidget_Make(struct TextWidget* w);
|
||||||
NOINLINE_ void TextWidget_Create(struct TextWidget* w, STRING_PURE String* text, struct FontDesc* font);
|
NOINLINE_ void TextWidget_Create(struct TextWidget* w, STRING_PURE String* text, FontDesc* font);
|
||||||
NOINLINE_ void TextWidget_Set(struct TextWidget* w, STRING_PURE String* text, struct FontDesc* font);
|
NOINLINE_ void TextWidget_Set(struct TextWidget* w, STRING_PURE String* text, FontDesc* font);
|
||||||
|
|
||||||
|
|
||||||
typedef void (*Button_Get)(STRING_TRANSIENT String* raw);
|
typedef void (*Button_Get)(STRING_TRANSIENT String* raw);
|
||||||
@ -32,8 +31,8 @@ struct ButtonWidget {
|
|||||||
Button_Get GetValue;
|
Button_Get GetValue;
|
||||||
Button_Set SetValue;
|
Button_Set SetValue;
|
||||||
};
|
};
|
||||||
NOINLINE_ void ButtonWidget_Create(struct ButtonWidget* w, Int32 minWidth, STRING_PURE String* text, struct FontDesc* font, Widget_LeftClick onClick);
|
NOINLINE_ void ButtonWidget_Create(struct ButtonWidget* w, Int32 minWidth, STRING_PURE String* text, FontDesc* font, Widget_LeftClick onClick);
|
||||||
NOINLINE_ void ButtonWidget_Set(struct ButtonWidget* w, STRING_PURE String* text, struct FontDesc* font);
|
NOINLINE_ void ButtonWidget_Set(struct ButtonWidget* w, STRING_PURE String* text, FontDesc* font);
|
||||||
|
|
||||||
|
|
||||||
struct ScrollbarWidget {
|
struct ScrollbarWidget {
|
||||||
@ -61,7 +60,7 @@ struct TableWidget {
|
|||||||
Widget_Layout
|
Widget_Layout
|
||||||
Int32 ElementsCount, ElementsPerRow, RowsCount;
|
Int32 ElementsCount, ElementsPerRow, RowsCount;
|
||||||
Int32 LastCreatedIndex;
|
Int32 LastCreatedIndex;
|
||||||
struct FontDesc Font;
|
FontDesc Font;
|
||||||
Int32 SelectedIndex, BlockSize;
|
Int32 SelectedIndex, BlockSize;
|
||||||
Real32 SelBlockExpand;
|
Real32 SelBlockExpand;
|
||||||
GfxResourceID VB;
|
GfxResourceID VB;
|
||||||
@ -83,7 +82,7 @@ NOINLINE_ void TableWidget_MakeDescTex(struct TableWidget* w, BlockID block);
|
|||||||
#define INPUTWIDGET_LEN STRING_SIZE
|
#define INPUTWIDGET_LEN STRING_SIZE
|
||||||
struct InputWidget {
|
struct InputWidget {
|
||||||
Widget_Layout
|
Widget_Layout
|
||||||
struct FontDesc Font;
|
FontDesc Font;
|
||||||
Int32 (*GetMaxLines)(void);
|
Int32 (*GetMaxLines)(void);
|
||||||
void (*RemakeTexture)(void* elem); /* Remakes the raw texture containing all the chat lines. Also updates dimensions. */
|
void (*RemakeTexture)(void* elem); /* Remakes the raw texture containing all the chat lines. Also updates dimensions. */
|
||||||
void (*OnPressedEnter)(void* elem); /* Invoked when the user presses enter. */
|
void (*OnPressedEnter)(void* elem); /* Invoked when the user presses enter. */
|
||||||
@ -91,7 +90,7 @@ struct InputWidget {
|
|||||||
|
|
||||||
String Text;
|
String Text;
|
||||||
String Lines[INPUTWIDGET_MAX_LINES]; /* raw text of each line */
|
String Lines[INPUTWIDGET_MAX_LINES]; /* raw text of each line */
|
||||||
struct Size2D LineSizes[INPUTWIDGET_MAX_LINES]; /* size of each line in pixels */
|
Size2D LineSizes[INPUTWIDGET_MAX_LINES]; /* size of each line in pixels */
|
||||||
struct Texture InputTex;
|
struct Texture InputTex;
|
||||||
String Prefix;
|
String Prefix;
|
||||||
UInt16 PrefixWidth, PrefixHeight;
|
UInt16 PrefixWidth, PrefixHeight;
|
||||||
@ -143,7 +142,7 @@ struct MenuInputWidget {
|
|||||||
struct MenuInputValidator Validator;
|
struct MenuInputValidator Validator;
|
||||||
char __TextBuffer[INPUTWIDGET_LEN];
|
char __TextBuffer[INPUTWIDGET_LEN];
|
||||||
};
|
};
|
||||||
NOINLINE_ void MenuInputWidget_Create(struct MenuInputWidget* w, Int32 width, Int32 height, STRING_PURE String* text, struct FontDesc* font, struct MenuInputValidator* v);
|
NOINLINE_ void MenuInputWidget_Create(struct MenuInputWidget* w, Int32 width, Int32 height, STRING_PURE String* text, FontDesc* font, struct MenuInputValidator* v);
|
||||||
|
|
||||||
|
|
||||||
struct ChatInputWidget {
|
struct ChatInputWidget {
|
||||||
@ -154,7 +153,7 @@ struct ChatInputWidget {
|
|||||||
String OrigStr;
|
String OrigStr;
|
||||||
};
|
};
|
||||||
|
|
||||||
NOINLINE_ void ChatInputWidget_Create(struct ChatInputWidget* w, struct FontDesc* font);
|
NOINLINE_ void ChatInputWidget_Create(struct ChatInputWidget* w, FontDesc* font);
|
||||||
|
|
||||||
|
|
||||||
#define TEXTGROUPWIDGET_MAX_LINES 30
|
#define TEXTGROUPWIDGET_MAX_LINES 30
|
||||||
@ -162,14 +161,14 @@ NOINLINE_ void ChatInputWidget_Create(struct ChatInputWidget* w, struct FontDesc
|
|||||||
struct TextGroupWidget {
|
struct TextGroupWidget {
|
||||||
Widget_Layout
|
Widget_Layout
|
||||||
Int32 LinesCount, DefaultHeight;
|
Int32 LinesCount, DefaultHeight;
|
||||||
struct FontDesc Font, UnderlineFont;
|
FontDesc Font, UnderlineFont;
|
||||||
bool PlaceholderHeight[TEXTGROUPWIDGET_MAX_LINES];
|
bool PlaceholderHeight[TEXTGROUPWIDGET_MAX_LINES];
|
||||||
UInt8 LineLengths[TEXTGROUPWIDGET_MAX_LINES];
|
UInt8 LineLengths[TEXTGROUPWIDGET_MAX_LINES];
|
||||||
struct Texture* Textures;
|
struct Texture* Textures;
|
||||||
char* Buffer;
|
char* Buffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
NOINLINE_ void TextGroupWidget_Create(struct TextGroupWidget* w, Int32 linesCount, struct FontDesc* font, struct FontDesc* underlineFont, STRING_REF struct Texture* textures, STRING_REF char* buffer);
|
NOINLINE_ void TextGroupWidget_Create(struct TextGroupWidget* w, Int32 linesCount, FontDesc* font, FontDesc* underlineFont, STRING_REF struct Texture* textures, STRING_REF char* buffer);
|
||||||
NOINLINE_ void TextGroupWidget_SetUsePlaceHolder(struct TextGroupWidget* w, Int32 index, bool placeHolder);
|
NOINLINE_ void TextGroupWidget_SetUsePlaceHolder(struct TextGroupWidget* w, Int32 index, bool placeHolder);
|
||||||
NOINLINE_ void TextGroupWidget_PushUpAndReplaceLast(struct TextGroupWidget* w, STRING_PURE String* text);
|
NOINLINE_ void TextGroupWidget_PushUpAndReplaceLast(struct TextGroupWidget* w, STRING_PURE String* text);
|
||||||
NOINLINE_ Int32 TextGroupWidget_UsedHeight(struct TextGroupWidget* w);
|
NOINLINE_ Int32 TextGroupWidget_UsedHeight(struct TextGroupWidget* w);
|
||||||
@ -180,7 +179,7 @@ NOINLINE_ void TextGroupWidget_SetText(struct TextGroupWidget* w, Int32 index, S
|
|||||||
|
|
||||||
struct PlayerListWidget {
|
struct PlayerListWidget {
|
||||||
Widget_Layout
|
Widget_Layout
|
||||||
struct FontDesc Font;
|
FontDesc Font;
|
||||||
UInt16 NamesCount, ElementOffset;
|
UInt16 NamesCount, ElementOffset;
|
||||||
Int32 XMin, XMax, YHeight;
|
Int32 XMin, XMax, YHeight;
|
||||||
bool Classic;
|
bool Classic;
|
||||||
@ -188,30 +187,30 @@ struct PlayerListWidget {
|
|||||||
UInt16 IDs[TABLIST_MAX_NAMES * 2];
|
UInt16 IDs[TABLIST_MAX_NAMES * 2];
|
||||||
struct Texture Textures[TABLIST_MAX_NAMES * 2];
|
struct Texture Textures[TABLIST_MAX_NAMES * 2];
|
||||||
};
|
};
|
||||||
NOINLINE_ void PlayerListWidget_Create(struct PlayerListWidget* w, struct FontDesc* font, bool classic);
|
NOINLINE_ void PlayerListWidget_Create(struct PlayerListWidget* w, FontDesc* font, bool classic);
|
||||||
NOINLINE_ void PlayerListWidget_GetNameUnder(struct PlayerListWidget* w, Int32 mouseX, Int32 mouseY, STRING_TRANSIENT String* name);
|
NOINLINE_ void PlayerListWidget_GetNameUnder(struct PlayerListWidget* w, Int32 mouseX, Int32 mouseY, STRING_TRANSIENT String* name);
|
||||||
|
|
||||||
|
|
||||||
typedef void (*SpecialInputAppendFunc)(void* userData, char c);
|
typedef void (*SpecialInputAppendFunc)(void* userData, char c);
|
||||||
struct SpecialInputTab {
|
struct SpecialInputTab {
|
||||||
Int32 ItemsPerRow, CharsPerItem;
|
Int32 ItemsPerRow, CharsPerItem;
|
||||||
struct Size2D TitleSize;
|
Size2D TitleSize;
|
||||||
String Title, Contents;
|
String Title, Contents;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SpecialInputWidget {
|
struct SpecialInputWidget {
|
||||||
Widget_Layout
|
Widget_Layout
|
||||||
struct Size2D ElementSize;
|
Size2D ElementSize;
|
||||||
Int32 SelectedIndex;
|
Int32 SelectedIndex;
|
||||||
struct InputWidget* AppendObj;
|
struct InputWidget* AppendObj;
|
||||||
struct Texture Tex;
|
struct Texture Tex;
|
||||||
struct FontDesc Font;
|
FontDesc Font;
|
||||||
struct SpecialInputTab Tabs[5];
|
struct SpecialInputTab Tabs[5];
|
||||||
String ColString;
|
String ColString;
|
||||||
char __ColBuffer[DRAWER2D_MAX_COLS * 4];
|
char __ColBuffer[DRAWER2D_MAX_COLS * 4];
|
||||||
};
|
};
|
||||||
|
|
||||||
NOINLINE_ void SpecialInputWidget_Create(struct SpecialInputWidget* w, struct FontDesc* font, struct InputWidget* appendObj);
|
NOINLINE_ void SpecialInputWidget_Create(struct SpecialInputWidget* w, FontDesc* font, struct InputWidget* appendObj);
|
||||||
NOINLINE_ void SpecialInputWidget_UpdateCols(struct SpecialInputWidget* w);
|
NOINLINE_ void SpecialInputWidget_UpdateCols(struct SpecialInputWidget* w);
|
||||||
NOINLINE_ void SpecialInputWidget_SetActive(struct SpecialInputWidget* w, bool active);
|
NOINLINE_ void SpecialInputWidget_SetActive(struct SpecialInputWidget* w, bool active);
|
||||||
#endif
|
#endif
|
||||||
|
@ -25,12 +25,12 @@ HDC win_DC;
|
|||||||
UInt8 win_State = WINDOW_STATE_NORMAL;
|
UInt8 win_State = WINDOW_STATE_NORMAL;
|
||||||
bool invisible_since_creation; /* Set by WindowsMessage.CREATE and consumed by Visible = true (calls BringWindowToFront) */
|
bool invisible_since_creation; /* Set by WindowsMessage.CREATE and consumed by Visible = true (calls BringWindowToFront) */
|
||||||
Int32 suppress_resize; /* Used in WindowBorder and WindowState in order to avoid rapid, consecutive resize events */
|
Int32 suppress_resize; /* Used in WindowBorder and WindowState in order to avoid rapid, consecutive resize events */
|
||||||
struct Rectangle2D previous_bounds; /* Used to restore previous size when leaving fullscreen mode */
|
Rect2D prev_bounds; /* Used to restore previous size when leaving fullscreen mode */
|
||||||
|
|
||||||
static struct Rectangle2D Window_FromRect(RECT rect) {
|
static Rect2D Window_FromRect(RECT rect) {
|
||||||
struct Rectangle2D r;
|
Rect2D r;
|
||||||
r.X = rect.left; r.Y = rect.top;
|
r.X = rect.left; r.Y = rect.top;
|
||||||
r.Width = RECT_WIDTH(rect);
|
r.Width = RECT_WIDTH(rect);
|
||||||
r.Height = RECT_HEIGHT(rect);
|
r.Height = RECT_HEIGHT(rect);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
@ -395,8 +395,7 @@ void Window_Create(Int32 x, Int32 y, Int32 width, Int32 height, STRING_PURE Stri
|
|||||||
/* TODO: UngroupFromTaskbar(); */
|
/* TODO: UngroupFromTaskbar(); */
|
||||||
|
|
||||||
/* Find out the final window rectangle, after the WM has added its chrome (titlebar, sidebars etc). */
|
/* Find out the final window rectangle, after the WM has added its chrome (titlebar, sidebars etc). */
|
||||||
RECT rect; rect.left = x; rect.top = y;
|
RECT rect = { x, y, x + width, y + height };
|
||||||
rect.right = x + width; rect.bottom = y + height;
|
|
||||||
AdjustWindowRect(&rect, win_Style, false);
|
AdjustWindowRect(&rect, win_Style, false);
|
||||||
|
|
||||||
WNDCLASSEXW wc = { 0 };
|
WNDCLASSEXW wc = { 0 };
|
||||||
@ -494,27 +493,25 @@ void Window_SetClipboardText(STRING_PURE String* value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Window_SetBounds(struct Rectangle2D rect) {
|
void Window_SetBounds(Rect2D rect) {
|
||||||
/* Note: the bounds variable is updated when the resize/move message arrives.*/
|
/* Note: the bounds variable is updated when the resize/move message arrives.*/
|
||||||
SetWindowPos(win_Handle, NULL, rect.X, rect.Y, rect.Width, rect.Height, 0);
|
SetWindowPos(win_Handle, NULL, rect.X, rect.Y, rect.Width, rect.Height, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window_SetLocation(struct Point2D point) {
|
void Window_SetLocation(Int32 x, Int32 y) {
|
||||||
SetWindowPos(win_Handle, NULL, point.X, point.Y, 0, 0, SWP_NOSIZE);
|
SetWindowPos(win_Handle, NULL, x, y, 0, 0, SWP_NOSIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window_SetSize(struct Size2D size) {
|
void Window_SetSize(Int32 width, Int32 height) {
|
||||||
SetWindowPos(win_Handle, NULL, 0, 0, size.Width, size.Height, SWP_NOMOVE);
|
SetWindowPos(win_Handle, NULL, 0, 0, width, height, SWP_NOMOVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window_SetClientSize(struct Size2D size) {
|
void Window_SetClientSize(Int32 width, Int32 height) {
|
||||||
DWORD style = GetWindowLongW(win_Handle, GWL_STYLE);
|
DWORD style = GetWindowLongW(win_Handle, GWL_STYLE);
|
||||||
RECT rect; rect.left = 0; rect.top = 0;
|
RECT rect = { 0, 0, width, height };
|
||||||
rect.right = size.Width; rect.bottom = size.Height;
|
|
||||||
|
|
||||||
AdjustWindowRect(&rect, style, false);
|
AdjustWindowRect(&rect, style, false);
|
||||||
struct Size2D adjSize = { RECT_WIDTH(rect), RECT_HEIGHT(rect) };
|
Window_SetSize(RECT_WIDTH(rect), RECT_HEIGHT(rect));
|
||||||
Window_SetSize(adjSize);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void* Window_GetWindowHandle(void) { return win_Handle; }
|
void* Window_GetWindowHandle(void) { return win_Handle; }
|
||||||
@ -570,7 +567,7 @@ void Window_SetWindowState(UInt8 state) {
|
|||||||
|
|
||||||
/* Reset state to avoid strange side-effects from maximized/minimized windows. */
|
/* Reset state to avoid strange side-effects from maximized/minimized windows. */
|
||||||
Window_ResetWindowState();
|
Window_ResetWindowState();
|
||||||
previous_bounds = Window_Bounds;
|
prev_bounds = Window_Bounds;
|
||||||
Window_SetHiddenBorder(true);
|
Window_SetHiddenBorder(true);
|
||||||
|
|
||||||
command = SW_MAXIMIZE;
|
command = SW_MAXIMIZE;
|
||||||
@ -584,20 +581,22 @@ void Window_SetWindowState(UInt8 state) {
|
|||||||
if (exiting_fullscreen) Window_SetHiddenBorder(false);
|
if (exiting_fullscreen) Window_SetHiddenBorder(false);
|
||||||
|
|
||||||
/* Restore previous window size/location if necessary */
|
/* Restore previous window size/location if necessary */
|
||||||
if (command == SW_RESTORE && !Rectangle2D_Equals(previous_bounds, Rectangle2D_Empty)) {
|
if (command == SW_RESTORE && (prev_bounds.Width || prev_bounds.Height)) {
|
||||||
Window_SetBounds(previous_bounds);
|
Window_SetBounds(prev_bounds);
|
||||||
previous_bounds = Rectangle2D_Empty;
|
prev_bounds.Width = 0; prev_bounds.Height = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Point2D Window_PointToClient(struct Point2D point) {
|
Point2D Window_PointToClient(Int32 x, Int32 y) {
|
||||||
|
Point2D point = { x, y };
|
||||||
if (!ScreenToClient(win_Handle, &point)) {
|
if (!ScreenToClient(win_Handle, &point)) {
|
||||||
ErrorHandler_FailWithCode(GetLastError(), "Converting point from client to screen coordinates");
|
ErrorHandler_FailWithCode(GetLastError(), "Converting point from client to screen coordinates");
|
||||||
}
|
}
|
||||||
return point;
|
return point;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Point2D Window_PointToScreen(struct Point2D point) {
|
Point2D Window_PointToScreen(Int32 x, Int32 y) {
|
||||||
|
Point2D point = { x, y };
|
||||||
if (!ClientToScreen(win_Handle, &point)) {
|
if (!ClientToScreen(win_Handle, &point)) {
|
||||||
ErrorHandler_FailWithCode(GetLastError(), "Converting point from screen to client coordinates");
|
ErrorHandler_FailWithCode(GetLastError(), "Converting point from screen to client coordinates");
|
||||||
}
|
}
|
||||||
@ -617,12 +616,12 @@ void Window_ProcessEvents(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Point2D Window_GetDesktopCursorPos(void) {
|
Point2D Window_GetDesktopCursorPos(void) {
|
||||||
POINT p; GetCursorPos(&p);
|
POINT point; GetCursorPos(&point);
|
||||||
return Point2D_Make(p.x, p.y);
|
Point2D p = { point.x, point.y }; return p;
|
||||||
}
|
}
|
||||||
void Window_SetDesktopCursorPos(struct Point2D point) {
|
void Window_SetDesktopCursorPos(Int32 x, Int32 y) {
|
||||||
SetCursorPos(point.X, point.Y);
|
SetCursorPos(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool win_cursorVisible = true;
|
bool win_cursorVisible = true;
|
||||||
|
22
src/Window.h
22
src/Window.h
@ -1,8 +1,6 @@
|
|||||||
#ifndef CC_WINDOW_H
|
#ifndef CC_WINDOW_H
|
||||||
#define CC_WINDOW_H
|
#define CC_WINDOW_H
|
||||||
#include "String.h"
|
#include "String.h"
|
||||||
#include "Bitmap.h"
|
|
||||||
#include "2DStructs.h"
|
|
||||||
#include "DisplayDevice.h"
|
#include "DisplayDevice.h"
|
||||||
/* Abstracts creating and managing a native window.
|
/* Abstracts creating and managing a native window.
|
||||||
Copyright 2017 ClassicalSharp | Licensed under BSD-3 | Based on OpenTK code
|
Copyright 2017 ClassicalSharp | Licensed under BSD-3 | Based on OpenTK code
|
||||||
@ -51,23 +49,23 @@ void* Window_GetWindowHandle(void);
|
|||||||
UInt8 Window_GetWindowState(void);
|
UInt8 Window_GetWindowState(void);
|
||||||
void Window_SetWindowState(UInt8 value);
|
void Window_SetWindowState(UInt8 value);
|
||||||
|
|
||||||
struct Rectangle2D Window_Bounds;
|
Rect2D Window_Bounds;
|
||||||
struct Size2D Window_ClientSize;
|
Size2D Window_ClientSize;
|
||||||
|
|
||||||
void Window_SetBounds(struct Rectangle2D rect);
|
void Window_SetBounds(Rect2D rect);
|
||||||
void Window_SetLocation(struct Point2D point);
|
void Window_SetLocation(Int32 x, Int32 y);
|
||||||
void Window_SetSize(struct Size2D size);
|
void Window_SetSize(Int32 width, Int32 height);
|
||||||
void Window_SetClientSize(struct Size2D size);
|
void Window_SetClientSize(Int32 width, Int32 height);
|
||||||
|
|
||||||
void Window_Close(void);
|
void Window_Close(void);
|
||||||
void Window_ProcessEvents(void);
|
void Window_ProcessEvents(void);
|
||||||
/* Transforms the specified point from screen to client coordinates. */
|
/* Transforms the specified point from screen to client coordinates. */
|
||||||
struct Point2D Window_PointToClient(struct Point2D point);
|
Point2D Window_PointToClient(Int32 x, Int32 y);
|
||||||
/* Transforms the specified point from client to screen coordinates. */
|
/* Transforms the specified point from client to screen coordinates. */
|
||||||
struct Point2D Window_PointToScreen(struct Point2D point);
|
Point2D Window_PointToScreen(Int32 x, Int32 y);
|
||||||
|
|
||||||
struct Point2D Window_GetDesktopCursorPos(void);
|
Point2D Window_GetDesktopCursorPos(void);
|
||||||
void Window_SetDesktopCursorPos(struct Point2D point);
|
void Window_SetDesktopCursorPos(Int32 x, Int32 y);
|
||||||
bool Window_GetCursorVisible(void);
|
bool Window_GetCursorVisible(void);
|
||||||
void Window_SetCursorVisible(bool visible);
|
void Window_SetCursorVisible(bool visible);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user