1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48:20 +02:00
Beef/BeefySysLib/BeefySysLib.cpp
Brian Fiete b63a243fd7 Working on installer, fixing more Win32 issues
Throwing error on member references with ".." cascade token outside invocations (ie: "ts..mA = 123")
Fixed 'Thread.ModuleTLSIndex' error - which caused us TLS lookup failures in Beef DLLs
Fixed some hotswap errors
Made BeefPerf shut down properly
Fixed an 'int literal' FixIntUnknown issue where rhs was System.Object which caused an illegal boxing
Fixed COFF::LocateSymbol issues with Win32 and also with linking to static libraries - showed up with hot-linking in fmod when hot-adding a floating point mod
Fixed a couple memory leaks
Fixed alignment issue in COFF::ParseCompileUnit
2019-09-02 17:39:47 -07:00

731 lines
No EOL
22 KiB
C++

#include "Common.h"
#include "PlatformApp.h"
#include "gfx/RenderDevice.h"
#include "gfx/Texture.h"
#include "gfx/Shader.h"
#include "gfx/DrawLayer.h"
#include "gfx/RenderCmd.h"
#include "gfx/FTFont.h"
#include "img/BFIData.h"
#include "util/Vector.h"
#include "util/PerfTimer.h"
#include "util/AllocDebug.h"
//#include "third_party/freetype/include/ft2build.h"
//#include FT_FREETYPE_H
//#include "img/PNGData.h"
#define UTF16DECODE_PTR(strPtr) ((strPtr) == NULL ? NULL : UTF16Decode(strPtr).c_str())
USING_NS_BF;
#pragma warning(disable:4996)
static UTF16String gTempUTF16String;
int gPixelsDrawn = 0;
#ifdef BF_PLATFORM_WINDOWS
static int gLastReqId = 0;
static int BfAllocHook(int nAllocType, void *pvData,
size_t nSize, int nBlockUse, long lRequest,
const unsigned char * szFileName, int nLine)
{
if (gLastReqId == lRequest)
return TRUE;
gLastReqId = lRequest;
if (szFileName == NULL)
return TRUE;
/*char str[1024];
sprintf(str, "Alloc: %d File: %s Line: %d\n", lRequest, szFileName, nLine);
OutputDebugStringA(str);*/
return TRUE;
}
HINSTANCE gDLLInstance = NULL;
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
//::MessageBoxA(NULL, "C", "D", MB_OK);
#ifdef BF_VC
//_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF );
//_CrtSetBreakAlloc(1437);
//_CrtSetAllocHook(BfAllocHook);
#endif
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
gDLLInstance = hinstDLL;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
#endif
BF_EXPORT void BF_CALLTYPE BFApp_GetDesktopResolution(int& width, int& height)
{
gBFApp->GetDesktopResolution(width, height);
}
BF_EXPORT void BF_CALLTYPE BFApp_GetWorkspaceRect(int& x, int& y, int& width, int& height)
{
gBFApp->GetWorkspaceRect(x, y, width, height);
}
BF_EXPORT void BF_CALLTYPE BFApp_Create()
{
new PlatformBFApp();
}
BF_EXPORT void BF_CALLTYPE BFApp_Delete()
{
delete gBFApp;
gBFApp = NULL;
gTempUTF16String.Dispose();
FTFontManager::ClearCache();
//OutputDebugStrF("Deleting App\n");
#ifdef BF_VC
//_CrtDumpMemoryLeaks();
#endif
}
//void FT_Test()
//{
// FT_Library library; /* handle to library */
// FT_Face face; /* handle to face object */
//
// auto error = FT_Init_FreeType(&library);
// error = FT_New_Face(library, "/temp/SourceCodePro-Regular.ttf", 0, &face);
// if (error == FT_Err_Unknown_File_Format)
// {
//
// }
// else if (error)
// {
//
// }
//
// error = FT_Set_Char_Size(
// face, /* handle to face object */
// 0, /* char_width in 1/64th of points */
// 9 * 64, /* char_height in 1/64th of points */
// 96, /* horizontal device resolution */
// 96); /* vertical device resolution */
//
// String str = ".cHasDebugFlags";
//
// PNGData image;
// image.CreateNew(256, 256);
// for (int i = 0; i < 256 * 256; i++)
// image.mBits[i] = 0xFF000000;
//
// int curX = 0;
// int curY = 0;
//
// for (int i = 0; i < (int)str.length(); i++)
// {
// int glyph_index = FT_Get_Char_Index(face, str[i]);
//
// error = FT_Load_Glyph(
// face, /* handle to face object */
// glyph_index, /* glyph index */
// FT_LOAD_NO_BITMAP); /* load flags, see below */
//
// error = FT_Render_Glyph(face->glyph, /* glyph slot */
// FT_RENDER_MODE_NORMAL); /* render mode */
//
// auto& bitmap = face->glyph->bitmap;
// for (int y = 0; y < (int)bitmap.rows; y++)
// {
// for (int x = 0; x < (int)bitmap.width; x++)
// {
// uint8 val = bitmap.buffer[y * bitmap.pitch + x];
//
// val = (uint8)(pow(val / 255.0f, 0.5556) * 255.0f);
//
// image.mBits[(y + 12 - bitmap.rows) * image.mWidth + x + curX] = 0xFF000000 |
// ((int32)val) | ((int32)val << 8) | ((int32)val << 16);
// }
// }
//
// curX += bitmap.width + 1;
//
// //int w = face->glyph->bitmap.;
//
// //face->glyph->bitmap.buffer
// }
// image.WriteToFile("/temp/fnt.png");
//}
BF_EXPORT void BF_CALLTYPE BFApp_Init()
{
//////////////////////////////////////////////////////////////////////////
//FT_Test();
//////////////////////////////////////////////////////////////////////////
gBFApp->Init();
}
BF_EXPORT void BF_CALLTYPE BFApp_Run()
{
gBFApp->Run();
}
BF_EXPORT void BF_CALLTYPE BFApp_Shutdown()
{
gBFApp->Shutdown();
}
BF_EXPORT void BF_CALLTYPE BFApp_SetDrawEnabled(int enabled)
{
gBFApp->mDrawEnabled = enabled != 0;
}
BF_EXPORT void BF_CALLTYPE BFApp_SetRefreshRate(int rate)
{
gBFApp->mRefreshRate = (float) rate;
}
BF_EXPORT const char* BF_CALLTYPE BFApp_GetInstallDir()
{
return gBFApp->mInstallDir.c_str();
}
BF_EXPORT const char* BF_CALLTYPE BFApp_GetDataDir()
{
return gBFApp->mDataDir.c_str();
}
BF_EXPORT void BF_CALLTYPE BFApp_SetCallbacks(BFApp_UpdateFunc updateFunc, BFApp_DrawFunc drawFunc)
{
gBFApp->mUpdateFunc = updateFunc;
gBFApp->mDrawFunc = drawFunc;
//public delegate void UpdateProc();
}
BF_EXPORT BFWindow* BF_CALLTYPE BFApp_CreateWindow(BFWindow* parent, const char* title, int x, int y, int width, int height, int windowFlags)
{
return gBFApp->CreateNewWindow(parent, title, x, y, width, height, windowFlags);
}
BF_EXPORT void BF_CALLTYPE BFApp_RemoveWindow(BFWindow* window)
{
delete window;
}
BF_EXPORT void BF_CALLTYPE BFApp_SetCursor(int cursor)
{
gBFApp->SetCursor(cursor);
}
BF_EXPORT void* BF_CALLTYPE BFApp_GetClipboardData(const char* format, int* size)
{
return gBFApp->GetClipboardData(format, size);
}
BF_EXPORT void BF_CALLTYPE BFApp_ReleaseClipboardData(void* ptr)
{
return gBFApp->ReleaseClipboardData(ptr);
}
BF_EXPORT void BF_CALLTYPE BFApp_SetClipboardData(const char* format, void* ptr, int size, int resetClipboard)
{
return gBFApp->SetClipboardData(format, ptr, size, resetClipboard != 0);
}
BF_EXPORT void BF_CALLTYPE BFApp_CheckMemory()
{
#ifdef BF_PLATFORM_WINDOWS
_CrtCheckMemory();
#endif
}
BF_EXPORT void BF_CALLTYPE BFApp_RehupMouse()
{
}
BF_EXPORT BFSoundManager* BF_CALLTYPE BFApp_GetSoundManager()
{
return gBFApp->GetSoundManager();
}
///
BF_EXPORT void BF_CALLTYPE BFWindow_SetCallbacks(BFWindow* window, BFWindow_MovedFunc movedFunc, BFWindow_CloseQueryFunc closeQueryFunc, BFWindow_ClosedFunc closedFunc,
BFWindow_GotFocusFunc gotFocusFunc, BFWindow_LostFocusFunc lostFocusFunc,
BFWindow_KeyCharFunc keyCharFunc, BFWindow_KeyDownFunc keyDownFunc, BFWindow_KeyUpFunc keyUpFunc, BFWindow_HitTestFunc hitTestFunc,
BFWindow_MouseMove mouseMoveFunc, BFWindow_MouseProxyMove mouseProxyMoveFunc,
BFWindow_MouseDown mouseDownFunc, BFWindow_MouseUp mouseUpFunc, BFWindow_MouseWheel mouseWheelFunc, BFWindow_MouseLeave mouseLeaveFunc,
BFWindow_MenuItemSelectedFunc menuItemSelectedFunc)
{
window->mMovedFunc = movedFunc;
window->mCloseQueryFunc = closeQueryFunc;
window->mClosedFunc = closedFunc;
window->mGotFocusFunc = gotFocusFunc;
window->mLostFocusFunc = lostFocusFunc;
window->mKeyCharFunc = keyCharFunc;
window->mKeyDownFunc = keyDownFunc;
window->mKeyUpFunc = keyUpFunc;
window->mHitTestFunc = hitTestFunc;
window->mMouseMoveFunc = mouseMoveFunc;
window->mMouseProxyMoveFunc = mouseProxyMoveFunc;
window->mMouseDownFunc = mouseDownFunc;
window->mMouseUpFunc = mouseUpFunc;
window->mMouseWheelFunc = mouseWheelFunc;
window->mMouseLeaveFunc = mouseLeaveFunc;
window->mMenuItemSelectedFunc = menuItemSelectedFunc;
}
BF_EXPORT void* BFWindow_GetNativeUnderlying(BFWindow* window)
{
return window->GetUnderlying();
}
BF_EXPORT void BF_CALLTYPE BFWindow_MovedDelegate(BFWindow* window, BFWindow_MovedFunc movedFunc)
{
window->mMovedFunc = movedFunc;
}
BF_EXPORT void BF_CALLTYPE BFWindow_SetTitle(BFWindow* window, const char* title)
{
window->SetTitle(title);
}
BF_EXPORT void BF_CALLTYPE BFWindow_SetMinimumSize(BFWindow* window, int minWidth, int minHeight, bool clientSized)
{
window->SetMinimumSize(minWidth, minHeight, clientSized);
}
BF_EXPORT void BF_CALLTYPE BFWindow_GetPosition(BFWindow* window, int* x, int* y, int* width, int* height, int* clientX, int* clientY, int* clientWidth, int* clientHeight)
{
window->GetPosition(x, y, width, height, clientX, clientY, clientWidth, clientHeight);
}
BF_EXPORT void BF_CALLTYPE BFWindow_Resize(BFWindow* window, int x, int y, int width, int height)
{
window->Resize(x, y, width, height);
}
BF_EXPORT void BF_CALLTYPE BFWindow_SetForeground(BFWindow* window)
{
window->SetForeground();
}
BF_EXPORT void BF_CALLTYPE BFWindow_SetNonExclusiveMouseCapture(BFWindow* window)
{
window->SetNonExclusiveMouseCapture();
}
BF_EXPORT void BF_CALLTYPE BFWindow_LostFocus(BFWindow* window, BFWindow* newFocus)
{
window->LostFocus(newFocus);
}
BF_EXPORT void BF_CALLTYPE BFWindow_SetAlpha(BFWindow* window, float alpha, uint32 destAlphaSrcMask, int mouseVisible)
{
window->SetAlpha(alpha, destAlphaSrcMask, mouseVisible != 0);
}
BF_EXPORT void BF_CALLTYPE BFWindow_CaptureMouse(BFWindow* window)
{
window->CaptureMouse();
}
BF_EXPORT bool BF_CALLTYPE BFWindow_IsMouseCaptured(BFWindow* window)
{
return window->IsMouseCaptured();
}
BF_EXPORT void BF_CALLTYPE BFWindow_SetMouseVisible(BFWindow* window, bool mouseVisible)
{
window->SetMouseVisible(mouseVisible);
}
BF_EXPORT void BF_CALLTYPE BFWindow_SetClientPosition(BFWindow* window, int x, int y)
{
window->SetClientPosition(x, y);
}
BF_EXPORT BFMenu* BF_CALLTYPE BFWindow_AddMenuItem(BFWindow* window, BFMenu* parent, int insertIdx, const char* text, const char* hotKey, BFSysBitmap* bitmap, int enabled, int checkState, int radioCheck)
{
return window->AddMenuItem(parent, insertIdx, text, hotKey, bitmap, enabled != 0, checkState, radioCheck != 0);
}
BF_EXPORT void BF_CALLTYPE BFWindow_ModifyMenuItem(BFWindow* window, BFMenu* item, const char* text, const char* hotKey, BFSysBitmap* bitmap, int enabled, int checkState, int radioCheck)
{
window->ModifyMenuItem(item, text, hotKey, bitmap, enabled != 0, checkState, radioCheck != 0);
}
BF_EXPORT void BF_CALLTYPE BFWindow_DeleteMenuItem(BFWindow* window, BFMenu* item)
{
window->RemoveMenuItem(item);
delete item;
}
BF_EXPORT void BF_CALLTYPE BFWindow_Close(BFWindow* window, int force)
{
if (force != 0)
gBFApp->RemoveWindow(window);
else
window->TryClose();
}
///
BF_EXPORT TextureSegment* BF_CALLTYPE Gfx_CreateRenderTarget(int width, int height, int destAlpha)
{
Texture* texture = gBFApp->mRenderDevice->CreateRenderTarget(width, height, destAlpha != 0);
TextureSegment* aTextureSegment = new TextureSegment();
aTextureSegment->InitFromTexture(texture);
return aTextureSegment;
}
BF_EXPORT TextureSegment* BF_CALLTYPE Gfx_CreateDynTexture(int width, int height)
{
Texture* texture = gBFApp->mRenderDevice->CreateDynTexture(width, height);
TextureSegment* aTextureSegment = new TextureSegment();
aTextureSegment->InitFromTexture(texture);
return aTextureSegment;
}
BF_EXPORT TextureSegment* BF_CALLTYPE Gfx_LoadTexture(const char* fileName, int flags)
{
Texture* texture = gBFApp->mRenderDevice->LoadTexture(fileName, flags);
if (texture == NULL)
return NULL;
TextureSegment* aTextureSegment = new TextureSegment();
aTextureSegment->InitFromTexture(texture);
return aTextureSegment;
}
BF_EXPORT void BF_CALLTYPE Gfx_Texture_SetBits(TextureSegment* textureSegment, int destX, int destY, int destWidth, int destHeight, int srcPitch, uint32* bits)
{
textureSegment->mTexture->SetBits(destX, destY, destWidth, destHeight, srcPitch, bits);
}
BF_EXPORT void BF_CALLTYPE Gfx_Texture_Delete(TextureSegment* textureSegment)
{
textureSegment->mTexture->Release();
delete textureSegment;
}
BF_EXPORT int BF_CALLTYPE Gfx_Texture_GetWidth(TextureSegment* textureSegment)
{
return (int) textureSegment->mScaleX;
}
BF_EXPORT int BF_CALLTYPE Gfx_Texture_GetHeight(TextureSegment* textureSegment)
{
return (int) textureSegment->mScaleY;
}
BF_EXPORT void BF_CALLTYPE Gfx_ModifyTextureSegment(TextureSegment* destTextureSegment, TextureSegment* srcTextureSegment, int srcX, int srcY, int srcWidth, int srcHeight)
{
if (destTextureSegment->mTexture != srcTextureSegment->mTexture)
{
destTextureSegment->mTexture->Release();
destTextureSegment->mTexture = srcTextureSegment->mTexture;
destTextureSegment->mTexture->AddRef();
}
Texture* texture = srcTextureSegment->mTexture;
destTextureSegment->mU1 = (srcX / (float) texture->mWidth) + srcTextureSegment->mU1;
destTextureSegment->mV1 = (srcY / (float) texture->mHeight) + srcTextureSegment->mV1;
destTextureSegment->mU2 = ((srcX + srcWidth) / (float) texture->mWidth) + srcTextureSegment->mU1;
destTextureSegment->mV2 = ((srcY + srcHeight) / (float) texture->mHeight) + srcTextureSegment->mV1;
destTextureSegment->mScaleX = (float)abs(srcWidth);
destTextureSegment->mScaleY = (float)abs(srcHeight);
}
BF_EXPORT TextureSegment* BF_CALLTYPE Gfx_CreateTextureSegment(TextureSegment* textureSegment, int srcX, int srcY, int srcWidth, int srcHeight)
{
Texture* texture = textureSegment->mTexture;
texture->AddRef();
TextureSegment* aTextureSegment = new TextureSegment();
aTextureSegment->mTexture = texture;
aTextureSegment->mU1 = (srcX / (float) texture->mWidth) + textureSegment->mU1;
aTextureSegment->mV1 = (srcY / (float) texture->mHeight) + textureSegment->mV1;
aTextureSegment->mU2 = ((srcX + srcWidth) / (float) texture->mWidth) + textureSegment->mU1;
aTextureSegment->mV2 = ((srcY + srcHeight) / (float) texture->mHeight) + textureSegment->mV1;
aTextureSegment->mScaleX = (float)abs(srcWidth);
aTextureSegment->mScaleY = (float)abs(srcHeight);
return aTextureSegment;
}
BF_EXPORT void BF_CALLTYPE Gfx_SetDrawSize(TextureSegment* textureSegment, int width, int height)
{
textureSegment->mScaleX = (float)abs(width);
textureSegment->mScaleY = (float)abs(height);
}
BF_EXPORT void BF_CALLTYPE Gfx_DrawTextureSegment(TextureSegment* textureSegment, float a, float b, float c, float d, float tx, float ty, float z, uint32 color, int pixelSnapping)
{
DrawLayer* drawLayer = gBFApp->mRenderDevice->mCurDrawLayer;
drawLayer->SetTexture(0, textureSegment->mTexture);
DefaultVertex3D* v = (DefaultVertex3D*)drawLayer->AllocStrip(4);
if ((pixelSnapping == 1) ||
((pixelSnapping == 2) && (a == 1.0f) && (b == 0) && (c == 0) && (d == 1.0f)))
{
tx = (float) (int) (tx + 100000) - 100000;
ty = (float) (int) (ty + 100000) - 100000;
}
a *= textureSegment->mScaleX;
b *= textureSegment->mScaleX;
c *= textureSegment->mScaleY;
d *= textureSegment->mScaleY;
v[0].Set(tx, ty, z, textureSegment->mU1, textureSegment->mV1, color);
v[1].Set(tx + a, ty + b, z, textureSegment->mU2, textureSegment->mV1, color);
v[2].Set(tx + c, ty + d, z, textureSegment->mU1, textureSegment->mV2, color);
v[3].Set(tx + (a + c), ty + (b + d), z, textureSegment->mU2, textureSegment->mV2, color);
gPixelsDrawn += (int)((a + b) * (c + d));
}
static TextureSegment* gCurTextureSegment = NULL;
static DefaultVertex3D* gCurAllocVertices = NULL;
BF_EXPORT void BF_CALLTYPE Gfx_AllocTris(TextureSegment* textureSegment, int vtxCount)
{
gCurTextureSegment = textureSegment;
DrawLayer* drawLayer = gBFApp->mRenderDevice->mCurDrawLayer;
drawLayer->SetTexture(0, textureSegment->mTexture);
gCurAllocVertices = (DefaultVertex3D*)gBFApp->mRenderDevice->mCurDrawLayer->AllocTris(vtxCount);
}
BF_EXPORT void BF_CALLTYPE Gfx_SetDrawVertex(int idx, float x, float y, float z, float u, float v, uint32 color)
{
gCurAllocVertices[idx].Set(x, y, z,
gCurTextureSegment->mU1 + u * (gCurTextureSegment->mU2 - gCurTextureSegment->mU1),
gCurTextureSegment->mV1 + v * (gCurTextureSegment->mV2 - gCurTextureSegment->mV1), color);
}
BF_EXPORT void BF_CALLTYPE Gfx_CopyDrawVertex(int destIdx, int srcIdx)
{
gCurAllocVertices[destIdx] = gCurAllocVertices[srcIdx];
}
BF_EXPORT void BF_CALLTYPE Gfx_DrawQuads(TextureSegment* textureSegment, DefaultVertex3D* vertices, int vtxCount)
{
/*for (int vtxIdx = 0; vtxIdx < vtxCount; vtxIdx += 4)
{
Vertex3D* v = gBFApp->mRenderDevice->mCurDrawLayer->AllocStrip(textureSegment->mTexture, drawType != 0, 4);
v[0] = vertices[vtxIdx];
v[1] = vertices[vtxIdx + 1];
v[2] = vertices[vtxIdx + 2];
v[3] = vertices[vtxIdx + 3];
}
return;*/
DrawLayer* drawLayer = gBFApp->mRenderDevice->mCurDrawLayer;
drawLayer->SetTexture(0, textureSegment->mTexture);
DefaultVertex3D* vtxInPtr = vertices;
int curIdx = 0;
while (curIdx < vtxCount)
{
//int batchSize = std::min(128, vtxCount - curIdx);
int batchSize = std::min(16*1024, vtxCount - curIdx);
uint16 idxOfs;
DefaultVertex3D* vtxPtr;
uint16* idxPtr;
gBFApp->mRenderDevice->mCurDrawLayer->AllocIndexed(batchSize, batchSize * 6 / 4, (void**)&vtxPtr, &idxPtr, &idxOfs);
for (int vtxIdx = 0; vtxIdx < batchSize; vtxIdx += 4)
{
*(vtxPtr++) = *(vtxInPtr++);
*(vtxPtr++) = *(vtxInPtr++);
*(vtxPtr++) = *(vtxInPtr++);
*(vtxPtr++) = *(vtxInPtr++);
*(idxPtr++) = idxOfs;
*(idxPtr++) = idxOfs + 1;
*(idxPtr++) = idxOfs + 2;
*(idxPtr++) = idxOfs + 1;
*(idxPtr++) = idxOfs + 2;
*(idxPtr++) = idxOfs + 3;
/*int curIdxIdx = idxPtr - gBFApp->mRenderDevice->mCurDrawLayer->mDrawBatchList.mTail->mIndices;
BF_ASSERT(curIdxIdx <= gBFApp->mRenderDevice->mCurDrawLayer->mDrawBatchList.mTail->mAllocatedIndices);
int curVtxIdx = vtxPtr - gBFApp->mRenderDevice->mCurDrawLayer->mDrawBatchList.mTail->mVertices;
BF_ASSERT(curVtxIdx <= gBFApp->mRenderDevice->mCurDrawLayer->mDrawBatchList.mTail->mAllocatedVertices);*/
idxOfs += 4;
}
curIdx += batchSize;
}
}
BF_EXPORT void BF_CALLTYPE Gfx_DrawIndexedVertices2D(int vertexSize, void* vtxData, int vtxCount, uint16* idxData, int idxCount, float a, float b, float c, float d, float tx, float ty, float z)
{
DrawLayer* drawLayer = gBFApp->mRenderDevice->mCurDrawLayer;
uint16 idxOfs;
void* drawBatchVtxPtr;
uint16* drawBatchIdxPtr;
gBFApp->mRenderDevice->mCurDrawLayer->AllocIndexed(vtxCount, idxCount, (void**)&drawBatchVtxPtr, &drawBatchIdxPtr, &idxOfs);
BF_ASSERT(gBFApp->mRenderDevice->mCurDrawLayer->mCurDrawBatch->mVtxSize == vertexSize);
uint16* idxPtr = idxData;
for (int idxIdx = 0; idxIdx < idxCount; idxIdx++)
*(drawBatchIdxPtr++) = *(idxPtr++) + idxOfs;
//memcpy(drawBatchIdxPtr, idxData, sizeof(uint16) * idxCount);
//memcpy(drawBatchVtxPtr, vtxData, vertexSize * vtxCount);
void* vtxPtr = vtxData;
for (int vtxIdx = 0; vtxIdx < vtxCount; vtxIdx++)
{
Vector3* srcPos = (Vector3*)vtxPtr;
Vector3* destPos = (Vector3*)drawBatchVtxPtr;
destPos->mX = srcPos->mX * a + srcPos->mY * c + tx;
destPos->mY = srcPos->mX * b + srcPos->mY * d + ty;
destPos->mZ = srcPos->mZ + z;
memcpy((uint8*)drawBatchVtxPtr + sizeof(Vector3), (uint8*)vtxPtr + sizeof(Vector3), vertexSize - sizeof(Vector3));
drawBatchVtxPtr = (uint8*)drawBatchVtxPtr + vertexSize;
vtxPtr = (uint8*)vtxPtr + vertexSize;
}
}
BF_EXPORT void BF_CALLTYPE Gfx_SetShaderConstantData(int slotIdx, void* constData, int size)
{
gBFApp->mRenderDevice->mCurDrawLayer->SetShaderConstantData(slotIdx, constData, size);
}
BF_EXPORT void BF_CALLTYPE Gfx_SetShaderConstantDataTyped(int slotIdx, void* constData, int size, int* typeData, int typeCount)
{
gBFApp->mRenderDevice->mCurDrawLayer->SetShaderConstantDataTyped(slotIdx, constData, size, typeData, typeCount);
}
BF_EXPORT void BF_CALLTYPE Gfx_QueueRenderCmd(RenderCmd* renderCmd)
{
gBFApp->mRenderDevice->mCurDrawLayer->QueueRenderCmd(renderCmd);
}
BF_EXPORT VertexDefinition* BF_CALLTYPE Gfx_CreateVertexDefinition(VertexDefData* elementData, int numElements)
{
return gBFApp->mRenderDevice->CreateVertexDefinition(elementData, numElements);
}
BF_EXPORT void BF_CALLTYPE Gfx_VertexDefinition_Delete(VertexDefinition* vertexDefinition)
{
delete vertexDefinition;
}
BF_EXPORT void BF_CALLTYPE Gfx_CreateRenderState(RenderState* srcRenderState)
{
gBFApp->mRenderDevice->CreateRenderState(srcRenderState);
}
BF_EXPORT void BF_CALLTYPE RenderState_Delete(RenderState* renderState)
{
delete renderState;
}
BF_EXPORT void BF_CALLTYPE RenderState_SetClip(RenderState* renderState, float x, float y, float width, float height)
{
BF_ASSERT((width >= 0) && (height >= 0));
renderState->mClipRect.mX = x;
renderState->mClipRect.mY = y;
renderState->mClipRect.mWidth = width;
renderState->mClipRect.mHeight = height;
if (!renderState->mClipped)
renderState->SetClipped(true);
}
BF_EXPORT void BF_CALLTYPE RenderState_SetShader(RenderState* renderState, Shader* shader)
{
renderState->SetShader(shader);
}
BF_EXPORT void BF_CALLTYPE RenderState_DisableClip(RenderState* renderState)
{
renderState->SetClipped(false);
}
BF_EXPORT void BF_CALLTYPE Gfx_SetTexture_TextureSegment(int textureIdx, TextureSegment* textureSegment)
{
DrawLayer* drawLayer = gBFApp->mRenderDevice->mCurDrawLayer;
drawLayer->SetTexture(textureIdx, textureSegment->mTexture);
}
BF_EXPORT void BF_CALLTYPE RenderState_SetDepthFunc(RenderState* renderState, int depthFunc)
{
renderState->SetDepthFunc((DepthFunc)depthFunc);
}
BF_EXPORT void BF_CALLTYPE RenderState_SetDepthWrite(RenderState* renderState, int depthWrite)
{
renderState->SetWriteDepthBuffer(depthWrite != 0);
}
BF_EXPORT Shader* BF_CALLTYPE Gfx_LoadShader(const char* fileName, VertexDefinition* vertexDefinition)
{
return gBFApp->mRenderDevice->LoadShader(fileName, vertexDefinition);
}
BF_EXPORT void BF_CALLTYPE Gfx_SetRenderState(RenderState* renderState)
{
BF_ASSERT(renderState->mShader != NULL);
gBFApp->mRenderDevice->SetRenderState(renderState);
}
BF_EXPORT void BF_CALLTYPE Gfx_Shader_Delete(Shader* shader)
{
delete shader;
}
BF_EXPORT ShaderParam* BF_CALLTYPE Gfx_GetShaderParam(Shader* shader, const char* shaderName)
{
return shader->GetShaderParam(shaderName);
}
BF_EXPORT int BF_CALLTYPE BF_TickCount()
{
return (int) BFTickCount();
}
BF_EXPORT int64 BF_CALLTYPE BF_TickCountMicroFast()
{
return (int) BFGetTickCountMicroFast();
}
BF_EXPORT void BF_CALLTYPE BF_Test()
{
BF_ASSERT(false);
int iArr[] = {2, 3, 4};
for (int i = 0; i < 10; i++)
OutputDebugStrF("Hey %d\n", i);
OutputDebugStrF("Break\n");
for (int i : iArr)
OutputDebugStrF("Hey %d\n", i);
}