mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-22 03:47:00 +00:00
OpenGL/DirextX examples: comments and tweaks.
This commit is contained in:
parent
f86286548e
commit
ec625b7c49
@ -168,11 +168,9 @@ LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|||||||
io.AddInputCharacter((unsigned short)wParam);
|
io.AddInputCharacter((unsigned short)wParam);
|
||||||
return true;
|
return true;
|
||||||
case WM_DESTROY:
|
case WM_DESTROY:
|
||||||
{
|
Cleanup();
|
||||||
Cleanup();
|
PostQuitMessage(0);
|
||||||
PostQuitMessage(0);
|
return 0;
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return DefWindowProc(hWnd, msg, wParam, lParam);
|
return DefWindowProc(hWnd, msg, wParam, lParam);
|
||||||
}
|
}
|
||||||
@ -180,14 +178,14 @@ LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|||||||
// Notify OS Input Method Editor of text input position (e.g. when using Japanese/Chinese inputs, otherwise this isn't needed)
|
// Notify OS Input Method Editor of text input position (e.g. when using Japanese/Chinese inputs, otherwise this isn't needed)
|
||||||
static void ImImpl_ImeSetInputScreenPosFn(int x, int y)
|
static void ImImpl_ImeSetInputScreenPosFn(int x, int y)
|
||||||
{
|
{
|
||||||
if (HIMC himc = ImmGetContext(hWnd))
|
if (HIMC himc = ImmGetContext(hWnd))
|
||||||
{
|
{
|
||||||
COMPOSITIONFORM cf;
|
COMPOSITIONFORM cf;
|
||||||
cf.ptCurrentPos.x = x;
|
cf.ptCurrentPos.x = x;
|
||||||
cf.ptCurrentPos.y = y;
|
cf.ptCurrentPos.y = y;
|
||||||
cf.dwStyle = CFS_FORCE_POSITION;
|
cf.dwStyle = CFS_FORCE_POSITION;
|
||||||
ImmSetCompositionWindow(himc, &cf);
|
ImmSetCompositionWindow(himc, &cf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void InitImGui()
|
void InitImGui()
|
||||||
@ -218,7 +216,7 @@ void InitImGui()
|
|||||||
io.KeyMap[ImGuiKey_Z] = 'Z';
|
io.KeyMap[ImGuiKey_Z] = 'Z';
|
||||||
|
|
||||||
io.RenderDrawListsFn = ImImpl_RenderDrawLists;
|
io.RenderDrawListsFn = ImImpl_RenderDrawLists;
|
||||||
io.ImeSetInputScreenPosFn = ImImpl_ImeSetInputScreenPosFn;
|
io.ImeSetInputScreenPosFn = ImImpl_ImeSetInputScreenPosFn;
|
||||||
|
|
||||||
// Create the vertex buffer
|
// Create the vertex buffer
|
||||||
if (g_pd3dDevice->CreateVertexBuffer(10000 * sizeof(CUSTOMVERTEX), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL) < 0)
|
if (g_pd3dDevice->CreateVertexBuffer(10000 * sizeof(CUSTOMVERTEX), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL) < 0)
|
||||||
@ -310,36 +308,31 @@ int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPWSTR, int)
|
|||||||
|
|
||||||
UpdateImGui();
|
UpdateImGui();
|
||||||
|
|
||||||
// Create a simple window
|
|
||||||
// Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called "Debug"
|
|
||||||
static bool show_test_window = true;
|
static bool show_test_window = true;
|
||||||
static bool show_another_window = false;
|
static bool show_another_window = false;
|
||||||
static float f;
|
|
||||||
ImGui::Text("Hello, world!");
|
|
||||||
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
|
|
||||||
show_test_window ^= ImGui::Button("Test Window");
|
|
||||||
show_another_window ^= ImGui::Button("Another Window");
|
|
||||||
|
|
||||||
// Calculate and show framerate
|
// 1. Show a simple window
|
||||||
static float ms_per_frame[120] = { 0 };
|
// Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called "Debug"
|
||||||
static int ms_per_frame_idx = 0;
|
|
||||||
static float ms_per_frame_accum = 0.0f;
|
|
||||||
ms_per_frame_accum -= ms_per_frame[ms_per_frame_idx];
|
|
||||||
ms_per_frame[ms_per_frame_idx] = ImGui::GetIO().DeltaTime * 1000.0f;
|
|
||||||
ms_per_frame_accum += ms_per_frame[ms_per_frame_idx];
|
|
||||||
ms_per_frame_idx = (ms_per_frame_idx + 1) % 120;
|
|
||||||
const float ms_per_frame_avg = ms_per_frame_accum / 120;
|
|
||||||
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", ms_per_frame_avg, 1000.0f / ms_per_frame_avg);
|
|
||||||
|
|
||||||
// Show the ImGui test window
|
|
||||||
// Most of user example code is in ImGui::ShowTestWindow()
|
|
||||||
if (show_test_window)
|
|
||||||
{
|
{
|
||||||
ImGui::SetNewWindowDefaultPos(ImVec2(650, 20)); // Normally user code doesn't need/want to call it because positions are saved in .ini file anyway. Here we just want to make the demo initial state a bit more friendly!
|
static float f;
|
||||||
ImGui::ShowTestWindow(&show_test_window);
|
ImGui::Text("Hello, world!");
|
||||||
|
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
|
||||||
|
show_test_window ^= ImGui::Button("Test Window");
|
||||||
|
show_another_window ^= ImGui::Button("Another Window");
|
||||||
|
|
||||||
|
// Calculate and show framerate
|
||||||
|
static float ms_per_frame[120] = { 0 };
|
||||||
|
static int ms_per_frame_idx = 0;
|
||||||
|
static float ms_per_frame_accum = 0.0f;
|
||||||
|
ms_per_frame_accum -= ms_per_frame[ms_per_frame_idx];
|
||||||
|
ms_per_frame[ms_per_frame_idx] = ImGui::GetIO().DeltaTime * 1000.0f;
|
||||||
|
ms_per_frame_accum += ms_per_frame[ms_per_frame_idx];
|
||||||
|
ms_per_frame_idx = (ms_per_frame_idx + 1) % 120;
|
||||||
|
const float ms_per_frame_avg = ms_per_frame_accum / 120;
|
||||||
|
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", ms_per_frame_avg, 1000.0f / ms_per_frame_avg);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show another simple window
|
// 2. Show another simple window, this time using an explicit Begin/End pair
|
||||||
if (show_another_window)
|
if (show_another_window)
|
||||||
{
|
{
|
||||||
ImGui::Begin("Another Window", &show_another_window, ImVec2(200,100));
|
ImGui::Begin("Another Window", &show_another_window, ImVec2(200,100));
|
||||||
@ -347,6 +340,13 @@ int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPWSTR, int)
|
|||||||
ImGui::End();
|
ImGui::End();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow()
|
||||||
|
if (show_test_window)
|
||||||
|
{
|
||||||
|
ImGui::SetNewWindowDefaultPos(ImVec2(650, 20)); // Normally user code doesn't need/want to call it because positions are saved in .ini file anyway. Here we just want to make the demo initial state a bit more friendly!
|
||||||
|
ImGui::ShowTestWindow(&show_test_window);
|
||||||
|
}
|
||||||
|
|
||||||
// Rendering
|
// Rendering
|
||||||
g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, false);
|
g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, false);
|
||||||
g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
|
g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
|
||||||
|
@ -95,15 +95,15 @@ static void ImImpl_SetClipboardTextFn(const char* text)
|
|||||||
// Notify OS Input Method Editor of text input position (e.g. when using Japanese/Chinese inputs, otherwise this isn't needed)
|
// Notify OS Input Method Editor of text input position (e.g. when using Japanese/Chinese inputs, otherwise this isn't needed)
|
||||||
static void ImImpl_ImeSetInputScreenPosFn(int x, int y)
|
static void ImImpl_ImeSetInputScreenPosFn(int x, int y)
|
||||||
{
|
{
|
||||||
HWND hwnd = glfwGetWin32Window(window);
|
HWND hwnd = glfwGetWin32Window(window);
|
||||||
if (HIMC himc = ImmGetContext(hwnd))
|
if (HIMC himc = ImmGetContext(hwnd))
|
||||||
{
|
{
|
||||||
COMPOSITIONFORM cf;
|
COMPOSITIONFORM cf;
|
||||||
cf.ptCurrentPos.x = x;
|
cf.ptCurrentPos.x = x;
|
||||||
cf.ptCurrentPos.y = y;
|
cf.ptCurrentPos.y = y;
|
||||||
cf.dwStyle = CFS_FORCE_POSITION;
|
cf.dwStyle = CFS_FORCE_POSITION;
|
||||||
ImmSetCompositionWindow(himc, &cf);
|
ImmSetCompositionWindow(himc, &cf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -115,8 +115,8 @@ static void glfw_error_callback(int error, const char* description)
|
|||||||
|
|
||||||
static void glfw_mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
|
static void glfw_mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
|
||||||
{
|
{
|
||||||
if (action == GLFW_PRESS && button >= 0 && button < 2)
|
if (action == GLFW_PRESS && button >= 0 && button < 2)
|
||||||
mousePressed[button] = true;
|
mousePressed[button] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void glfw_scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
|
static void glfw_scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
|
||||||
@ -154,7 +154,7 @@ void InitGL()
|
|||||||
window = glfwCreateWindow(1280, 720, "ImGui OpenGL example", NULL, NULL);
|
window = glfwCreateWindow(1280, 720, "ImGui OpenGL example", NULL, NULL);
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
glfwSetKeyCallback(window, glfw_key_callback);
|
glfwSetKeyCallback(window, glfw_key_callback);
|
||||||
glfwSetMouseButtonCallback(window, glfw_mouse_button_callback);
|
glfwSetMouseButtonCallback(window, glfw_mouse_button_callback);
|
||||||
glfwSetScrollCallback(window, glfw_scroll_callback);
|
glfwSetScrollCallback(window, glfw_scroll_callback);
|
||||||
glfwSetCharCallback(window, glfw_char_callback);
|
glfwSetCharCallback(window, glfw_char_callback);
|
||||||
|
|
||||||
@ -196,7 +196,7 @@ void InitImGui()
|
|||||||
io.SetClipboardTextFn = ImImpl_SetClipboardTextFn;
|
io.SetClipboardTextFn = ImImpl_SetClipboardTextFn;
|
||||||
io.GetClipboardTextFn = ImImpl_GetClipboardTextFn;
|
io.GetClipboardTextFn = ImImpl_GetClipboardTextFn;
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
io.ImeSetInputScreenPosFn = ImImpl_ImeSetInputScreenPosFn;
|
io.ImeSetInputScreenPosFn = ImImpl_ImeSetInputScreenPosFn;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Load font texture
|
// Load font texture
|
||||||
@ -206,35 +206,35 @@ void InitImGui()
|
|||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
// Default font (embedded in code)
|
// Default font (embedded in code)
|
||||||
const void* png_data;
|
const void* png_data;
|
||||||
unsigned int png_size;
|
unsigned int png_size;
|
||||||
ImGui::GetDefaultFontData(NULL, NULL, &png_data, &png_size);
|
ImGui::GetDefaultFontData(NULL, NULL, &png_data, &png_size);
|
||||||
int tex_x, tex_y, tex_comp;
|
int tex_x, tex_y, tex_comp;
|
||||||
void* tex_data = stbi_load_from_memory((const unsigned char*)png_data, (int)png_size, &tex_x, &tex_y, &tex_comp, 0);
|
void* tex_data = stbi_load_from_memory((const unsigned char*)png_data, (int)png_size, &tex_x, &tex_y, &tex_comp, 0);
|
||||||
IM_ASSERT(tex_data != NULL);
|
IM_ASSERT(tex_data != NULL);
|
||||||
#else
|
#else
|
||||||
// Custom font from filesystem
|
// Custom font from filesystem
|
||||||
io.Font = new ImBitmapFont();
|
io.Font = new ImBitmapFont();
|
||||||
io.Font->LoadFromFile("../../extra_fonts/mplus-2m-medium_18.fnt");
|
io.Font->LoadFromFile("../../extra_fonts/mplus-2m-medium_18.fnt");
|
||||||
IM_ASSERT(io.Font->IsLoaded());
|
IM_ASSERT(io.Font->IsLoaded());
|
||||||
|
|
||||||
int tex_x, tex_y, tex_comp;
|
int tex_x, tex_y, tex_comp;
|
||||||
void* tex_data = stbi_load("../../extra_fonts/mplus-2m-medium_18.png", &tex_x, &tex_y, &tex_comp, 0);
|
void* tex_data = stbi_load("../../extra_fonts/mplus-2m-medium_18.png", &tex_x, &tex_y, &tex_comp, 0);
|
||||||
IM_ASSERT(tex_data != NULL);
|
IM_ASSERT(tex_data != NULL);
|
||||||
|
|
||||||
// Automatically find white pixel from the texture we just loaded
|
// Automatically find white pixel from the texture we just loaded
|
||||||
// (io.FontTexUvForWhite needs to contains UV coordinates pointing to a white pixel in order to render solid objects)
|
// (io.FontTexUvForWhite needs to contains UV coordinates pointing to a white pixel in order to render solid objects)
|
||||||
for (int tex_data_off = 0; tex_data_off < tex_x*tex_y; tex_data_off++)
|
for (int tex_data_off = 0; tex_data_off < tex_x*tex_y; tex_data_off++)
|
||||||
if (((unsigned int*)tex_data)[tex_data_off] == 0xffffffff)
|
if (((unsigned int*)tex_data)[tex_data_off] == 0xffffffff)
|
||||||
{
|
{
|
||||||
io.FontTexUvForWhite = ImVec2((float)(tex_data_off % tex_x)/(tex_x), (float)(tex_data_off / tex_x)/(tex_y));
|
io.FontTexUvForWhite = ImVec2((float)(tex_data_off % tex_x)/(tex_x), (float)(tex_data_off / tex_x)/(tex_y));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex_x, tex_y, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex_data);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex_x, tex_y, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex_data);
|
||||||
stbi_image_free(tex_data);
|
stbi_image_free(tex_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateImGui()
|
void UpdateImGui()
|
||||||
@ -252,7 +252,7 @@ void UpdateImGui()
|
|||||||
double mouse_x, mouse_y;
|
double mouse_x, mouse_y;
|
||||||
glfwGetCursorPos(window, &mouse_x, &mouse_y);
|
glfwGetCursorPos(window, &mouse_x, &mouse_y);
|
||||||
io.MousePos = ImVec2((float)mouse_x * mousePosScale.x, (float)mouse_y * mousePosScale.y); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
|
io.MousePos = ImVec2((float)mouse_x * mousePosScale.x, (float)mouse_y * mousePosScale.y); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
|
||||||
io.MouseDown[0] = mousePressed[0] || glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) != 0; // If a mouse press event came, always pass it, so we don't miss click-release events that are shorted than our frame.
|
io.MouseDown[0] = mousePressed[0] || glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) != 0; // If a mouse press event came, always pass it as "mouse held this frame", so we don't miss click-release events that are shorter than 1 frame.
|
||||||
io.MouseDown[1] = mousePressed[1] || glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_RIGHT) != 0;
|
io.MouseDown[1] = mousePressed[1] || glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_RIGHT) != 0;
|
||||||
|
|
||||||
// Start the frame
|
// Start the frame
|
||||||
@ -268,41 +268,36 @@ int main(int argc, char** argv)
|
|||||||
while (!glfwWindowShouldClose(window))
|
while (!glfwWindowShouldClose(window))
|
||||||
{
|
{
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
mousePressed[0] = mousePressed[1] = false;
|
mousePressed[0] = mousePressed[1] = false;
|
||||||
io.MouseWheel = 0;
|
io.MouseWheel = 0;
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
UpdateImGui();
|
UpdateImGui();
|
||||||
|
|
||||||
// Create a simple window
|
|
||||||
// Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called "Debug"
|
|
||||||
static bool show_test_window = true;
|
static bool show_test_window = true;
|
||||||
static bool show_another_window = false;
|
static bool show_another_window = false;
|
||||||
static float f;
|
|
||||||
ImGui::Text("Hello, world!");
|
|
||||||
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
|
|
||||||
show_test_window ^= ImGui::Button("Test Window");
|
|
||||||
show_another_window ^= ImGui::Button("Another Window");
|
|
||||||
|
|
||||||
// Calculate and show framerate
|
// 1. Show a simple window
|
||||||
static float ms_per_frame[120] = { 0 };
|
// Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called "Debug"
|
||||||
static int ms_per_frame_idx = 0;
|
|
||||||
static float ms_per_frame_accum = 0.0f;
|
|
||||||
ms_per_frame_accum -= ms_per_frame[ms_per_frame_idx];
|
|
||||||
ms_per_frame[ms_per_frame_idx] = ImGui::GetIO().DeltaTime * 1000.0f;
|
|
||||||
ms_per_frame_accum += ms_per_frame[ms_per_frame_idx];
|
|
||||||
ms_per_frame_idx = (ms_per_frame_idx + 1) % 120;
|
|
||||||
const float ms_per_frame_avg = ms_per_frame_accum / 120;
|
|
||||||
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", ms_per_frame_avg, 1000.0f / ms_per_frame_avg);
|
|
||||||
|
|
||||||
// Show the ImGui test window
|
|
||||||
// Most of user example code is in ImGui::ShowTestWindow()
|
|
||||||
if (show_test_window)
|
|
||||||
{
|
{
|
||||||
ImGui::SetNewWindowDefaultPos(ImVec2(650, 20)); // Normally user code doesn't need/want to call it because positions are saved in .ini file anyway. Here we just want to make the demo initial state a bit more friendly!
|
static float f;
|
||||||
ImGui::ShowTestWindow(&show_test_window);
|
ImGui::Text("Hello, world!");
|
||||||
|
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
|
||||||
|
show_test_window ^= ImGui::Button("Test Window");
|
||||||
|
show_another_window ^= ImGui::Button("Another Window");
|
||||||
|
|
||||||
|
// Calculate and show framerate
|
||||||
|
static float ms_per_frame[120] = { 0 };
|
||||||
|
static int ms_per_frame_idx = 0;
|
||||||
|
static float ms_per_frame_accum = 0.0f;
|
||||||
|
ms_per_frame_accum -= ms_per_frame[ms_per_frame_idx];
|
||||||
|
ms_per_frame[ms_per_frame_idx] = ImGui::GetIO().DeltaTime * 1000.0f;
|
||||||
|
ms_per_frame_accum += ms_per_frame[ms_per_frame_idx];
|
||||||
|
ms_per_frame_idx = (ms_per_frame_idx + 1) % 120;
|
||||||
|
const float ms_per_frame_avg = ms_per_frame_accum / 120;
|
||||||
|
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", ms_per_frame_avg, 1000.0f / ms_per_frame_avg);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show another simple window
|
// 2. Show another simple window, this time using an explicit Begin/End pair
|
||||||
if (show_another_window)
|
if (show_another_window)
|
||||||
{
|
{
|
||||||
ImGui::Begin("Another Window", &show_another_window, ImVec2(200,100));
|
ImGui::Begin("Another Window", &show_another_window, ImVec2(200,100));
|
||||||
@ -310,6 +305,13 @@ int main(int argc, char** argv)
|
|||||||
ImGui::End();
|
ImGui::End();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow()
|
||||||
|
if (show_test_window)
|
||||||
|
{
|
||||||
|
ImGui::SetNewWindowDefaultPos(ImVec2(650, 20)); // Normally user code doesn't need/want to call this, because positions are saved in .ini file. Here we just want to make the demo initial state a bit more friendly!
|
||||||
|
ImGui::ShowTestWindow(&show_test_window);
|
||||||
|
}
|
||||||
|
|
||||||
// Rendering
|
// Rendering
|
||||||
glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y);
|
glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y);
|
||||||
glClearColor(0.8f, 0.6f, 0.6f, 1.0f);
|
glClearColor(0.8f, 0.6f, 0.6f, 1.0f);
|
||||||
|
Loading…
Reference in New Issue
Block a user