• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Biblioteka Open GL GLUT C++ Pętla glutMainLoop();

Object Storage Arubacloud
0 głosów
266 wizyt
pytanie zadane 2 czerwca 2023 w C i C++ przez piotr_domanski Bywalec (2,080 p.)
zamknięte 3 czerwca 2023 przez piotr_domanski

Witam,

Mam taki problem gdyż w moim programie wdrożyłem obiekty 3D. Wszystko działa jak trzeba jednak głównym program jest w konsoli i teraz przedstawię jak to działa i z czym mam problem. 

Wpisuje komendę show i wyskakuje okno Open GL 

Po wpisaniu komendy show wykonuje się taki if

                        if (a_krawedz_COMMAND == "show")
                        {
                              // Inicjalizacja biblioteki GLUT
                            glutInit(&argc, argv);
                            glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
                            glutInitWindowSize(windowWidth, windowHeight);
                            glutCreateWindow("Cube");

                            // Rejestracja funkcji obsługi zdarzeń
                            glutDisplayFunc(displayCube);
                            glutReshapeFunc(reshape);
                            glutMouseFunc(mouseCube);
                            glutMotionFunc(motion);
                            glutKeyboardFunc(keyboardCube);
                            ////glutSpecialFunc(specialKeys);

                            // Ustawienie koloru tła
                            glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

                            // Włączenie testu głębokości
                            glEnable(GL_DEPTH_TEST);

                            // Inicjalizacja wygładzania krawędzi
                            glEnable(GL_BLEND);
                            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
                            glEnable(GL_LINE_SMOOTH);
                            glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);

                            // Pętla główna
                            glutMainLoop();

                           ///// jak mam wyjść z petli glutMainLoop(); ?

                         }

I mam teraz funkcję keyboard w której po naciśnięciu ESC okno Open GL się zamyka za pomocą funkcji: 

glutDestroyWindow(glutGetWindow());

Tu jest kod funkcji keyboard:

void keyboardCube(unsigned char key, int x, int y)
{
    if (key == 'f' || key == 'F')
    {
        filledCube = !filledCube;
        glutPostRedisplay();
    }
    if (key == 'v' || key == 'V')
    {
        showVertices = !showVertices;
        glutPostRedisplay();
    }
    if (key == 'r' || key == 'R')
    {
        autoRotate = !autoRotate;
        if (autoRotate)
            glutIdleFunc(rotateCube);
        else
            glutIdleFunc(nullptr);
    }
    if (key == 27) // ESC 
    {
        
    }


    // Prze³¹czanie wyœwietlania przek¹tnych szeœcianu
    if (key == 'd' || key == 'D')
    {
        showDiagonals = !showDiagonals;
        glutPostRedisplay();
    }
}

I teraz przejdę do sedna problemu. 

Chce widzieć jak przerwać pętle glutMainLoop();, gdyż po naciśnięciu ESC okno się zamknie

if (key == 27) // ESC 
    {
        glutDestroyWindow(glutGetWindow());
    }

ale nie wiem jak potem powrócić do programu tak żeby program nie kończył się, bo jak zrobię tak :

if (key == 27) // ESC 
    {
        exit(0);
    }

to program się zakończy a jak tak nie chce, chce żeby tern program w konsoli który wywołuje okno OEPN GL, dalej działał i można w nim było dalej wpisywać komendy czy wykonywać inne obliczenia. 

tego nie chce tak jak poniżej na obrazku.

Jak ktoś wie jak przerwać tą pętlę to proszę o pomoc :).

Z góry dziękuję. 

 

komentarz zamknięcia: rozwiązanie

1 odpowiedź

0 głosów
odpowiedź 3 czerwca 2023 przez j23 Mędrzec (194,920 p.)
wybrane 3 czerwca 2023 przez piotr_domanski
 
Najlepsza

glutLeaveMainLoop?

komentarz 3 czerwca 2023 przez piotr_domanski Bywalec (2,080 p.)

dodałem to i jest błąd w konsoli : freeglut  ERROR:  Function <glutSetOption> called without first calling 'glutInit'.

 

KOD:

#include <iostream>
#include <windows.h>
#include <GL/freeglut.h>

const double M_PI = 3.14159265358979323846; // Definicja stałej M_PI

// Wymiary okna
int windowWidth = 800;
int windowHeight = 600;

// Kąty obrotu
float angleX = 0.0f;
float angleY = 0.0f;

// Pozycja myszki
int mousePosX = 0;
int mousePosY = 0;

// Flaga wciśnięcia lewego przycisku myszy
bool leftButtonPressed = false;

bool showVertices = false;

// Flaga wskazująca, czy wyświetlać sześcian wypełniony
bool filledCube = false;

bool showDiagonals = false;

// Grubość linii
float lineThickness = 1.0f;

bool autoRotate = false;
bool showHigh = false;
bool showAngles = false;

void rotateCube()
{
    // Automatyczny obrót sześcianu
    angleX += 1.0f;
    angleY += 1.0f;
    glutPostRedisplay();
}

void display()
{
    // Wyczyszczenie buforów
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // Reset transformacji macierzy
    glLoadIdentity();

    // Ustawienie perspektywy
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    float aspect = static_cast<float>(windowWidth) / static_cast<float>(windowHeight);
    glFrustum(-aspect, aspect, -1.0, 1.0, 1.0, 100.0);

    // Ustawienie widoku
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0f, 0.0f, -3.0f);
    glRotatef(angleX, 1.0f, 0.0f, 0.0f);
    glRotatef(angleY, 0.0f, 1.0f, 0.0f);

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_LINE_SMOOTH);
    glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);

    // Ustawienie pogrubienia linii
    glLineWidth(lineThickness);

    // Rysowanie ostrosłupa wypełnionego
    if (filledCube)
    {
        glBegin(GL_TRIANGLES);

        // Podstawa
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f(-1.0f, -1.0f, -1.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);

        // Ściana przednia
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);
        glVertex3f(1.0f, -1.0f, 1.0f);

        // Ściana prawa
        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);
        glVertex3f(1.0f, -1.0f, 1.0f);
        glVertex3f(-1.0f, -1.0f, 1.0f);

        // Ściana tylna
        glColor3f(1.0f, 1.0f, 0.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);
        glVertex3f(-1.0f, -1.0f, 1.0f);
        glVertex3f(-1.0f, -1.0f, -1.0f);

        // Ściana lewa
        glColor3f(0.0f, 1.0f, 1.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);
        glVertex3f(-1.0f, -1.0f, -1.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);

        glEnd();
    }
    else
    {
        // Rysowanie ostrosłupa z samymi czerwonymi krawędziami
        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
        glColor3f(1.0f, 0.0f, 0.0f);

        glBegin(GL_TRIANGLES);

        // Podstawa
        glVertex3f(-1.0f, -1.0f, -1.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);

        // Ściana przednia
        glVertex3f(0.0f, 1.0f, 0.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);
        glVertex3f(1.0f, -1.0f, 1.0f);

        // Ściana prawa
        glVertex3f(0.0f, 1.0f, 0.0f);
        glVertex3f(1.0f, -1.0f, 1.0f);
        glVertex3f(-1.0f, -1.0f, 1.0f);

        // Ściana tylna
        glVertex3f(0.0f, 1.0f, 0.0f);
        glVertex3f(-1.0f, -1.0f, 1.0f);
        glVertex3f(-1.0f, -1.0f, -1.0f);

        // Ściana lewa
        glVertex3f(0.0f, 1.0f, 0.0f);
        glVertex3f(-1.0f, -1.0f, -1.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);

        glEnd();
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    }

    if (showVertices) ///// pokazanie wierzcholkow /////
    {
        // Włączenie rysowania kropkowych wierzchołków
        glEnable(GL_POINT_SMOOTH);
        glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);

        // Ustawienie rozmiaru punktu
        glPointSize(lineThickness + 16.0f);

        glBegin(GL_POINTS);
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f(-1.0f, -1.0f, -1.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);
        glVertex3f(1.0f, -1.0f, 1.0f);
        glVertex3f(-1.0f, -1.0f, 1.0f);
        glVertex3f(-1.0f, -1.0f, -1.0f);
        glEnd();

        // Wyłączenie rysowania kropkowych wierzchołków
        glDisable(GL_POINT_SMOOTH);
    }

    if (showDiagonals)
    {
        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
        glColor3f(1.0f, 1.0f, 1.0f);
        glBegin(GL_LINES);
        glVertex3f(-1.0f, -1.0f, -1.0f);
        glVertex3f(1.0f, -1.0f, 1.0f);
        glVertex3f(-1.0f, -1.0f, 1.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);
        glVertex3f(-1.0f, -1.0f, -1.0f);
        glEnd();
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    }
    if (showHigh)
    {
        glBegin(GL_LINES);
        glColor3f(0.0f, 0.0f, 1.0f); // Ustawienie koloru linii na niebieski
        glVertex3f(0.0f, 1.0f, 0.0f); // Punkt początkowy wysokości
        glVertex3f(0.0f, -1.0f, 0.0f); // Punkt końcowy wysokości
        glEnd();
    }

    glDisable(GL_LINE_SMOOTH);
    glDisable(GL_BLEND);
    // Wyświetlenie sceny
    glutSwapBuffers();
}


void reshape(int width, int height)
{
    // Zmiana rozmiaru okna
    windowWidth = width;
    windowHeight = height;
    glViewport(0, 0, width, height);
}

void menuCallback(int option)
{
    switch (option)
    {
    case 1:
        lineThickness = 1.0f;
        break;
    case 2:
        lineThickness = 3.0f;
        break;
    case 3:
        lineThickness = 5.0f;
        break;
    case 4:
        lineThickness = 7.0f;
        break;
    case 5:
        lineThickness = 9.0f;
        break;
    case 6:
        showVertices = !showVertices;
        break;
    case 7:
        showHigh = !showHigh;
        break;
    case 8:
        showDiagonals = !showDiagonals;
        break;
    case 9:
        filledCube = !filledCube;
        break;
    case 10:
        if (!showDiagonals)
        {
            showDiagonals = !showDiagonals;
        }
        if (!showHigh)
        {
            showHigh = !showHigh;
        }
        if (!showVertices)
        {
            showVertices = !showVertices;
        }
        break;
    case 11:
        showVertices = false;
        showDiagonals = false;
        showHigh = false;
        filledCube = false;
        lineThickness = 1.0f;
        break;
    default:
        break;
    }

    glutPostRedisplay();
}

void mouse(int button, int state, int x, int y)
{
    // Obsługa wciśnięcia lewego przycisku myszy
    if (button == GLUT_LEFT_BUTTON)
    {
        leftButtonPressed = (state == GLUT_DOWN);
        mousePosX = x;
        mousePosY = y;
    }
    // Obsługa wyświetlania menu przy wciśnięciu prawego przycisku myszy
    else if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
    {
        // Utworzenie menu
        int menu = glutCreateMenu(menuCallback);

        // Dodanie opcji do menu - zmiana grubości linii
        glutAddMenuEntry("ThicknessLine - 1", 1);
        glutAddMenuEntry("ThicknessLine - 2", 2);
        glutAddMenuEntry("ThicknessLine - 3", 3);
        glutAddMenuEntry("ThicknessLine - 4", 4);
        glutAddMenuEntry("ThicknessLine - 5", 5);
        glutAddMenuEntry("Show Vertices", 6);
        glutAddMenuEntry("Show High", 7);
        glutAddMenuEntry("Show Diagonals", 8);
        glutAddMenuEntry("Filled", 9);
        glutAddMenuEntry("      ---- Show ALL ----", 10);
        glutAddMenuEntry("      ---- RESET ALL ----", 11);

        // Wyświetlenie menu w aktualnej pozycji myszy
        glutAttachMenu(GLUT_RIGHT_BUTTON);
        glutPostRedisplay();
    }
}

void motion(int x, int y)
{
    // Obrót sześcianu na podstawie ruchu myszki
    if (leftButtonPressed)
    {
        int dx = x - mousePosX;
        int dy = y - mousePosY;
        angleY += dx * 0.5f;
        angleX += dy * 0.5f;
        mousePosX = x;
        mousePosY = y;
        glutPostRedisplay();
    }
}

void keyboard(unsigned char key, int x, int y)
{
    // Przełączanie między wyświetlaniem sześcianu wypełnionego a sześcianu z samymi czerwonymi krawędziami
    if (key == 'f' || key == 'F')
    {
        filledCube = !filledCube;
        glutPostRedisplay();
    }
    if (key == 'v' || key == 'V')
    {
        showVertices = !showVertices;
        glutPostRedisplay();
    }
    if (key == 'h' || key == 'H')
    {
        showHigh = !showHigh;
        glutPostRedisplay();
    }
    if (key == 'r' || key == 'R')
    {
        autoRotate = !autoRotate;
        if (autoRotate)
            glutIdleFunc(rotateCube);
        else
            glutIdleFunc(nullptr);
    }
    if (key == 27) // ESC
        exit(0); // co tu mam dac ?

    // Przełączanie wyświetlania przekątnych sześcianu
    else if (key == 'd' || key == 'D')
    {
        showDiagonals = !showDiagonals;
        glutPostRedisplay();
    }
}


int main(int argc, char **argv)
{
    // Inicjalizacja biblioteki GLUT
    glutInit(&argc, argv);
    glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,GLUT_ACTION_GLUTMAINLOOP_RETURNS); //// dodalem i jest blad

    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(windowWidth, windowHeight);
    glutCreateWindow("Cube");

    // Rejestracja funkcji obsługi zdarzeń
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutKeyboardFunc(keyboard);
    ////glutSpecialFunc(specialKeys);

    // Ustawienie koloru tła
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

    // Włączenie testu głębokości
    glEnable(GL_DEPTH_TEST);

    // Inicjalizacja wygładzania krawędzi
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_LINE_SMOOTH);
    glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);

    // Uruchomienie pętli głównej
    glutMainLoop();

    return 0;
}

 

komentarz 3 czerwca 2023 przez j23 Mędrzec (194,920 p.)

Szczerze mówiąc nie wiem, skąd ten błąd o niezainicjowanej bibliotece, skoro glutInit wywoływana jest linię wyżej. Dziwne...

    exit(0); // co tu mam dac ?

To, co masz na samym początku, czyli wywołanie glutDestroyWindow.

komentarz 3 czerwca 2023 przez piotr_domanski Bywalec (2,080 p.)

Dobra, mam inny pomysł z wątkami thread

mam taki kod:

#include <iostream>
#include <conio.h>
#include <thread>
#include <GL/freeglut.h>

using namespace std;
const double M_PI = 3.14159265358979323846; // Definicja stałej M_PI

// Wymiary okna
int windowWidth = 800;
int windowHeight = 600;

// Kąty obrotu
float angleX = 0.0f;
float angleY = 0.0f;

// Pozycja myszki
int mousePosX = 0;
int mousePosY = 0;

// Flaga wciśnięcia lewego przycisku myszy
bool leftButtonPressed = false;

bool showVertices = false;

// Flaga wskazująca, czy wyświetlać sześcian wypełniony
bool filledCube = false;

bool showDiagonals = false;

// Grubość linii
float lineThickness = 1.0f;

bool autoRotate = false;
bool showHigh = false;
bool showAngles = false;

void rotateCube()
{
    // Automatyczny obrót sześcianu
    angleX += 1.0f;
    angleY += 1.0f;
    glutPostRedisplay();
}

void display()
{
    // Wyczyszczenie buforów
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // Reset transformacji macierzy
    glLoadIdentity();

    // Ustawienie perspektywy
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    float aspect = static_cast<float>(windowWidth) / static_cast<float>(windowHeight);
    glFrustum(-aspect, aspect, -1.0, 1.0, 1.0, 100.0);

    // Ustawienie widoku
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0f, 0.0f, -3.0f);
    glRotatef(angleX, 1.0f, 0.0f, 0.0f);
    glRotatef(angleY, 0.0f, 1.0f, 0.0f);

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_LINE_SMOOTH);
    glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);

    // Ustawienie pogrubienia linii
    glLineWidth(lineThickness);

    // Rysowanie ostrosłupa wypełnionego
    if (filledCube)
    {
        glBegin(GL_TRIANGLES);

        // Podstawa
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f(-1.0f, -1.0f, -1.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);

        // Ściana przednia
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);
        glVertex3f(1.0f, -1.0f, 1.0f);

        // Ściana prawa
        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);
        glVertex3f(1.0f, -1.0f, 1.0f);
        glVertex3f(-1.0f, -1.0f, 1.0f);

        // Ściana tylna
        glColor3f(1.0f, 1.0f, 0.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);
        glVertex3f(-1.0f, -1.0f, 1.0f);
        glVertex3f(-1.0f, -1.0f, -1.0f);

        // Ściana lewa
        glColor3f(0.0f, 1.0f, 1.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);
        glVertex3f(-1.0f, -1.0f, -1.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);

        glEnd();
    }
    else
    {
        // Rysowanie ostrosłupa z samymi czerwonymi krawędziami
        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
        glColor3f(1.0f, 0.0f, 0.0f);

        glBegin(GL_TRIANGLES);

        // Podstawa
        glVertex3f(-1.0f, -1.0f, -1.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);

        // Ściana przednia
        glVertex3f(0.0f, 1.0f, 0.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);
        glVertex3f(1.0f, -1.0f, 1.0f);

        // Ściana prawa
        glVertex3f(0.0f, 1.0f, 0.0f);
        glVertex3f(1.0f, -1.0f, 1.0f);
        glVertex3f(-1.0f, -1.0f, 1.0f);

        // Ściana tylna
        glVertex3f(0.0f, 1.0f, 0.0f);
        glVertex3f(-1.0f, -1.0f, 1.0f);
        glVertex3f(-1.0f, -1.0f, -1.0f);

        // Ściana lewa
        glVertex3f(0.0f, 1.0f, 0.0f);
        glVertex3f(-1.0f, -1.0f, -1.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);

        glEnd();
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    }

    if (showVertices) ///// pokazanie wierzcholkow /////
    {
        // Włączenie rysowania kropkowych wierzchołków
        glEnable(GL_POINT_SMOOTH);
        glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);

        // Ustawienie rozmiaru punktu
        glPointSize(lineThickness + 16.0f);

        glBegin(GL_POINTS);
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f(-1.0f, -1.0f, -1.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);
        glVertex3f(1.0f, -1.0f, 1.0f);
        glVertex3f(-1.0f, -1.0f, 1.0f);
        glVertex3f(-1.0f, -1.0f, -1.0f);
        glEnd();

        // Wyłączenie rysowania kropkowych wierzchołków
        glDisable(GL_POINT_SMOOTH);
    }

    if (showDiagonals)
    {
        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
        glColor3f(1.0f, 1.0f, 1.0f);
        glBegin(GL_LINES);
        glVertex3f(-1.0f, -1.0f, -1.0f);
        glVertex3f(1.0f, -1.0f, 1.0f);
        glVertex3f(-1.0f, -1.0f, 1.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);
        glVertex3f(-1.0f, -1.0f, -1.0f);
        glEnd();
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    }
    if (showHigh)
    {
        glBegin(GL_LINES);
        glColor3f(0.0f, 0.0f, 1.0f); // Ustawienie koloru linii na niebieski
        glVertex3f(0.0f, 1.0f, 0.0f); // Punkt początkowy wysokości
        glVertex3f(0.0f, -1.0f, 0.0f); // Punkt końcowy wysokości
        glEnd();
    }

    glDisable(GL_LINE_SMOOTH);
    glDisable(GL_BLEND);
    // Wyświetlenie sceny
    glutSwapBuffers();
}


void reshape(int width, int height)
{
    // Zmiana rozmiaru okna
    windowWidth = width;
    windowHeight = height;
    glViewport(0, 0, width, height);
}

void menuCallback(int option)
{
    switch (option)
    {
    case 1:
        lineThickness = 1.0f;
        break;
    case 2:
        lineThickness = 3.0f;
        break;
    case 3:
        lineThickness = 5.0f;
        break;
    case 4:
        lineThickness = 7.0f;
        break;
    case 5:
        lineThickness = 9.0f;
        break;
    case 6:
        showVertices = !showVertices;
        break;
    case 7:
        showHigh = !showHigh;
        break;
    case 8:
        showDiagonals = !showDiagonals;
        break;
    case 9:
        filledCube = !filledCube;
        break;
    case 10:
        if (!showDiagonals)
        {
            showDiagonals = !showDiagonals;
        }
        if (!showHigh)
        {
            showHigh = !showHigh;
        }
        if (!showVertices)
        {
            showVertices = !showVertices;
        }
        break;
    case 11:
        showVertices = false;
        showDiagonals = false;
        showHigh = false;
        filledCube = false;
        lineThickness = 1.0f;
        break;
    default:
        break;
    }

    glutPostRedisplay();
}

void mouse(int button, int state, int x, int y)
{
    // Obsługa wciśnięcia lewego przycisku myszy
    if (button == GLUT_LEFT_BUTTON)
    {
        leftButtonPressed = (state == GLUT_DOWN);
        mousePosX = x;
        mousePosY = y;
    }
    // Obsługa wyświetlania menu przy wciśnięciu prawego przycisku myszy
    else if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
    {
        // Utworzenie menu
        int menu = glutCreateMenu(menuCallback);

        // Dodanie opcji do menu - zmiana grubości linii
        glutAddMenuEntry("ThicknessLine - 1", 1);
        glutAddMenuEntry("ThicknessLine - 2", 2);
        glutAddMenuEntry("ThicknessLine - 3", 3);
        glutAddMenuEntry("ThicknessLine - 4", 4);
        glutAddMenuEntry("ThicknessLine - 5", 5);
        glutAddMenuEntry("Show Vertices", 6);
        glutAddMenuEntry("Show High", 7);
        glutAddMenuEntry("Show Diagonals", 8);
        glutAddMenuEntry("Filled", 9);
        glutAddMenuEntry("      ---- Show ALL ----", 10);
        glutAddMenuEntry("      ---- RESET ALL ----", 11);

        // Wyświetlenie menu w aktualnej pozycji myszy
        glutAttachMenu(GLUT_RIGHT_BUTTON);
        glutPostRedisplay();
    }
}

void motion(int x, int y)
{
    // Obrót sześcianu na podstawie ruchu myszki
    if (leftButtonPressed)
    {
        int dx = x - mousePosX;
        int dy = y - mousePosY;
        angleY += dx * 0.5f;
        angleX += dy * 0.5f;
        mousePosX = x;
        mousePosY = y;
        glutPostRedisplay();
    }
}

void keyboard(unsigned char key, int x, int y)
{
    // Przełączanie między wyświetlaniem sześcianu wypełnionego a sześcianu z samymi czerwonymi krawędziami
    if (key == 'f' || key == 'F')
    {
        filledCube = !filledCube;
        glutPostRedisplay();
    }
    if (key == 'v' || key == 'V')
    {
        showVertices = !showVertices;
        glutPostRedisplay();
    }
    if (key == 'h' || key == 'H')
    {
        showHigh = !showHigh;
        glutPostRedisplay();
    }
    if (key == 'r' || key == 'R')
    {
        autoRotate = !autoRotate;
        if (autoRotate)
            glutIdleFunc(rotateCube);
        else
            glutIdleFunc(nullptr);
    }
    if (key == 27) // ESC
        exit(0);

    // Przełączanie wyświetlania przekątnych sześcianu
    else if (key == 'd' || key == 'D')
    {
        showDiagonals = !showDiagonals;
        glutPostRedisplay();
    }
}

void OpenGLThread()
{
    int argc = 1;
    char* argv[] = { const_cast<char*>("OpenGLThread"), nullptr };
    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(windowWidth, windowHeight);
    glutCreateWindow("Cube");

    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutKeyboardFunc(keyboard);
    ////glutSpecialFunc(specialKeys);

    // Ustawienie koloru tła
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

    // Włączenie testu głębokości
    glEnable(GL_DEPTH_TEST);

    // Inicjalizacja wygładzania krawędzi
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_LINE_SMOOTH);
    glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);



    glutMainLoop();
}

int main()
{
    int liczba;
    std::thread openglThread(OpenGLThread);
start:
    system("cls");
    std::cout << "Program glowny dziala dalej..." << std::endl;
    cout << "   a:  ";
    cin >> liczba;
    cout << endl; cout << endl;
    cout << "   Wynik *2:  ";
    cout << liczba * 2;
    cout << endl;
    getch();
    goto start;

    openglThread.join();

    return 0;
}

i teraz mogę robić 2 rzeczy naraz i liczyć w programie i obracać ostrosłup. I jak zrobić tak żeby po zamknięciu okna OPEN GL program główny się nie kończył dalej można liczyć w programie.

komentarz 3 czerwca 2023 przez piotr_domanski Bywalec (2,080 p.)
dobra udało się rozwiązać problem dział wszystko. :).

Dzięki za zainteresowanie :)

Pozdrawiam.
komentarz 4 czerwca 2023 przez j23 Mędrzec (194,920 p.)

Tylko po co to goto? Daj tam pętle while(1) { ... } i będzie git

Podobne pytania

0 głosów
1 odpowiedź 278 wizyt
pytanie zadane 4 czerwca 2023 w C i C++ przez piotr_domanski Bywalec (2,080 p.)
0 głosów
3 odpowiedzi 446 wizyt
pytanie zadane 9 września 2016 w Offtop przez Bot Użytkownik (760 p.)
0 głosów
1 odpowiedź 256 wizyt
pytanie zadane 7 listopada 2016 w C i C++ przez Jakub Chomicz Początkujący (380 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...