141 LOG_ERROR(
"Can't init rendering manager");
146 float real_fps = 1.0f;
148 while (!glfwWindowShouldClose(
window))
150 const double currentFrame = glfwGetTime();
151 const std::chrono::steady_clock::time_point frame_start = std::chrono::steady_clock::now();
189 ImGui_ImplOpenGL3_NewFrame();
190 ImGui_ImplGlfw_NewFrame();
198 ImGui::SetNextWindowPos(ImVec2(0, 0));
199 ImGui::SetNextWindowSize(ImVec2(290, 70));
201 ImGui::Begin(
"Position",
nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoCollapse);
202 ImGui::Text(
"%f, %f, %f", position.
x, position.
y, position.
z);
209 ImGui::SetNextWindowPos(ImVec2(0, 75));
210 ImGui::SetNextWindowSize(ImVec2(290, 70));
211 ImGui::Begin(
"Targeted cube",
nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoCollapse);
217 6.0f, raycasted_pos, raycasted_normal);
218 if (raycasted_blockstate !=
nullptr)
220 ImGui::Text(
"Watching block at %i, %i, %i", raycasted_pos.
x, raycasted_pos.
y, raycasted_pos.
z);
221 ImGui::Text(
"Block: %s", raycasted_blockstate->
GetName().c_str());
222 if (ImGui::IsItemHovered(ImGuiHoveredFlags_::ImGuiHoveredFlags_AllowWhenDisabled))
224 ImGui::BeginTooltip();
226 ImGui::Text(
"Air: "); ImGui::SameLine(); raycasted_blockstate->
IsAir() ? ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0),
"1") : ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0),
"0");
227 ImGui::Text(
"Solid: "); ImGui::SameLine(); raycasted_blockstate->
IsSolid() ? ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0),
"1") : ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0),
"0");
228 ImGui::Text(
"Transparent: "); ImGui::SameLine(); raycasted_blockstate->
IsTransparent() ? ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0),
"1") : ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0),
"0");
229 ImGui::Text(
"Lava: "); ImGui::SameLine(); raycasted_blockstate->
IsLava() ? ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0),
"1") : ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0),
"0");
230 ImGui::Text(
"Water: "); ImGui::SameLine(); raycasted_blockstate->
IsWater() ? ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0),
"1") : ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0),
"0");
231 ImGui::Text(
"Waterlogged: "); ImGui::SameLine(); raycasted_blockstate->
IsWaterlogged() ? ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0),
"1") : ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0),
"0");
232 ImGui::Text(
"Fluid Falling: "); ImGui::SameLine(); raycasted_blockstate->
IsFluidFalling() ? ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0),
"1") : ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0),
"0");
233 ImGui::Text(
"Climbable: "); ImGui::SameLine(); raycasted_blockstate->
IsClimbable() ? ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0),
"1") : ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0),
"0");
234 ImGui::Text(
"Hazardous: "); ImGui::SameLine(); raycasted_blockstate->
IsHazardous() ? ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0),
"1") : ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0),
"0");
235 ImGui::Text(
"Slime: "); ImGui::SameLine(); raycasted_blockstate->
IsSlime() ? ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0),
"1") : ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0),
"0");
236 ImGui::Text(
"Bed: "); ImGui::SameLine(); raycasted_blockstate->
IsBed() ? ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0),
"1") : ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0),
"0");
237 ImGui::Text(
"Soul Sand: "); ImGui::SameLine(); raycasted_blockstate->
IsSoulSand() ? ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0),
"1") : ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0),
"0");
238 ImGui::Text(
"Honey: "); ImGui::SameLine(); raycasted_blockstate->
IsHoney() ? ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0),
"1") : ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0),
"0");
239 ImGui::Text(
"Scaffolding: "); ImGui::SameLine(); raycasted_blockstate->
IsScaffolding() ? ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0),
"1") : ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0),
"0");
240 ImGui::Text(
"Cobweb: "); ImGui::SameLine(); raycasted_blockstate->
IsCobweb() ? ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0),
"1") : ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0),
"0");
241 ImGui::Text(
"UpBubbleColumn: "); ImGui::SameLine(); raycasted_blockstate->
IsUpBubbleColumn() ? ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0),
"1") : ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0),
"0");
242 ImGui::Text(
"DownBubbleColumn: "); ImGui::SameLine(); raycasted_blockstate->
IsDownBubbleColumn() ? ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0),
"1") : ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0),
"0");
243 ImGui::Text(
"Berry Bush: "); ImGui::SameLine(); raycasted_blockstate->
IsBerryBush() ? ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0),
"1") : ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0),
"0");
244 ImGui::Text(
"Powder Snow: "); ImGui::SameLine(); raycasted_blockstate->
IsPowderSnow() ? ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0),
"1") : ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0),
"0");
245 ImGui::Text(
"Fluid Height: "); ImGui::SameLine(); ImGui::TextUnformatted(std::to_string(raycasted_blockstate->
GetFluidHeight()).data());
246 ImGui::Text(
"Hardness: "); ImGui::SameLine(); ImGui::TextUnformatted(std::to_string(raycasted_blockstate->
GetHardness()).data());
247 ImGui::Text(
"Friction: "); ImGui::SameLine(); ImGui::TextUnformatted(std::to_string(raycasted_blockstate->
GetFriction()).data());
254 ImGui::Text(
"Watching block at");
255 ImGui::Text(
"Block: ");
260 const float current_day_time =
day_time;
261 std::vector<float> current_color(3);
262 for (
int i = 0; i < 3; ++i)
264 current_color[i] = 2.0f * ((0.5f - std::abs(current_day_time - 0.5f)) *
color_day[i] + (0.5f - std::min(std::abs(1.0f - current_day_time), current_day_time)) *
color_night[i]);
266 glClearColor(current_color[0], current_color[1], current_color[2], 1.0f);
267 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
275 my_shader->SetMat4(
"projection", projection);
288 int num_chunks, num_rendered_chunks, num_entities, num_rendered_entities, num_faces, num_rendered_faces;
289 world_renderer->RenderFaces(&num_chunks, &num_rendered_chunks, &num_entities, &num_rendered_entities, &num_faces, &num_rendered_faces);
291 ImGui::SetNextWindowPos(ImVec2(
static_cast<float>(
current_window_width), 0.0f), 0, ImVec2(1.0f, 0.0f));
292 ImGui::SetNextWindowSize(ImVec2(180.0f, 170.0f));
293 ImGui::Begin(
"Rendering",
nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoCollapse);
295 ImGui::Text(
"Real FPS: %.1f (%.2fms)", 1.0 / real_fps, real_fps * 1000.0);
296 ImGui::Text(
"Loaded sections: %i", num_chunks);
297 ImGui::Text(
"Rendered sections: %i", num_rendered_chunks);
298 ImGui::Text(
"Num entities: %i", num_entities);
299 ImGui::Text(
"Rendered entities: %i", num_rendered_entities);
300 ImGui::Text(
"Loaded faces: %i", num_faces);
301 ImGui::Text(
"Rendered faces: %i", num_rendered_faces);
308 glBindVertexArray(0);
309 glBindTexture(GL_TEXTURE_2D, 0);
315 const int blackboard_width =
static_cast<int>((
static_cast<float>(
current_window_width) - 30.0f) / 4.0f);
317 ImGui::SetNextWindowPos(ImVec2(15.0f, 15.0f), 0, ImVec2(0.0f, 0.0f));
319 ImGui::Begin(
"Blackboard",
nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_HorizontalScrollbar | ImGuiWindowFlags_NoCollapse);
323 ImGui::SetNextWindowPos(ImVec2(15.0f + blackboard_width, 15.0f), 0, ImVec2(0.0f, 0.0f));
325 ImGui::Begin(
"Behaviour",
nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoCollapse);
335 ImGui::Begin(
"Inventory",
nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse);
338 const std::map<short, ProtocolCraft::Slot>& slots =
inventory_manager->GetPlayerInventory()->GetSlots();
341 auto it = slots.find(i);
342 if (it == slots.end())
348 ImGui::Text(
"Crafting output");
352 ImGui::Text(
"Crafting input");
356 ImGui::Text(
"Equiped Armor");
360 ImGui::Text(
"Inventory");
364 ImGui::Text(
"Hotbar");
368 ImGui::Text(
"Offhand");
371 if (name !=
"minecraft:air")
373 ImGui::Text(std::string(
" (%i) " + name +
" (x%i)").c_str(), i, it->second.GetItemCount());
384 ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
411 real_fps =
static_cast<float>(std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now() - frame_start).count() / 1e6);
417 if (current_target_fps <= 0.0)
423 const std::chrono::duration<double> frame_duration(1.0 / current_target_fps);
424 const std::chrono::steady_clock::time_point frame_end = frame_start + std::chrono::duration_cast<std::chrono::steady_clock::duration>(frame_duration);
426 const std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
428 if (now >= frame_end)
433 const std::chrono::nanoseconds wait_time = frame_end - now;
436 if (wait_time > std::chrono::milliseconds(10))
453 ImGui_ImplOpenGL3_Shutdown();
454 ImGui_ImplGlfw_Shutdown();
455 ImGui::DestroyContext();
458 glfwDestroyWindow(
window);