/
vTech
/
FcApps
Обзор
Документация
Войти
/
vTech
/
FcApps
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
FcLibs/FcUI/src/FcUI_Buffer/FcUI_Buffer_Array_GL.h
146 строк
9 KB
vTech
alpha_00
03 дек 2025, 17:45
03 дек 2025, 17:45
ab8382d
Код
Авторство
О чём код?
#ifndef _FCUI_BUFFER_ARRAY_GL_H_ #define _FCUI_BUFFER_ARRAY_GL_H_ #include "FcUI_Setting.h" #include "FcUI_Error.h" #include "FcUI_Memory.h" #include "FcUI_Program.h" #define FCUI_BUFFER_ARRAY_GL_T(n) typedef struct _FcUI_Buffer_Array_v##n##_GL_t {\ const FcPlatform_GL_t* mPlatform; \ FcUI_Memory_t* mMemory; \ FcGL_Buffer_Array_v##n##_t mBuffer0; \ }FcUI_Buffer_Array_v##n##_GL_t; \ typedef struct _FcUI_Buffer_Array_v##n##_GL_config_t{ \ FcWindow_t* mWindow; \ FcGL_Program_t* mProgram; \ const char* mNameAttrib[n]; \ size_t mDataSize; \ float* mData; \ size_t mAttribVectorLength[n]; \ uint8_t mReserved[16]; \ }FcUI_Buffer_Array_v##n##_GL_config_t; \ FCUIDEF FcUI_Error_t FcUI_Buffer_Array_v##n##_GL(FcUI_Buffer_Array_v##n##_GL_t* pBuffer, FcUI_Buffer_Array_v##n##_GL_config_t* pConfig); \ FCUIDEF void* FcUI_Buffer_Array_v##n##_GL_getData(FcUI_Buffer_Array_v##n##_GL_t* pBuffer, size_t* pDataSize); \ FCUIDEF FcUI_Error_t FcUI_Buffer_Array_v##n##_GL_sync(FcUI_Buffer_Array_v##n##_GL_t* pBuffer); \ FCUIDEF FcUI_Error_t FcUI_Buffer_Array_v##n##_GL_free(FcUI_Buffer_Array_v##n##_GL_t* pBuffer); \ FCUIDEF FcWindow_Error_t FcUI_Buffer_Array_v##n##_GL_queue(FcWindow_t* pWindow, void* pBuffer); \ FCUIDEF FcWindow_Error_t FcUI_Buffer_Array_v##n##_GL_bind_queue(FcWindow_t* pWindow, FcUI_Buffer_Array_v##n##_GL_t* pBuffer); \ FCUIDEF FcWindow_Error_t FcUI_Buffer_Array_v##n##_GL_free_queue(FcWindow_t* pWindow, void* pBuffer); \ FCUIDEF FcGL_Buffer_Array_v##n##_t* FcUI_Buffer_Array_v##n##_GL_getBuffer(FcUI_Buffer_Array_v##n##_GL_t* pBuffer) { return pBuffer ? &pBuffer->mBuffer0 : NULL; };\ FCUIDEF FcUI_Error_t FcUI_Buffer_Array_v##n##_GL(FcUI_Buffer_Array_v##n##_GL_t* pBuffer, FcUI_Buffer_Array_v##n##_GL_config_t* pConfig) { \ size_t mSize; \ FcPlatform_GL_t* mPlatform; \ FcUI_Buffer_Array_v##n##_GL_config_t* mConfig; \ FcUI_Error_t mError = FCUI_ERROR_NOERROR; \ FCUISAFECALL(mError, (pBuffer && pConfig), FCUI_ERROR_PARAMETERS); \ pBuffer->mPlatform = FcWindow_getPlatform_GL(pConfig->mWindow); \ mSize = pConfig->mDataSize + sizeof(FcUI_Buffer_Array_v##n##_GL_config_t); \ FCUISAFECALLF(mError, FcUI_Memory(&pBuffer->mMemory, mSize, 1)); \ mConfig = (FcUI_Buffer_Array_v##n##_GL_config_t*)&pBuffer->mMemory->mData[0]; \ mSize = 0; \ FCUISAFECALLF(mError, FcUI_Memory_setData(pBuffer->mMemory, 0, (uint8_t*)pConfig, sizeof(FcUI_Buffer_Array_v##n##_GL_config_t))); \ mSize += offsetof(FcUI_Buffer_Array_v##n##_GL_config_t, mReserved); \ FCUISAFECALLF(mError, FcUI_Memory_setData(pBuffer->mMemory, mSize, (uint8_t*)pConfig->mData, pConfig->mDataSize)); \ mConfig->mData = (float*)mConfig->mReserved; \ FCUISAFECALLF(mError, FcUI_Buffer_Array_v##n##_GL_sync(pBuffer)); \ gError: \ return mError; \ } \ FCUIDEF void* FcUI_Buffer_Array_v##n##_GL_getData(FcUI_Buffer_Array_v##n##_GL_t* pBuffer, size_t* pDataSize){ \ size_t mSize; \ FcUI_Buffer_Array_v##n##_GL_config_t* mConfig; \ void* mData = NULL; \ FCUISAFECALL(mData, (pBuffer && pDataSize), NULL); \ \ mSize = FcUI_Memory_getSize(pBuffer->mMemory); \ mConfig = (FcUI_Buffer_Array_v##n##_GL_config_t*)FcUI_Memory_getData(pBuffer->mMemory, 0, mSize); \ if (mConfig){ \ *pDataSize = mConfig->mDataSize; \ mData = mConfig->mData; \ } \ gError: \ return mData; \ } \ FCUIDEF FcUI_Error_t FcUI_Buffer_Array_v##n##_GL_sync(FcUI_Buffer_Array_v##n##_GL_t* pBuffer) { \ size_t mSize; \ FcUI_Buffer_Array_v##n##_GL_config_t* mConfig; \ FcUI_Error_t mError = FCUI_ERROR_NOERROR; \ FCUISAFECALL(mError, (pBuffer), FCUI_ERROR_PARAMETERS); \ mConfig = NULL; \ mSize = FcUI_Memory_getSize(pBuffer->mMemory); \ mConfig = (FcUI_Buffer_Array_v##n##_GL_config_t*)FcUI_Memory_getData(pBuffer->mMemory, 0, mSize); \ if (mConfig) { \ \ FCUISAFECALLF(mError, FcWindow_GraphicsQueue_push_GL(mConfig->mWindow, FcUI_Buffer_Array_v##n##_GL_queue, (void*)pBuffer)); \ \ } \ gError: \ return mError; \ } \ FCUIDEF FcUI_Error_t FcUI_Buffer_Array_v##n##_GL_free(FcUI_Buffer_Array_v##n##_GL_t* pBuffer) { \ size_t mSize; \ FcUI_Buffer_Array_v##n##_GL_config_t* mConfig; \ FcUI_Error_t mError = FCUI_ERROR_NOERROR; \ FCUISAFECALL(mError, (pBuffer), FCUI_ERROR_PARAMETERS); \ mSize = FcUI_Memory_getSize(pBuffer->mMemory); \ mConfig = (FcUI_Buffer_Array_v##n##_GL_config_t*)FcUI_Memory_getData(pBuffer->mMemory, 0, mSize); \ if (!mConfig) goto gError; \ FCUISAFECALLF(mError, FcWindow_GraphicsQueue_Callback_push_GL(mConfig->mWindow, FcUI_Buffer_Array_v##n##_GL_free_queue, (void*)pBuffer));\ gError: \ return mError; \ } \ FCUIDEF FcWindow_Error_t FcUI_Buffer_Array_v##n##_GL_queue(FcWindow_t* pWindow, void* pBuffer) { \ size_t mSize, i, mVertOffset; \ FcUI_Buffer_Array_v##n##_GL_t* mBuffer0; \ FcUI_Buffer_Array_v##n##_GL_config_t* mConfig; \ FcGL_Buffer_Array_setting_v##n##_t mSetting; \ FcWindow_Error_t mError = FCWINDOW_ERROR_NOERROR; \ FCUISAFECALL(mError, (pBuffer && pWindow), FCWINDOW_ERROR_PARAMETER_0); \ mBuffer0 = (FcUI_Buffer_Array_v##n##_GL_t*)pBuffer; \ mSize = (size_t)FcUI_Memory_getSize(mBuffer0->mMemory); \ FCUISAFECALL(mError, (mConfig = (FcUI_Buffer_Array_v##n##_GL_config_t*)FcUI_Memory_getData(mBuffer0->mMemory, 0, mSize)), FCWINDOW_ERROR_FCUI_MEMORY);\ mSetting.mArrayData = mConfig->mData; \ mSetting.mSizeArray = mConfig->mDataSize; \ for (mSize = i = 0; i < n; i++) \ mSize += mConfig->mAttribVectorLength[i]; \ for (mVertOffset = i = 0; i < n; i++) { \ mSetting.mVertexAttrib[i] = mConfig->mNameAttrib[i]; \ mSetting.mVertexVectorLength[i] = mConfig->mAttribVectorLength[i]; \ mSetting.mVertexStride[i] = mSize * sizeof(GLfloat); \ mSetting.mVertexOffset[i] = mVertOffset * sizeof(GLfloat); \ mVertOffset += mConfig->mAttribVectorLength[i]; \ } \ mBuffer0->mPlatform = FcWindow_getPlatform_GL(mConfig->mWindow); \ FcGL_Buffer_Array_v##n(mBuffer0->mPlatform, mConfig->mProgram, &mBuffer0->mBuffer0, &mSetting); \ gError: \ return mError; \ } \ FCUIDEF FcWindow_Error_t FcUI_Buffer_Array_v##n##_GL_bind_queue(FcWindow_t* pWindow, FcUI_Buffer_Array_v##n##_GL_t* pBuffer) { \ FcWindow_Error_t mError; \ mError = FCWINDOW_ERROR_NOERROR; \ FCUISAFECALL(mError, (pBuffer), FCWINDOW_ERROR_PARAMETER_0); \ FcGL_Buffer_Array_bind_v##n(pBuffer->mPlatform, &pBuffer->mBuffer0); \ gError: \ return mError; \ } \ FCUIDEF FcWindow_Error_t FcUI_Buffer_Array_v##n##_GL_free_queue(FcWindow_t* pWindow, void* pBuffer) { \ FcUI_Buffer_Array_v##n##_GL_t* mBuffer0; \ FcWindow_Error_t mError; \ mError = FCWINDOW_ERROR_NOERROR; \ FCUISAFECALL(mError, (pBuffer), FCWINDOW_ERROR_PARAMETER_0); \ mBuffer0 = (FcUI_Buffer_Array_v##n##_GL_t*)pBuffer; \ FcGL_Buffer_Array_free_v##n(mBuffer0->mPlatform, &mBuffer0->mBuffer0); \ FcUI_Memory_free(&mBuffer0->mMemory); \ gError: \ return mError; \ } FCUI_BUFFER_ARRAY_GL_T(1) FCUI_BUFFER_ARRAY_GL_T(2) FCUI_BUFFER_ARRAY_GL_T(3) FCUI_BUFFER_ARRAY_GL_T(4) #endif //_FCUI_BUFFER_ARRAY_GL_H_