79 ImGuiIO& io = ImGui::GetIO();
88 if (ImGui::BeginMainMenuBar())
91 if (ImGui::BeginMenu(
"Camera")) {
92 if (ImGui::BeginMenu(
"Use Camera.."))
94 if (ImGui::MenuItem(
"Orbit",
"")) {
95 auto oc = std::make_shared<OrbitCamera>();
96 oc->setWidth(camera->viewportWidth());
97 oc->setHeight(camera->viewportHeight());
98 oc->setEyePos(
Vec3f(1.5f, 1.0f, 1.5f));
101 if (ImGui::MenuItem(
"Trackball",
"")) {
102 auto tc = std::make_shared<TrackballCamera>();
103 tc->setWidth(camera->viewportWidth());
104 tc->setHeight(camera->viewportHeight());
105 tc->setEyePos(
Vec3f(1.5f, 1.0f, 1.5f));
112 if (ImGui::MenuItem(
"Perspective",
"")) {
116 if (ImGui::MenuItem(
"Orthogonal",
"")) {
121 Vec3f tarPos = camera->getTargetPos();
122 Vec3f eyePos = camera->getEyePos();
123 float distance = (tarPos - eyePos).norm();
125 if (ImGui::MenuItem(
"Top",
"")) {
126 camera->setEyePos(
Vec3f(tarPos.x, tarPos.y + distance, tarPos.z));
129 if (ImGui::MenuItem(
"Bottom",
"")) {
130 camera->setEyePos(
Vec3f(tarPos.x, tarPos.y - distance, tarPos.z));
134 if (ImGui::MenuItem(
"Left",
"")) {
135 camera->setEyePos(
Vec3f(tarPos.x - distance, tarPos.y, tarPos.z));
138 if (ImGui::MenuItem(
"Right",
"")) {
139 camera->setEyePos(
Vec3f(tarPos.x + distance, tarPos.y, tarPos.z));
143 if (ImGui::MenuItem(
"Front",
"")) {
144 camera->setEyePos(
Vec3f(tarPos.x, tarPos.y, tarPos.z + distance));
147 if (ImGui::MenuItem(
"Back",
"")) {
148 camera->setEyePos(
Vec3f(tarPos.x, tarPos.y, tarPos.z - distance));
153 float distanceUnit = camera->unitScale();
154 if (ImGui::SliderFloat(
"DistanceUnit", &distanceUnit, 0.01f, 100.0f))
155 camera->setUnitScale(distanceUnit);
160 if (ImGui::BeginMenu(
"Lighting",
"")) {
162 float iBgGray[2] = { engine->bgColor0[0], engine->bgColor1[0] };
165 ImGui::SliderFloat2(
"BG color", iBgGray, 0.0f, 1.0f,
"%.2f", 0);
166 engine->bgColor0 = glm::vec3(iBgGray[0]);
167 engine->bgColor1 = glm::vec3(iBgGray[1]);
169 ImGui::Text(
"Ambient Light");
172 ImGui::SliderFloat(
"", &iLight.
ambientScale, 0.0f, 1.0f,
"%.2f", 0);
175 ImGui::ColorEdit3(
"Ambient Light Color", (
float*)&iLight.
ambientColor, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_Float | ImGuiColorEditFlags_NoDragDrop | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_NoLabel);
177 ImGui::Text(
"Main Light");
179 ImGui::SliderFloat(
"", &iLight.
mainLightScale, 0.0f, 5.0f,
"%.2f", 0);
182 ImGui::ColorEdit3(
"Main Light Color", (
float*)&iLight.
mainLightColor, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_Float | ImGuiColorEditFlags_NoDragDrop | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_NoLabel);
185 ImGui::Text(
"Main Light Direction");
187 vec3 vL(-tmpLightDir[0], -tmpLightDir[1], -tmpLightDir[2]);
195 ImGui::PushItemWidth(120 * .5 - 2);
197 ImGui::SliderFloat(
"", (
float*)(&vL[0]), -1.0f, 1.0f,
"x:%.2f", 0);
ImGui::endTitle();
199 ImGui::SliderFloat(
"", (
float*)(&vL[1]), -1.0f, 1.0f,
"y:%.2f", 0);
ImGui::endTitle();
201 ImGui::SliderFloat(
"", (
float*)(&vL[2]), -1.0f, 1.0f,
"z:%.2f", 0);
ImGui::endTitle();
202 ImGui::PopItemWidth();
205 tmpLightDir = glm::vec3(-vL[0], -vL[1], -vL[2]);
206 float len = length(tmpLightDir);
212 if (ImGui::Checkbox(
"Main Light Shadow", &shadow))
215 rparams.light = iLight;
220 if (ImGui::BeginMenu(
"Environment")) {
221 if (ImGui::RadioButton(
"Standard", &engine->envStyle, 0))
226 if (ImGui::RadioButton(
"Studio", &engine->envStyle, 1))
235 ImGui::Checkbox(
"Draw Environment Map", &engine->bDrawEnvmap);
236 ImGui::DragFloat(
"Environment Scale", &engine->enmapScale, 0.01f, 0.0f, 1.0f);
243 ImGui::Checkbox(
"Show Bounding Box", &(engine->showSceneBounds));
247 float lo[3] = { lowerBound[0], lowerBound[1], lowerBound[2] };
248 ImGui::SliderFloat3(
"Lower Bound", lo, -10.0f, 10.0f);
249 scene->setLowerBound(
Vec3f(lo[0], lo[1], lo[2]));
252 float up[3] = { upperBound[0], upperBound[1], upperBound[2] };
253 ImGui::SliderFloat3(
"Upper Bound", up, -10.0f, 10.0f);
254 scene->setUpperBound(
Vec3f(up[0], up[1], up[2]));
260 if (ImGui::BeginMenu(
"Auxiliary",
"")) {
267 ImGui::Checkbox(
"Show Background", &(engine->showGround));
273 bool canPrintValidationInfo =
scene->isValidationInfoPrintable();
274 if (ImGui::Checkbox(
"Print Validation Info", &canPrintValidationInfo))
275 scene->printValidationInfo(canPrintValidationInfo);
277 bool canPrintNodeInfo =
scene->isNodeInfoPrintable();
278 if (ImGui::Checkbox(
"Print Node Info", &canPrintNodeInfo))
279 scene->printNodeInfo(canPrintNodeInfo);
281 bool canPrintSimulationInfo =
scene->isSimulationInfoPrintable();
282 if (ImGui::Checkbox(
"Print Simulation Info", &canPrintSimulationInfo))
283 scene->printSimulationInfo(canPrintSimulationInfo);
285 bool canPrintRenderingInfo =
scene->isRenderingInfoPrintable();
286 if (ImGui::Checkbox(
"Print Rendering Info", &canPrintRenderingInfo))
287 scene->printRenderingInfo(canPrintRenderingInfo);
312 menu_y = ImGui::GetWindowSize().y;
314 ImGui::EndMainMenuBar();
319 ImGui::SetNextWindowPos(ImVec2(io.DisplaySize.x - 50, 28));
321 ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(36 / 255.0, 36 / 255.0, 36 / 255.0, 255 / 255.0));
322 ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
323 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(5.f, 5.f));
324 ImGui::Begin(
"Right Sidebar", NULL, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize);
338 auto box = node !=
nullptr ? node->boundingBox() :
scene->boundingBox();
340 float len = std::max(box.maxLength(), 0.001f);
341 Vec3f center = 0.5f * (box.upper + box.lower);
343 Vec3f eyePos = camera->getEyePos();
344 Vec3f tarPos = camera->getTargetPos();
345 Vec3f dir = eyePos - tarPos;
350 Vec3f target = center / unit;
351 Vec3f eye = target + 2.2f * dir;
352 camera->setEyePos(eye);
353 camera->setTargetPos(target);
355 camera->setUnitScale(unit);
368 ImGui::PopStyleColor();
369 ImGui::PopStyleVar(2);
374 std::string rEngineName = engine->name();
375 Vec3f eyePos = camera->getEyePos();
376 Vec3f tarPos = camera->getTargetPos();
380 "Eye: (%.2f, %.2f, %.2f) | Target: (%.2f, %.2f, %.2f) | Rendered by %s: %.1f FPS",
381 eyePos.x, eyePos.y, eyePos.z,
382 tarPos.x, tarPos.y, tarPos.z,
383 rEngineName.c_str(), ImGui::GetIO().Framerate);
385 ImVec2 textSize = ImGui::CalcTextSize(text);
387 ImGui::SetNextWindowPos(ImVec2(io.DisplaySize.x - textSize.x - padding * 2, io.DisplaySize.y- textSize.y - padding *2));
388 ImGui::Begin(
"Top Left Widget", NULL, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize);
394 IM_ASSERT(ImGui::GetCurrentContext() != NULL &&
"Missing dear imgui context. Refer to examples app!");
431 scene->traverseForward(&imWidgetQueue);
434 for (
auto widget : imWidgetQueue.
modules)