void GuiMedia::render() { if (ImGui::CollapsingHeader(_name.c_str())) { auto mediaList = getSceneMedia(); for (auto& media : mediaList) { auto mediaName = media->getName(); if (ImGui::TreeNode(mediaName.c_str())) { ImGui::Text("Change media type: "); ImGui::SameLine(); if (_mediaTypeIndex.find(mediaName) == _mediaTypeIndex.end()) _mediaTypeIndex[mediaName] = 0; vector<const char*> mediaTypes; for (auto& type : _mediaTypes) mediaTypes.push_back(type.first.c_str()); if (ImGui::Combo("", &_mediaTypeIndex[mediaName], mediaTypes.data(), mediaTypes.size())) replaceMedia(mediaName, mediaTypes[_mediaTypeIndex[mediaName]]); ImGui::Text(("Current media type: " + _mediaTypesReversed[media->getRemoteType()]).c_str()); ImGui::Text("Parameters:"); auto attributes = media->getAttributes(true); drawAttributes(mediaName, attributes); // TODO: specific part for Queues. Need better Attributes definition to remove this // Display the playlist if this is a queue if (dynamic_pointer_cast<QueueSurrogate>(media)) { if (ImGui::TreeNode("Playlist")) { auto updated = false; Values playlist; auto playlistIt = attributes.find("playlist"); if (playlistIt != attributes.end()) { playlist = playlistIt->second; // Current sources int index = 0; int deleteIndex = -1; for (auto& source : playlist) { auto values = source.as<Values>(); auto idStack = to_string(index) + values[0].as<string>(); ImGui::PushID((idStack + "delete").c_str()); if (ImGui::Button("-")) deleteIndex = index; ImGui::PopID(); if (ImGui::IsItemHovered()) ImGui::SetTooltip("Delete this media"); ImGui::SameLine(); ImGui::PushItemWidth(96); ImGui::PushID((idStack + "media_type").c_str()); ImGui::Text(_mediaTypesReversed[values[0].as<string>()].c_str()); if (ImGui::IsItemHovered()) ImGui::SetTooltip("Media type"); ImGui::PopID(); ImGui::PopItemWidth(); ImGui::SameLine(); ImGui::PushItemWidth(96); float tmp = values[2].as<float>(); ImGui::PushID((idStack + "start").c_str()); if (ImGui::InputFloat("", &tmp, 1.0f, 1.0f, 2, ImGuiInputTextFlags_EnterReturnsTrue)) { source[2] = tmp; updated = true; } if (ImGui::IsItemHovered()) ImGui::SetTooltip("Start time (s)"); ImGui::PopID(); ImGui::PopItemWidth(); ImGui::SameLine(); ImGui::PushItemWidth(96); tmp = values[3].as<float>(); ImGui::PushID((idStack + "stop").c_str()); if (ImGui::InputFloat("", &tmp, 1.0f, 1.0f, 2, ImGuiInputTextFlags_EnterReturnsTrue)) { source[3] = tmp; updated = true; } if (ImGui::IsItemHovered()) ImGui::SetTooltip("Stop time (s)"); ImGui::PopID(); ImGui::PopItemWidth(); ImGui::SameLine(); ImGui::PushItemWidth(-0.01f); ImGui::PushID((idStack + "path").c_str()); ImGui::Text(values[1].as<string>().c_str()); if (ImGui::IsItemHovered()) ImGui::SetTooltip("Media path"); ImGui::PopID(); ImGui::PopItemWidth(); ++index; } if (deleteIndex >= 0) { playlist.erase(playlist.begin() + deleteIndex); updated = true; } } // Adding a source ImGui::Text("Add a media:"); ImGui::PushID("addNewMedia"); if (ImGui::Button("+")) { playlist.push_back(_newMedia); updated = true; } ImGui::PopID(); if (ImGui::IsItemHovered()) ImGui::SetTooltip("Add this media"); int typeIndex; ImGui::SameLine(); ImGui::PushItemWidth(96); ImGui::PushID("newMediaType"); if (ImGui::Combo("", &_newMediaTypeIndex, mediaTypes.data(), mediaTypes.size())) _newMedia[0] = _mediaTypes[mediaTypes[_newMediaTypeIndex]]; if (ImGui::IsItemHovered()) ImGui::SetTooltip("Media type"); ImGui::PopID(); ImGui::PopItemWidth(); ImGui::SameLine(); ImGui::PushItemWidth(96); ImGui::PushID("newMediaStart"); if (ImGui::InputFloat("", &_newMediaStart, 0.1f, 1.0f, 2, ImGuiInputTextFlags_EnterReturnsTrue)) _newMedia[2] = _newMediaStart; if (ImGui::IsItemHovered()) ImGui::SetTooltip("Start time (s)"); ImGui::PopID(); ImGui::PopItemWidth(); ImGui::SameLine(); ImGui::PushItemWidth(96); ImGui::PushID("newMediaStop"); if (ImGui::InputFloat("", &_newMediaStop, 0.1f, 1.0f, 2, ImGuiInputTextFlags_EnterReturnsTrue)) _newMedia[3] = _newMediaStop; if (ImGui::IsItemHovered()) ImGui::SetTooltip("Stop time (s)"); ImGui::PopID(); ImGui::PopItemWidth(); string filepath = _newMedia[1].as<string>(); filepath.resize(512); ImGui::SameLine(); ImGui::PushItemWidth(-32.f); ImGui::PushID("newMediaFile"); if (ImGui::InputText("", const_cast<char*>(filepath.c_str()), filepath.size(), ImGuiInputTextFlags_EnterReturnsTrue)) _newMedia[1] = filepath; if (ImGui::IsItemHovered()) ImGui::SetTooltip("Media path"); ImGui::PopItemWidth(); ImGui::SameLine(); if (ImGui::Button("...")) { _fileSelectorTarget = mediaName; } if (_fileSelectorTarget == mediaName) { static string path = _root.lock()->getMediaPath(); bool cancelled; vector<string> extensions{{"bmp"}, {"jpg"}, {"png"}, {"tga"}, {"tif"}, {"avi"}, {"mov"}, {"mp4"}}; if (SplashImGui::FileSelector(mediaName, path, cancelled, extensions)) { if (!cancelled) { _newMedia[1] = path; path = Utils::getPathFromFilePath("./"); } _fileSelectorTarget = ""; } } ImGui::PopID(); if (updated) { setObject(mediaName, "playlist", playlist); } ImGui::TreePop(); } // Display the filters associated with this queue auto filter = dynamic_pointer_cast<QueueSurrogate>(media)->getFilter(); auto filterName = filter->getName(); if (ImGui::TreeNode(("Filter: " + filterName).c_str())) { auto filterAttributes = filter->getAttributes(true); drawAttributes(filterName, filterAttributes); ImGui::TreePop(); } } else { // Display the filters associated with this media auto filters = getFiltersForImage(media); for (auto& filter : filters) { auto filterName = filter->getName(); if (ImGui::TreeNode(("Filter: " + filterName).c_str())) { auto filterAttributes = filter->getAttributes(true); drawAttributes(filterName, filterAttributes); ImGui::TreePop(); } } } ImGui::TreePop(); } } } }
/** * Zeichen-Callback. * Loescht die Buffer, ruft das Zeichnen der Szene auf und tauscht den Front- * und Backbuffer. */ static void cbDisplay (void) { int toX = G_fullScreen ? G_Width : G_Width/2, toZ = G_fullScreen ? G_Height : G_Height/2; glBindFramebuffer(GL_FRAMEBUFFER, 0); glClearColor(0.0, 1.0, 1.0, 0.0); glClearDepth(1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if (!getHelpStatus()) { /*==================================================================*/ /* Textur mit Kamera-Perspektive */ /*==================================================================*/ drawSceneToTexture(G_fboCam, getCameraPosition(0), getCameraPosition(1), getCameraPosition(2), 0.0, 0.0, 0.0); /*==================================================================*/ /* Terrain mit Ambient Occlusion. */ /*==================================================================*/ glUseProgram(G_ShaderID); glBindFramebuffer(GL_FRAMEBUFFER, 0); glViewport (0, 0, toX, toZ); setProjection (1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt (getCameraPosition(0), getCameraPosition(1), getCameraPosition(2), 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, G_TexCamera); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, G_TexCameraDepth); GLfloat mp[16], mv[16]; glGetFloatv(GL_PROJECTION_MATRIX, mp); glGetFloatv(GL_MODELVIEW_MATRIX, mv); glUniformMatrix4fv(glGetUniformLocation(G_ShaderID, "projMatrix"), 1, GL_FALSE, &mp[0]); glUniformMatrix4fv(glGetUniformLocation(G_ShaderID, "viewMatrix"), 1, GL_FALSE, &mv[0]); glUniform1i(G_sampler2dLoc, 1); glUniform1i(G_samplerDepth2dLoc, 0); GLuint showTexture[] = {G_showTexture}; glUniform1iv(glGetUniformLocation(G_ShaderID, "showTexture"), 1, showTexture); GLuint screenWidth[] = {G_Width}; glUniform1iv(glGetUniformLocation(G_ShaderID, "screenWidth"), 1, screenWidth); GLuint screenHeight[] = {G_Height}; glUniform1iv(glGetUniformLocation(G_ShaderID, "screenHeight"), 1, screenHeight); GLfloat nearPlane[] = {G_NearPlane}; glUniform1fv(glGetUniformLocation(G_ShaderID, "nearPlane"), 1, nearPlane); GLfloat farPlane[] = {G_FarPlane}; glUniform1fv(glGetUniformLocation(G_ShaderID, "farPlane"), 1, farPlane); GLuint range[] = {getRange()}; glUniform1iv(glGetUniformLocation(G_ShaderID, "range"), 1, range); GLuint pixelDistance[] = {getPixelDistance()}; glUniform1iv(glGetUniformLocation(G_ShaderID, "pixelDistance"), 1, pixelDistance); GLfloat multiplier[] = {getMultiplier()}; glUniform1fv(glGetUniformLocation(G_ShaderID, "multiplier"), 1, multiplier); glBindBuffer (GL_ARRAY_BUFFER, G_WaterBuffer); glBufferData (GL_ARRAY_BUFFER, sizeof(*getWaterList())*WORLD_SIZE*WORLD_SIZE, getWaterList(), GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8*sizeof(GLfloat)+1*sizeof(GLint), 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, G_WaterBufferIndex); /* Wasser. */ glDrawElements(GL_TRIANGLES, WORLD_SIZE*WORLD_SIZE*2*3, GL_UNSIGNED_INT, 0); glDisableVertexAttribArray(0); glDisableVertexAttribArray(1); glUseProgram(0); drawFPS(); drawAttributes(); } else { printHelp(); } /* Alles fertig. */ glutSwapBuffers (); }