示例#1
0
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 ();
}