Opengl błąd 1282 - pamięć?

0

Witam,

Od razu zaznaczę, że nie jestem zbyt doświadczony w OpenGL stąd proszę nie zrazić się kodem ;) Piszę aplikację przy pomocy OpenGL renderującą interfejs graficzny 2D w dwóch oknach. Generalnie koncepcja jest taka, że utworzyłem sobie klasę Sprite reprezentującą dowolny obiekt 2D (jej pola to współrzędne wierzchołków, współrzędne tekstury).

Stworzyłem też klasę CoknoGL która wszystkim zarządza. Klasa ta zawiera dwa statyczne vectory (std::vector) ObiektySprite oraz NazwyTekstur. Tak oto dodaję utworzone Sprite do klasy CoknoGL:

void CoknoGL::DodajSprite(Sprite sprite, const char* szTeksturaNazwa)
{
   ObiektySprite.push_back(sprite);
   NazwyTekstur.push_back(szTexturaNazwa);
}

Dodawanie obiektów w funkcji WinMain ("n" po prostu nie wczyta żadnej tekstury):

        Sprite frame(0.0, 0.0, 0.0, 0.0, 572.0, 574.0);                     //0

    Sprite main_menu(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);               //1
    Sprite submenu_blank(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);           //2
    Sprite submenu_reset(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);           //3
    Sprite submenu_sms(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);             //4
    Sprite submenu_hsd(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);             //5
    Sprite submenu_dte(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);             //6
    Sprite submenu_test(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);            //7
    Sprite submenu_flcs(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);            //8
    Sprite submenu_flir(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);            //9
    Sprite submenu_tfr(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);             //10
    Sprite submenu_wpn(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);             //11
    Sprite submenu_tgp(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);             //12
    Sprite submenu_fcr(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);             //13

    Sprite napis_fcr_i(0.0, 0.0, 0.0, 0.0, 400.0, 400.0);           //13
    Sprite napis_fcr(332.0, 86.0, 8.0, 88.0, 60.0, 26.0);               //14
    Sprite napis_blank_i(0.0, 0.0, 0.0, 0.0, 400.0, 400.0);         //15
    Sprite napis_blank(332.0, 86.0, 200.0, 212.0, 60.0, 26.0);          //16
    Sprite napis_had_i(0.0, 0.0, 0.0, 0.0, 400.0, 400.0);           //17
    Sprite napis_had(336.0, 85.0, 134.0, 12.0, 38.0, 26.0);             //18
    Sprite napis_sms_i(0.0, 0.0, 0.0, 0.0, 400.0, 400.0);           //19
    Sprite napis_sms(332.0, 83.0, 384.0, 90.0, 60.0, 26.0);             //20
    Sprite napis_hsd_i(0.0, 0.0, 0.0, 0.0, 400.0, 400.0);               //21
    Sprite napis_hsd(332.0, 81.0, 384.0, 156.0, 60.0, 26.0);                //22
    Sprite napis_dte_i(0.0, 0.0, 0.0, 0.0, 400.0, 400.0);               //23
    Sprite napis_dte(332.0, 83.0, 384.0, 220.0, 60.0, 26.0);                //24
    Sprite napis_test_i(0.0, 0.0, 0.0, 0.0, 400.0, 400.0);              //25
    Sprite napis_test(328.0, 82.0, 372.0, 286.0, 60.0, 26.0);           //26
    Sprite napis_flcs_i(0.0, 0.0, 0.0, 0.0, 400.0, 400.0);              //27
    Sprite napis_flcs(328.0, 84.0, 372.0, 348.0, 60.0, 26.0);           //28
    Sprite napis_flir_i(332.0, 86.0, 134.0, 12.0, 60.0, 26.0);              //29
    Sprite napis_flir(332.0, 86.0, 134.0, 12.0, 60.0, 26.0);                //30
    Sprite napis_tfr_i(332.0, 86.0, 134.0, 12.0, 60.0, 26.0);               //31
    Sprite napis_tfr(332.0, 86.0, 134.0, 12.0, 60.0, 26.0);             //32
    Sprite napis_wpn_i(332.0, 86.0, 134.0, 12.0, 60.0, 26.0);               //33
    Sprite napis_wpn(332.0, 86.0, 134.0, 12.0, 60.0, 26.0);             //34
    Sprite napis_tgp_i(332.0, 86.0, 134.0, 12.0, 60.0, 26.0);               //35
    Sprite napis_tgp(332.0, 86.0, 134.0, 12.0, 60.0, 26.0);             //36

    Sprite submenu_hsd_rings(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);
    Sprite submenu_hsd_aircraft(265.0, 164.0, 0.0, 510.0, 40.0, 60.0);
    Sprite submenu_hsd_rings2(73.0, 70.0, 0.0, 0.0, 434.0, 433.0);
    Sprite submenu_hsd_rings3(70.0, -10.0, 0.0, 0.0, 434.0, 433.0);       // 33
    Sprite submenu_hsd_waypoints(-11.0, -13.0, 50.0, 510.0, 18.0, 60.0);
    Sprite submenu_hsd_240(81.0, 388.0, 107, 501.0, 35.0, 18.0); //34
    Sprite submenu_hsd_120(81.0, 388.0, 107, 519.0, 35.0, 18.0);
    Sprite submenu_hsd_60(81.0, 388.0, 107, 538.0, 35.0, 18.0);
    Sprite submenu_hsd_30(81.0, 388.0, 149, 501.0, 35.0, 18.0);
    Sprite submenu_hsd_15(81.0, 388.0, 149, 520.0, 35.0, 18.0);  //38
    Sprite submenu_hsd_8(81.0, 388.0, 149, 538.0, 35.0, 18.0);  //39

    Sprite submenu_sms_wpn(0.0, 0.0, 0.0, 0.0, 88.0, 18.0);
    Sprite submenu_sms_wpn2(0.0, 0.0, 0.0, 20.0, 88.0, 18.0);
    Sprite submenu_sms_wpn3(0.0, 0.0, 0.0, 37.0, 88.0, 18.0);
    Sprite submenu_sms_wpn4(0.0, 0.0, 0.0, 54.0, 88.0, 18.0);
    Sprite submenu_sms_wpn5(0.0, 0.0, 0.0, 71.0, 88.0, 18.0); 
    Sprite submenu_sms_wpn6(0.0, 0.0, 0.0, 218, 88.0, 18.0);
    Sprite submenu_sms_wpn7(0.0, 0.0, 0.0, 236, 88.0, 18.0);
    Sprite submenu_sms_wpn8(0.0, 0.0, 0.0, 255, 88.0, 18.0);
    Sprite submenu_sms_wpn9(0.0, 0.0, 0.0, 272, 88.0, 18.0);
    Sprite submenu_sms_wpn10(0.0, 0.0, 0.0, 272, 88.0, 18.0);
    Sprite submenu_sms_wpn11(0.0, 0.0, 0.0, 307, 88.0, 18.0);
    Sprite submenu_sms_wpn12(0.0, 0.0, 0.0, 324, 88.0, 18.0);
    Sprite submenu_sms_wpn13(0.0, 0.0, 0.0, 342, 88.0, 18.0);
    Sprite submenu_sms_wpn14(0.0, 0.0, 0.0, 359, 88.0, 18.0);
    Sprite submenu_sms_wpn15(0.0, 0.0, 0.0, 376, 88.0, 18.0);
    Sprite submenu_sms_wpn16(0.0, 0.0, 0.0, 393, 88.0, 18.0);
    Sprite submenu_sms_wpn17(0.0, 0.0, 0.0, 409, 88.0, 18.0);
    Sprite submenu_sms_wpn18(0.0, 0.0, 0.0, 425, 88.0, 18.0);
    Sprite submenu_sms_wpn19(0.0, 0.0, 0.0, 444, 88.0, 18.0);

    okno1->DodajSprite(frame, "ramka.jpg");
    okno1->DodajSprite(main_menu, "main_men.jpg");
    okno1->DodajSprite(submenu_blank, "sub_blank.jpg");
    okno1->DodajSprite(submenu_reset, "sub_reset.jpg");
    okno1->DodajSprite(submenu_sms, "sub_sms.jpg");
    okno1->DodajSprite(submenu_hsd, "sub_hsd.jpg");
    okno1->DodajSprite(submenu_dte, "sub_dte.jpg");
    okno1->DodajSprite(submenu_test, "sub_test.jpg");
    okno1->DodajSprite(submenu_flcs, "sub_flcs.jpg");
    okno1->DodajSprite(submenu_flir, "n");
    okno1->DodajSprite(submenu_tfr, "n");
    okno1->DodajSprite(submenu_wpn, "n");
    okno1->DodajSprite(submenu_tgp, "n");
    okno1->DodajSprite(submenu_fcr, "n");
    okno1->DodajSprite(napis_fcr_i, "napisy_1");
    okno1->DodajSprite(napis_fcr, "n");
    okno1->DodajSprite(napis_blank_i, "n");
    okno1->DodajSprite(napis_blank, "n");
    okno1->DodajSprite(napis_had_i, "n");
    okno1->DodajSprite(napis_had, "n");
    okno1->DodajSprite(napis_sms_i, "n");
    okno1->DodajSprite(napis_sms, "n");
    okno1->DodajSprite(napis_hsd_i, "n");
    okno1->DodajSprite(napis_hsd, "n");
    okno1->DodajSprite(napis_dte_i, "n");
    okno1->DodajSprite(napis_dte, "n");
    okno1->DodajSprite(napis_test_i, "n");
    okno1->DodajSprite(napis_test, "n");
    okno1->DodajSprite(napis_flcs_i, "sub_hsd3.jpg");
    okno1->DodajSprite(napis_flcs, "sub_hsd4.jpg");
    okno1->DodajSprite(submenu_hsd_rings, "sub_hsd2.bmp");
    okno1->DodajSprite(submenu_hsd_aircraft, "n");
    okno1->DodajSprite(submenu_hsd_rings2, "n");
    okno1->DodajSprite(submenu_hsd_rings3, "n");
    okno1->DodajSprite(submenu_hsd_240, "n");
    okno1->DodajSprite(submenu_hsd_120, "n");
    okno1->DodajSprite(submenu_hsd_60, "n");
    okno1->DodajSprite(submenu_hsd_30, "n");
    okno1->DodajSprite(submenu_hsd_15, "n");
    okno1->DodajSprite(submenu_hsd_8, "sub_hsd5.bmp");
    okno1->DodajSprite(submenu_hsd_waypoints, "sub_hsd5.jpg"); //40
    okno1->DodajSprite(submenu_sms_wpn, "sub_sms2.jpg"); //41
    okno1->DodajSprite(submenu_sms_wpn2, "n"); //42
    okno1->DodajSprite(submenu_sms_wpn3, "n"); //43
    okno1->DodajSprite(submenu_sms_wpn4, "n"); //44
    okno1->DodajSprite(submenu_sms_wpn5, "n"); //45
    okno1->DodajSprite(submenu_sms_wpn6, "n"); //46
    okno1->DodajSprite(submenu_sms_wpn7, "n"); //47
    okno1->DodajSprite(submenu_sms_wpn8, "n"); //48
    okno1->DodajSprite(submenu_sms_wpn9, "n"); //49
    okno1->DodajSprite(submenu_sms_wpn10, "n"); //49
    okno1->DodajSprite(submenu_sms_wpn11, "n"); //50

Gdy dodam wszystkie potrzebne obiekty Sprite wywołuję metody inicjalizacji dla obu okien. Tekstury z dysku wczytuję za pomocą biblioteki SOIL.

void CoknoGL::ZainicjalizujGL()
{
    PIXELFORMATDESCRIPTOR pfd;    // pixel format descriptor structure

    pfd =               // pfd Tells Windows How We Want Things To Be
    {
        sizeof(PIXELFORMATDESCRIPTOR),              // Size Of This Pixel Format Descriptor
        1,                                          // Version Number
        PFD_DRAW_TO_WINDOW |                        // Format Must Support Window
        PFD_SUPPORT_OPENGL |                        // Format Must Support OpenGL
        PFD_DOUBLEBUFFER,                           // Must Support Double Buffering
        PFD_TYPE_RGBA,                              // Request An RGBA Format
        32,                                         // Select Our Color Depth
        0, 0, 0, 0, 0, 0,                           // Color Bits Ignored
        0,                                          // No Alpha Buffer
        0,                                          // Shift Bit Ignored
        0,                                          // No Accumulation Buffer
        0, 0, 0, 0,                                 // Accumulation Bits Ignored
        16,                                         // 16Bit Z-Buffer (Depth Buffer)  
        0,                                          // No Stencil Buffer
        0,                                          // No Auxiliary Buffer
        PFD_MAIN_PLANE,                             // Main Drawing Layer
        0,                                          // Reserved
        0, 0, 0                                     // Layer Masks Ignored
    };

    hUchwytKontekstu =  GetDC(hUchwytOkna);
    GLuint PixelFormat = ChoosePixelFormat(hUchwytKontekstu, &pfd);
    SetPixelFormat(hUchwytKontekstu, PixelFormat, &pfd);
    hUchwytRendera = wglCreateContext(hUchwytKontekstu);
    wglMakeCurrent(hUchwytKontekstu, hUchwytRendera);

    if (glewInit())
        MessageBox(0, L"Brak mozliwosci zainicjowania glew!", L"Error", MB_ICONERROR);

    strVendor = (char*)glGetString(GL_VENDOR);
    strRenderer = (char*)glGetString(GL_RENDERER);
    strVersion = (char*)glGetString(GL_VERSION);

    if (strVersion[0] == '1')
    {
        OldVersion = TRUE;
    }

    glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);

    glViewport(0, 0, 572, 574);
    glClearColor(0, 0, 0, 1);
    glEnable(GL_TEXTURE_2D);
    if (OldVersion == TRUE)
    ShaderProgram = ZaladujShader("vertex_old.vers", "fragment_old.fras");
    else
    ShaderProgram = ZaladujShader("vertex.vers", "fragment.fras");

    Uniform_macierz_transf = glGetUniformLocation(ShaderProgram, "mvp");
    Uniform_textura_sampler = glGetUniformLocation(ShaderProgram, "texturesampler2d");
    Attribute_polozenie_tex = glGetAttribLocation(ShaderProgram, "textureposition");
    Attribute_polozenie_wierz = glGetAttribLocation(ShaderProgram, "vertexposition");

    ShaderProgram2 = ZaladujShader("vertexshaderlinii.sl", "shaderlinii.sl");

    Attribute_polozenie_wierz2 = glGetAttribLocation(ShaderProgram2, "vertexPosition_modelspace");
    Uniform_color = glGetUniformLocation(ShaderProgram2, "incolor");
    Uniform_macierz_transf2 = glGetUniformLocation(ShaderProgram2, "mvp2");
    Uniform_scale = glGetUniformLocation(ShaderProgram2, "scale");

    GLint liczniktablicy = ObiektySprite.size();
    glGenBuffers(liczniktablicy, &tablicabuforow[0]);
    glGenBuffers(liczniktablicy, &tablicabuforowUV[0]);

    for (int i = 0; i < ObiektySprite.size(); i++)
    {
        Sprite sobjekt = ObiektySprite[i];
        glBindBuffer(GL_ARRAY_BUFFER, tablicabuforow[i]);
        glBufferData(GL_ARRAY_BUFFER, 4 * (sobjekt.wierzcholki.size()), &sobjekt.wierzcholki[0], GL_STATIC_DRAW);

        glBindBuffer(GL_ARRAY_BUFFER, tablicabuforowUV[i]);
        glBufferData(GL_ARRAY_BUFFER, 4 * (sobjekt.wspolrzedneuv.size()), &sobjekt.wspolrzedneuv[0], GL_STATIC_DRAW);
    }

    // Generate 1 buffer, put the resulting identifier in vertexbuffer

    glGenBuffers(1, &nBuforLinii);

    // The following commands will talk about our 'vertexbuffer' buffer
    glBindBuffer(GL_ARRAY_BUFFER, nBuforLinii);

    // Give our vertices to OpenGL.
    glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);

    for (int i = 0; i < NazwyTekstur.size(); i++)
    {
        GLuint textura = SOIL_load_OGL_texture(NazwyTekstur[i], 3, SOIL_CREATE_NEW_ID, SOIL_FLAG_TEXTURE_RECTANGLE);
        Textury.push_back(textura);
    }

    macierzmvp = glm::ortho(0.0, 572.0, 0.0, 574.0);

     hUchwytMenu = LoadMenu(hUchwytInstancji, MAKEINTRESOURCE(IDR_MENU1));
     hUchwytSubMenu = GetSubMenu(hUchwytMenu, 0);

    wglMakeCurrent(NULL, NULL);
}

Wszystko byłoby pięknie i nawet do pewnego momentu działało jak trzeba ;) Problem pojawił się gdy dodam więcej jak 51 obiektów Sprite. Wówczas OpenGL renderuje mi jakąś szarą randomową część tekstury przez cały czas działania programu, po wywołaniu metod inicjalizacji wywala błąd 1282, a także podczas zamknięcia okna pojawia się wyjątek odwołania poza zakres pamięci. Gdy zmniejszę choćby o 1 ilość obiektów Sprite wszystko działa normalnie i bezbłędnie. Gdzie mogę popełniać błąd? Byłbym bardzo wdzięczny za pomoc i ewentualne wskazówki :)

1

Pokaż deklarację np. NazwyTekstur i tych innych składowych, bo trudno wywnioskować cokolwiek.

0

Sorry za taki format kodu, na koniec i tak go poprawię :) No to jedziemy kolejno:

1. CoknoGL.h

#pragma once
#include <GL\glew.h>
#include <GL\GL.h>
#include <GL\GLU.h>
#include <Windows.h>
#include <stdio.h>
#include <string>
#include <vector>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <glm.hpp>
#include <gtc\matrix_transform.hpp>
#include <SOIL.h>
#include "Coknodialog_sms.h"
#include "Cokno.h"
#include "Ckursor.h"
#include "Coknodialog.h"

enum E_STAN { MFD_MAIN, MFD_BLANK, MFD_HAD, MFD_RESET, MFD_SMS, MFD_HSD, MFD_HSD_CEN, MFD_DTE, MFD_TEST, MFD_FLCS, MFD_SWAP};

class Sprite
{
public:
    Sprite();
    Sprite(GLfloat x, GLfloat y, GLfloat u, GLfloat v, GLfloat szerokosc, GLfloat wysokosc);
    std::vector<GLfloat> wierzcholki;
    std::vector<GLfloat> wspolrzedneuv;
};

struct UVPoint
{
    UVPoint();
    GLfloat u, v;
};

class CoknoGL : public Cokno
{
public:
    CoknoGL();
    CoknoGL(E_STAN stanpoczatkowy);
    virtual ~CoknoGL();
    HGLRC hUchwytRendera;
    HDC hUchwytKontekstu;
    bool prevRESET;;
    E_STAN stan;
    E_STAN swap;
    E_STAN alfachannel;
    E_STAN betachannel;
    E_STAN gammachannel;
    int ActiveChannel;
    static float xwaypoints[20];
    static float ywaypoints[20];
    static int nCounter;
    static unsigned short usBelki[9];
    static bool bParamsLoaded;
    static bool bHsdSubmenu;
    static float nSkala;
protected:
    Ckursor kursor; 
    GLuint ShaderProgram;
    GLuint nBuffor1;
    GLuint nBuffor2;
    GLuint Attribute_polozenie_wierz;
    GLuint Attribute_polozenie_tex;
    GLuint Uniform_macierz_transf;
    GLuint Uniform_textura_sampler;
    GLuint VAO;
    GLuint nBuforLinii;
    GLuint ShaderProgram2;
    GLuint Uniform_macierz_transf2;
    GLuint Attribute_polozenie_wierz2;
    GLuint Uniform_color;
    GLuint Uniform_scale;

    glm::mat4 macierzmvp;
    HMENU hUchwytMenu, hUchwytSubMenu;
    static std::vector<Sprite> ObiektySprite;
    static std::vector<GLuint> Textury;
    static std::vector<const char*> NazwyTekstur;
    static int numerpojedynczejtekstury;
    GLuint tablicabuforow[50];
    GLuint tablicabuforowUV[50];
    GLuint ZaladujShader(const char* vertex_file_path, const char* fragment_file_path);
    void Wyczysc();
    void ZmienStan(E_KEY klawisz);

public:
    virtual LRESULT CALLBACK ProcOkna(HWND hOkno,    // Polimorficzna procedura okna - do redefinicji przez użytkownika
        UINT uMsg, WPARAM wParam, LPARAM lParam);
    void ZainicjalizujGL();
    void RenderujKlatke(GLint nStartindex, GLint nEndindex);
    void RenderujRamke(int i);
    void RenderujPojedynczyObiekt(int nIndexObiektu, int nIndexTextury);
    void RenderujPojedynczyObiekt(int nIndexObiektu, int nIndexTextury, glm::mat4 macierztr);
    void WypelnijBuffor();
    void RenderujLinie(glm::mat4 macierz, glm::vec3 color, int start, int end,
        glm::vec3 skala);
    void OproznijBufor() {
        wglMakeCurrent(hUchwytKontekstu, hUchwytRendera);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        wglMakeCurrent(NULL, NULL);
    }
    void ZamienBufor() {
        wglMakeCurrent(hUchwytKontekstu, hUchwytRendera);
        SwapBuffers(hUchwytKontekstu);
        wglMakeCurrent(NULL, NULL);
    }
    void WlaczMieszanie(GLboolean enable) {
        wglMakeCurrent(hUchwytKontekstu, hUchwytRendera);
        if (enable)
        {
            glEnable(GL_BLEND);
        }
        else
        {
            glDisable(GL_BLEND);
        }
        wglMakeCurrent(NULL, NULL);
    }
    static void DodajSprite(Sprite sprite, const char* szTexturaNazwa);
    static void DodajSprite(Sprite sprite, int nNumerTextury);
    static bool TakieSamoMenu;
    bool OldVersion;
    std::string strVendor, strRenderer, strVersion;
    // An array of 3 vectors which represents 3 vertices
    static GLfloat g_vertex_buffer_data[600]; 

};
  1. CoknoGL.cpp
#include "CoknoGL.h"

 GLfloat CoknoGL::g_vertex_buffer_data[600] = {
    0.0f, 0.0f,
    0.0f, 0.0f,
    0.0f, 0.0f,
    0.0f, 0.0f,
    0.0f, 0.0f,
    0.0f, 0.0f,
    0.0f, 0.0f,
    0.0f, 0.0f,
    0.0f, 0.0f,
    0.0f, 0.0f,
    0.0f, 0.0f,
    0.0f, 0.0f,
    0.0f, 0.0f,
    0.0f, 0.0f,
    0.0f, 0.0f,
    0.0f, 0.0f,
    0.0f, 0.0f,
    0.0f, 0.0f,
    0.0f, 0.0f,
    0.0f, 0.0f,
    278.0f, 287.0f,  //20
    0.0f, 0.0f,
    -278.0f, 287.0f,
    -278.0f, 287.0f,
    278.0f, 287.0f,
};

std::vector<Sprite> CoknoGL::ObiektySprite;
std::vector<GLuint> CoknoGL::Textury;
float CoknoGL::xwaypoints[20] = { 0.0f };
float CoknoGL::ywaypoints[20] = { 0.0f };
unsigned short CoknoGL::usBelki[9] = { 0 };
int CoknoGL::nCounter = -1;
bool CoknoGL::bParamsLoaded = FALSE;
bool CoknoGL::bHsdSubmenu = FALSE;
float CoknoGL::nSkala = 1;
std::vector<const char*> CoknoGL::NazwyTekstur;

bool CoknoGL::TakieSamoMenu = false;

CoknoGL::CoknoGL()
{

}

CoknoGL::CoknoGL(E_STAN stanpoczatkowy) : stan(stanpoczatkowy), alfachannel(MFD_SMS), betachannel(MFD_BLANK),
gammachannel(MFD_TEST), ActiveChannel(1), prevRESET(FALSE), OldVersion(FALSE)
{

}

CoknoGL::~CoknoGL()
{

}

LRESULT CALLBACK CoknoGL::ProcOkna(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam)
{
    static HCURSOR cursor = NULL;
    static Coknodialog dialog_hsd;
    static Coknodialog_sms dialog_sms;
    E_KEY klawisz;
    RECT rect;

    switch (umsg)
    {
    case WM_LBUTTONUP:
        wglMakeCurrent(hUchwytKontekstu, hUchwytRendera);
        SetCursor(cursor);
        klawisz = kursor.IsCursorOnKey(lparam);
        ZmienStan(klawisz);
        SetFocus(hwnd);
        wglMakeCurrent(NULL, NULL);
        break;
    case WM_LBUTTONDOWN:
        SetCursor(cursor);
        break;
    case WM_RBUTTONDOWN:
        GetWindowRect(hwnd, &rect);
        TrackPopupMenu(
            hUchwytSubMenu,
            TPM_LEFTALIGN | TPM_TOPALIGN,
            rect.left +LOWORD(lparam),
            rect.top +HIWORD(lparam),
            0,
            hUchwytOkna,
            0);
        break;
    case WM_MOUSEMOVE:
        klawisz = kursor.IsCursorOnKey(lparam);
        kursor.ChangeCursor(klawisz);
        cursor = GetCursor();
        break;
    case WM_COMMAND:
        if (LOWORD(wparam) == ID_PODMENU1_HSDPARAMETRS)
        {
            dialog_hsd.OtworzOkno(IDD_DIALOG1, hwnd);
            for (int i = 0; i < 20; i++)
            {
                xwaypoints[i] = dialog_hsd.xwaypoints[i];
                ywaypoints[i] = dialog_hsd.ywaypoints[i];
            }
            nCounter = dialog_hsd.nIndex;
            dialog_hsd.nIndex = 0;
            ZeroMemory(&dialog_hsd.xwaypoints[0], sizeof(float) * 14);
            ZeroMemory(&dialog_hsd.ywaypoints[0], sizeof(float) * 14);
        }
        if (LOWORD(wparam) == ID_PODMENU1_SMSPARAMETERS)
        {
            dialog_sms.OtworzOkno(IDD_DIALOG3, hwnd);
            for (int i = 0; i < 9; i++)
            {
                usBelki[i] = dialog_sms.usBelki[i];
            }
            ZeroMemory(&dialog_sms.usBelki[0], sizeof(unsigned short) * 9);
        }
        if (LOWORD(wparam) == ID_PODMENU1_INTERFEJSGRAFICZNY)
        {
            std::string strImplementacjaOGL = "Implementacja OpenGL na tym komputerze:\n\n";
            strImplementacjaOGL += "1.Producent sprzętu graficznego: ";
            strImplementacjaOGL += strVendor;
            strImplementacjaOGL += "\n";
            strImplementacjaOGL += "2.Sprzęt graficzny: ";
            strImplementacjaOGL += strRenderer;
            strImplementacjaOGL += "\n";
            strImplementacjaOGL += "3.Wersja OpenGL: ";
            strImplementacjaOGL += strVersion;
            strImplementacjaOGL += "\n";
            MessageBoxA(hwnd, strImplementacjaOGL.c_str(), "Interfejs graficzny", MB_OK);
        }
        break;
    case WM_QUIT:
        MessageBox(0, L"Opuścić program?", L"Wyjście", MB_YESNO);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, umsg, wparam, lparam);
        break;
    }
}

void CoknoGL::ZainicjalizujGL()
{
    PIXELFORMATDESCRIPTOR pfd;    // pixel format descriptor structure

    pfd =               // pfd Tells Windows How We Want Things To Be
    {
        sizeof(PIXELFORMATDESCRIPTOR),              // Size Of This Pixel Format Descriptor
        1,                                          // Version Number
        PFD_DRAW_TO_WINDOW |                        // Format Must Support Window
        PFD_SUPPORT_OPENGL |                        // Format Must Support OpenGL
        PFD_DOUBLEBUFFER,                           // Must Support Double Buffering
        PFD_TYPE_RGBA,                              // Request An RGBA Format
        32,                                         // Select Our Color Depth
        0, 0, 0, 0, 0, 0,                           // Color Bits Ignored
        0,                                          // No Alpha Buffer
        0,                                          // Shift Bit Ignored
        0,                                          // No Accumulation Buffer
        0, 0, 0, 0,                                 // Accumulation Bits Ignored
        16,                                         // 16Bit Z-Buffer (Depth Buffer)  
        0,                                          // No Stencil Buffer
        0,                                          // No Auxiliary Buffer
        PFD_MAIN_PLANE,                             // Main Drawing Layer
        0,                                          // Reserved
        0, 0, 0                                     // Layer Masks Ignored
    };

    hUchwytKontekstu =  GetDC(hUchwytOkna);
    GLuint PixelFormat = ChoosePixelFormat(hUchwytKontekstu, &pfd);
    SetPixelFormat(hUchwytKontekstu, PixelFormat, &pfd);
    hUchwytRendera = wglCreateContext(hUchwytKontekstu);
    wglMakeCurrent(hUchwytKontekstu, hUchwytRendera);

    if (glewInit())
        MessageBox(0, L"Brak mozliwosci zainicjowania glew!", L"Error", MB_ICONERROR);

    strVendor = (char*)glGetString(GL_VENDOR);
    strRenderer = (char*)glGetString(GL_RENDERER);
    strVersion = (char*)glGetString(GL_VERSION);

    if (strVersion[0] == '1')
    {
        OldVersion = TRUE;
    }

    glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);

    glViewport(0, 0, 572, 574);
    glClearColor(0, 0, 0, 1);
    glEnable(GL_TEXTURE_2D);
    if (OldVersion == TRUE)
    ShaderProgram = ZaladujShader("vertex_old.vers", "fragment_old.fras");
    else
    ShaderProgram = ZaladujShader("vertex.vers", "fragment.fras");

    Uniform_macierz_transf = glGetUniformLocation(ShaderProgram, "mvp");
    Uniform_textura_sampler = glGetUniformLocation(ShaderProgram, "texturesampler2d");
    Attribute_polozenie_tex = glGetAttribLocation(ShaderProgram, "textureposition");
    Attribute_polozenie_wierz = glGetAttribLocation(ShaderProgram, "vertexposition");

    ShaderProgram2 = ZaladujShader("vertexshaderlinii.sl", "shaderlinii.sl");

    Attribute_polozenie_wierz2 = glGetAttribLocation(ShaderProgram2, "vertexPosition_modelspace");
    Uniform_color = glGetUniformLocation(ShaderProgram2, "incolor");
    Uniform_macierz_transf2 = glGetUniformLocation(ShaderProgram2, "mvp2");
    Uniform_scale = glGetUniformLocation(ShaderProgram2, "scale");

    GLint liczniktablicy = ObiektySprite.size();
    glGenBuffers(liczniktablicy, &tablicabuforow[0]);
    glGenBuffers(liczniktablicy, &tablicabuforowUV[0]);

    for (int i = 0; i < ObiektySprite.size(); i++)
    {
        Sprite sobjekt = ObiektySprite[i];
        glBindBuffer(GL_ARRAY_BUFFER, tablicabuforow[i]);
        glBufferData(GL_ARRAY_BUFFER, 4 * (sobjekt.wierzcholki.size()), &sobjekt.wierzcholki[0], GL_STATIC_DRAW);

        glBindBuffer(GL_ARRAY_BUFFER, tablicabuforowUV[i]);
        glBufferData(GL_ARRAY_BUFFER, 4 * (sobjekt.wspolrzedneuv.size()), &sobjekt.wspolrzedneuv[0], GL_STATIC_DRAW);
    }

    // Generate 1 buffer, put the resulting identifier in vertexbuffer

    glGenBuffers(1, &nBuforLinii);

    // The following commands will talk about our 'vertexbuffer' buffer
    glBindBuffer(GL_ARRAY_BUFFER, nBuforLinii);

    // Give our vertices to OpenGL.
    glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);

    for (int i = 0; i < NazwyTekstur.size(); i++)
    {
        GLuint textura = SOIL_load_OGL_texture(NazwyTekstur[i], 3, SOIL_CREATE_NEW_ID, SOIL_FLAG_TEXTURE_RECTANGLE);
        Textury.push_back(textura);
    }

    macierzmvp = glm::mat4(1.0f);
    macierzmvp = glm::ortho(0.0, 572.0, 0.0, 574.0);

     hUchwytMenu = LoadMenu(hUchwytInstancji, MAKEINTRESOURCE(IDR_MENU1));
     hUchwytSubMenu = GetSubMenu(hUchwytMenu, 0);

    wglMakeCurrent(NULL, NULL);
}

void CoknoGL::RenderujKlatke(GLint nStartindex, GLint nEndindex)
{
    wglMakeCurrent(hUchwytKontekstu, hUchwytRendera);
    glUseProgram(ShaderProgram);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glUniformMatrix4fv(Uniform_macierz_transf, 1, GL_FALSE, &macierzmvp[0][0]);
    glActiveTexture(GL_TEXTURE0);
    glUniform1i(Uniform_textura_sampler, 0);

    for (int i = nStartindex; i < nEndindex; i++)
    {
        glBindTexture(GL_TEXTURE_RECTANGLE, Textury[i]);

        // 1rst attribute buffer : vertices
        glEnableVertexAttribArray(Attribute_polozenie_wierz);
        glBindBuffer(GL_ARRAY_BUFFER, tablicabuforow[i]);
        glVertexAttribPointer(
            Attribute_polozenie_wierz,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
            3,                  // size
            GL_FLOAT,           // type
            GL_FALSE,           // normalized?
            0,                  // stride
            (void*)0            // array buffer offset
            );

        glEnableVertexAttribArray(Attribute_polozenie_tex);
        glBindBuffer(GL_ARRAY_BUFFER, tablicabuforowUV[i]);
        glVertexAttribPointer(
            Attribute_polozenie_tex,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
            2,                  // size
            GL_FLOAT,           // type
            GL_FALSE,           // normalized?
            0,                  // stride
            (void*)0            // array buffer offset
            );

        // Draw the triangle !
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // 3 indices starting at 0 -> 1 triangle
        glDisable(GL_BLEND);
        glDisableVertexAttribArray(Attribute_polozenie_wierz);
        glDisableVertexAttribArray(Attribute_polozenie_tex);

    }

    wglMakeCurrent(NULL, NULL);
}

GLuint CoknoGL::ZaladujShader(const char * vertex_file_path, const char * fragment_file_path)
{
    // Create the shaders
    GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
    GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);

    // Read the Vertex Shader code from the file
    std::string VertexShaderCode;
    std::ifstream VertexShaderStream(vertex_file_path, std::ios::in);
    if (VertexShaderStream.is_open()){
        std::string Line = "";
        while (getline(VertexShaderStream, Line))
            VertexShaderCode += "\n" + Line;
        VertexShaderStream.close();
    }
    else{
         MessageBox(0,L"Impossible to open %s. Are you in the right directory ? Don't forget to read the FAQ !\n",L"Error", MB_OK);
        PostQuitMessage(-1);
        return 0;
    }

    // Read the Fragment Shader code from the file
    std::string FragmentShaderCode;
    std::ifstream FragmentShaderStream(fragment_file_path, std::ios::in);
    if (FragmentShaderStream.is_open()){
        std::string Line = "";
        while (getline(FragmentShaderStream, Line))
            FragmentShaderCode += "\n" + Line;
        FragmentShaderStream.close();
    }

    GLint Result = GL_FALSE;
    int InfoLogLength;

    // Compile Vertex Shader
    char const * VertexSourcePointer = VertexShaderCode.c_str();
    glShaderSource(VertexShaderID, 1, &VertexSourcePointer, NULL);
    glCompileShader(VertexShaderID);

    // Check Vertex Shader
    glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
    glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
    if (InfoLogLength > 0){
        std::vector<char> VertexShaderErrorMessage(InfoLogLength + 1);
        glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]);
    //MessageBoxA(0, &VertexShaderErrorMessage[0], "Error - ver shad", MB_OK);
    }

    // Compile Fragment Shader
    char const * FragmentSourcePointer = FragmentShaderCode.c_str();
    glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer, NULL);
    glCompileShader(FragmentShaderID);

    // Check Fragment Shader
    glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result);
    glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
    if (InfoLogLength > 0){
        std::vector<char> FragmentShaderErrorMessage(InfoLogLength + 1);
        glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]);
     //MessageBoxA(0, &FragmentShaderErrorMessage[0], "Error - fra shad", MB_OK);
    }

    // Link the program
    GLuint ProgramID = glCreateProgram();
    glAttachShader(ProgramID, VertexShaderID);
    glAttachShader(ProgramID, FragmentShaderID);
    glLinkProgram(ProgramID);

    // Check the program
    glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);
    glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);
    if (InfoLogLength > 0){
        std::vector<char> ProgramErrorMessage(InfoLogLength + 1);
        glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]);
        //MessageBoxA(0, &ProgramErrorMessage[0], "Error - fra shad", MB_OK);
    }

    glDeleteShader(VertexShaderID);
    glDeleteShader(FragmentShaderID);

    return ProgramID;
}

void CoknoGL::Wyczysc()
{
    wglMakeCurrent(hUchwytKontekstu, hUchwytRendera);
    glDeleteProgram(ShaderProgram);

    wglMakeCurrent(NULL, NULL);

}

void CoknoGL::RenderujRamke(int i)
{

    wglMakeCurrent(hUchwytKontekstu, hUchwytRendera);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glUseProgram(ShaderProgram);

    glUniformMatrix4fv(Uniform_macierz_transf, 1, GL_FALSE, &macierzmvp[0][0]);
    glActiveTexture(GL_TEXTURE0);
    glUniform1i(Uniform_textura_sampler, 0);

    glBindTexture(GL_TEXTURE_RECTANGLE, Textury[i]);

    // 1rst attribute buffer : vertices
    glEnableVertexAttribArray(Attribute_polozenie_wierz);
    glBindBuffer(GL_ARRAY_BUFFER, tablicabuforow[i]);
    glVertexAttribPointer(
        Attribute_polozenie_wierz,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
        3,                  // size
        GL_FLOAT,           // type
        GL_FALSE,           // normalized?
        0,                  // stride
        (void*)0            // array buffer offset
        );

    glEnableVertexAttribArray(Attribute_polozenie_tex);
    glBindBuffer(GL_ARRAY_BUFFER, tablicabuforowUV[i]);
    glVertexAttribPointer(
        Attribute_polozenie_tex,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
        2,                  // size
        GL_FLOAT,           // type
        GL_FALSE,           // normalized?
        0,                  // stride
        (void*)0            // array buffer offset
        );

    // Draw the triangle !
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // 3 indices starting at 0 -> 1 triangle

    glDisableVertexAttribArray(Attribute_polozenie_wierz);
    glDisableVertexAttribArray(Attribute_polozenie_tex);
    glDisable(GL_BLEND);
    wglMakeCurrent(NULL, NULL);
}

void CoknoGL::RenderujPojedynczyObiekt(int nIndexObiektu, int nIndexTextury, glm::mat4 macierztr)
{
    wglMakeCurrent(hUchwytKontekstu, hUchwytRendera);
    glUseProgram(ShaderProgram);

    glUniformMatrix4fv(Uniform_macierz_transf, 1, GL_FALSE, &macierztr[0][0]);
    glActiveTexture(GL_TEXTURE0);
    glUniform1i(Uniform_textura_sampler, 0);

    glBindTexture(GL_TEXTURE_RECTANGLE, Textury[nIndexTextury]);

    // 1rst attribute buffer : vertices
    glEnableVertexAttribArray(Attribute_polozenie_wierz);
    glBindBuffer(GL_ARRAY_BUFFER, tablicabuforow[nIndexObiektu]);
    glVertexAttribPointer(
        Attribute_polozenie_wierz,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
        3,                  // size
        GL_FLOAT,           // type
        GL_FALSE,           // normalized?
        0,                  // stride
        (void*)0            // array buffer offset
        );

    glEnableVertexAttribArray(Attribute_polozenie_tex);
    glBindBuffer(GL_ARRAY_BUFFER, tablicabuforowUV[nIndexObiektu]);
    glVertexAttribPointer(
        Attribute_polozenie_tex,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
        2,                  // size
        GL_FLOAT,           // type
        GL_FALSE,           // normalized?
        0,                  // stride
        (void*)0            // array buffer offset
        );

    // Draw the triangle !
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // 3 indices starting at 0 -> 1 triangle

    glDisableVertexAttribArray(Attribute_polozenie_wierz);
    glDisableVertexAttribArray(Attribute_polozenie_tex);
    wglMakeCurrent(NULL, NULL);
}

void CoknoGL::RenderujPojedynczyObiekt(int nIndexObiektu, int nIndexTextury)
{
    wglMakeCurrent(hUchwytKontekstu, hUchwytRendera);
    glUseProgram(ShaderProgram);

    glUniformMatrix4fv(Uniform_macierz_transf, 1, GL_FALSE, &macierzmvp[0][0]);
    glActiveTexture(GL_TEXTURE0);
    glUniform1i(Uniform_textura_sampler, 0);

    glBindTexture(GL_TEXTURE_RECTANGLE, Textury[nIndexTextury]);

    // 1rst attribute buffer : vertices
    glEnableVertexAttribArray(Attribute_polozenie_wierz);
    glBindBuffer(GL_ARRAY_BUFFER, tablicabuforow[nIndexObiektu]);
    glVertexAttribPointer(
        Attribute_polozenie_wierz,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
        3,                  // size
        GL_FLOAT,           // type
        GL_FALSE,           // normalized?
        0,                  // stride
        (void*)0            // array buffer offset
        );

    glEnableVertexAttribArray(Attribute_polozenie_tex);
    glBindBuffer(GL_ARRAY_BUFFER, tablicabuforowUV[nIndexObiektu]);
    glVertexAttribPointer(
        Attribute_polozenie_tex,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
        2,                  // size
        GL_FLOAT,           // type
        GL_FALSE,           // normalized?
        0,                  // stride
        (void*)0            // array buffer offset
        );

    // Draw the triangle !
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // 3 indices starting at 0 -> 1 triangle

    glDisableVertexAttribArray(Attribute_polozenie_wierz);
    glDisableVertexAttribArray(Attribute_polozenie_tex);
    wglMakeCurrent(NULL, NULL);
}

void CoknoGL::WypelnijBuffor()
{
    wglMakeCurrent(hUchwytKontekstu, hUchwytRendera);
    glBindBuffer(GL_ARRAY_BUFFER, nBuforLinii);
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(g_vertex_buffer_data), g_vertex_buffer_data);
    wglMakeCurrent(NULL, NULL);
}

void CoknoGL::RenderujLinie(glm::mat4 macierz, glm::vec3 color, int start, int end,
    glm::vec3 skala)
{
    wglMakeCurrent(hUchwytKontekstu, hUchwytRendera);
    glDisable(GL_DEPTH_TEST);
    glUseProgram(ShaderProgram2);
    glLineWidth(3.0f);
    glUniform3f(Uniform_color, color.x, color.y, color.z);
    glUniform3f(Uniform_scale, skala.x, skala.y, skala.z);
    glUniformMatrix4fv(Uniform_macierz_transf2, 1, GL_FALSE, &macierz[0][0]);
    // 1rst attribute buffer : vertices
    glEnableVertexAttribArray(Attribute_polozenie_wierz2);
    glBindBuffer(GL_ARRAY_BUFFER, nBuforLinii);
    glVertexAttribPointer(
        Attribute_polozenie_wierz2,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
        2,                  // size
        GL_FLOAT,           // type
        GL_FALSE,           // normalized?
        0,                  // stride
        (void*)0            // array buffer offset
        );

    // Draw the triangle !
    glDrawArrays(GL_LINE_STRIP, start, end); // Starting from vertex 0; 3 vertices total -> 1 triangle

    glDisableVertexAttribArray(Attribute_polozenie_wierz2);
    glLineWidth(1.0f);
    wglMakeCurrent(NULL, NULL);
}

void CoknoGL::ZmienStan(E_KEY klawisz)
{

    switch (stan)
    {
    case MFD_MAIN:

                     switch (klawisz)
                     {
                     case OBS_1:
                         stan = MFD_BLANK;
                         if (ActiveChannel == 1) alfachannel = MFD_BLANK;
                         if (ActiveChannel == 2) betachannel = MFD_BLANK;
                         if (ActiveChannel == 3) gammachannel = MFD_BLANK;
                         break;
                     case OBS_2:
                         stan = MFD_HAD;
                         if (ActiveChannel == 1) alfachannel = MFD_HAD;
                         if (ActiveChannel == 2) betachannel = MFD_HAD;
                         if (ActiveChannel == 3) gammachannel = MFD_HAD;
                         break;
                     case OBS_3:                    
                         break;
                     case OBS_4:
                         break;
                     case OBS_5:
                         stan = MFD_RESET;
                         break;
                     case OBS_6:
                         stan = MFD_SMS;
                         if (ActiveChannel == 1) alfachannel = MFD_SMS;
                         if (ActiveChannel == 2) betachannel = MFD_SMS;
                         if (ActiveChannel == 3) gammachannel = MFD_SMS;
                         break;
                     case OBS_7:
                         stan = MFD_HSD;
                         if (ActiveChannel == 1) alfachannel = MFD_HSD;
                         if (ActiveChannel == 2) betachannel = MFD_HSD;
                         if (ActiveChannel == 3) gammachannel = MFD_HSD;
                         break;
                     case OBS_8:
                         stan = MFD_DTE;
                         if (ActiveChannel == 1) alfachannel = MFD_DTE;
                         if (ActiveChannel == 2) betachannel = MFD_DTE;
                         if (ActiveChannel == 3) gammachannel = MFD_DTE;
                         break;
                     case OBS_9:
                         stan = MFD_TEST;
                         if (ActiveChannel == 1) alfachannel = MFD_TEST;
                         if (ActiveChannel == 2) betachannel = MFD_TEST;
                         if (ActiveChannel == 3) gammachannel = MFD_TEST;
                         break;
                     case OBS_10:
                         stan = MFD_FLCS;
                         if (ActiveChannel == 1) alfachannel = MFD_FLCS;
                         if (ActiveChannel == 2) betachannel = MFD_FLCS;
                         if (ActiveChannel == 3) gammachannel = MFD_FLCS;
                         break;
                     case OBS_11:
                         break;
                     case OBS_12:
                         ActiveChannel = 1;
                         stan = alfachannel;
                         break;
                     case OBS_13:
                         ActiveChannel = 2;
                         stan = betachannel;
                         break;
                     case OBS_14:
                         ActiveChannel = 3;
                         stan = gammachannel;
                         break;
                     case OBS_15:
                         break;
                     case OBS_16:
                         break;
                     case OBS_17:
                         break;
                     case OBS_18:
                         break;
                     case OBS_19:
                         break;
                     case OBS_20:
                         break;
                     case OBS_NULL:
                         break;
                     default:
                         break;
                     }

        break;
    case MFD_BLANK:

        if (klawisz == OBS_12)
        {
            if (ActiveChannel == 1)
            {
                alfachannel = MFD_BLANK;
                if (prevRESET == TRUE) { stan = MFD_RESET; }
                else { stan = MFD_MAIN; };
            }
            else
            {
                stan = alfachannel;
                ActiveChannel = 1;
            }
        }
        if (klawisz == OBS_13)
        {
            if (ActiveChannel == 2)
            {
                betachannel = MFD_BLANK;
                if (prevRESET == TRUE) { stan = MFD_RESET; }
                else { stan = MFD_MAIN; };
            }
            else
            {
                stan = betachannel;
                ActiveChannel = 2;
            }
        }
        if (klawisz == OBS_14)
        {
            if (ActiveChannel == 3)
            {
                gammachannel = MFD_BLANK;
                if (prevRESET == TRUE) { stan = MFD_RESET; }
                else { stan = MFD_MAIN; };
            }
            else
            {
                stan = gammachannel;
                ActiveChannel = 3;
            }
        }

        break;
    case MFD_HSD:

        if (klawisz == OBS_5)
        {
            if (bHsdSubmenu == FALSE) bHsdSubmenu = TRUE;
            else bHsdSubmenu = FALSE;
        }
        if (bHsdSubmenu)
        {
            if ((klawisz != OBS_11) & (klawisz != OBS_12) & (klawisz != OBS_13) & (klawisz != OBS_14))
            {
                break;
            }
        }
        if (klawisz == OBS_1)
        {
            stan = MFD_HSD_CEN;
            switch (ActiveChannel)
            {
            case 1: alfachannel = MFD_HSD_CEN; break;
            case 2: betachannel = MFD_HSD_CEN; break;
            case 3: gammachannel = MFD_HSD_CEN; break;
            default:
                break;
            }
        }
        if (klawisz == OBS_12)
        {
            if (ActiveChannel == 1)
            {
                alfachannel = MFD_HSD;
                if (prevRESET == TRUE) { stan = MFD_RESET; }
                else { stan = MFD_MAIN; };
            }
            else
            {
                stan = alfachannel;
                ActiveChannel = 1;
            }
        }
        if (klawisz == OBS_13)
        {
            if (ActiveChannel == 2)
            {
                betachannel = MFD_HSD;
                if (prevRESET == TRUE) { stan = MFD_RESET; }
                else { stan = MFD_MAIN; };
            }
            else
            {
                stan = betachannel;
                ActiveChannel = 2;
            }
        }
        if (klawisz == OBS_14)
        {
            if (ActiveChannel == 3)
            {
                gammachannel = MFD_HSD;
                if (prevRESET == TRUE) { stan = MFD_RESET; }
                else { stan = MFD_MAIN; };
            }
            else
            {
                stan = gammachannel;
                ActiveChannel = 3;
            }
        }
        if (klawisz == OBS_20)
        {
            if (nSkala == 1) { nSkala = 2.0f;  return; }
            if (nSkala == 0.5f) { nSkala = 1.0f;  return; }
            if (nSkala == 0.25f) { nSkala = 0.5f;  return; }
            if (nSkala == 0.125f) { nSkala = 0.25f;  return; }
            if (nSkala == 0.0625f) { nSkala = 0.125f;  return; }
        }
        if (klawisz == OBS_19)
        {
            if (nSkala == 2) { nSkala = 1; return; }
            if (nSkala == 1) { nSkala = 0.5f; return; }
            if (nSkala == 0.5f) { nSkala = 0.25f; return; }
            if (nSkala == 0.25f) { nSkala = 0.125f; return; }
            if (nSkala == 0.125f) { nSkala = 0.0625f; return; }
        }

        break;
    case MFD_HSD_CEN:
        if (klawisz == OBS_5)
        {
            if (bHsdSubmenu == FALSE) bHsdSubmenu = TRUE;
            else bHsdSubmenu = FALSE;
        }
        if (bHsdSubmenu)
        {
            if ((klawisz != OBS_11) & (klawisz != OBS_12) & (klawisz != OBS_13) & (klawisz != OBS_14))
            {
                break;
            }

        }
        if (klawisz == OBS_1)
        {
            stan = MFD_HSD;
            switch (ActiveChannel)
            {
            case 1: alfachannel = MFD_HSD; break;
            case 2: betachannel = MFD_HSD; break;
            case 3: gammachannel = MFD_HSD; break;
            default:
                break;
            }
        }
        if (klawisz == OBS_12)
        {
            if (ActiveChannel == 1)
            {
                alfachannel = MFD_HSD_CEN;
                if (prevRESET == TRUE) { stan = MFD_RESET; }
                else { stan = MFD_MAIN; };
            }
            else
            {
                stan = alfachannel;
                ActiveChannel = 1;
            }
        }
        if (klawisz == OBS_13)
        {
            if (ActiveChannel == 2)
            {
                betachannel = MFD_HSD_CEN;
                if (prevRESET == TRUE) { stan = MFD_RESET; }
                else { stan = MFD_MAIN; };
            }
            else
            {
                stan = betachannel;
                ActiveChannel = 2;
            }
        }
        if (klawisz == OBS_14)
        {
            if (ActiveChannel == 3)
            {
                gammachannel = MFD_HSD_CEN;
                if (prevRESET == TRUE) { stan = MFD_RESET; }
                else { stan = MFD_MAIN; };
            }
            else
            {
                stan = gammachannel;
                ActiveChannel = 3;
            }
        }
        if (klawisz == OBS_20)
        {
            if (nSkala == 1) { nSkala = 2.0f;  return; }
            if (nSkala == 0.5f) { nSkala = 1.0f;  return; }
            if (nSkala == 0.25f) { nSkala = 0.5f;  return; }
            if (nSkala == 0.125f) { nSkala = 0.25f;  return; }
            if (nSkala == 0.0625f) { nSkala = 0.125f;  return; }
        }
        if (klawisz == OBS_19)
        {
            if (nSkala == 2) { nSkala = 1; return; }
            if (nSkala == 1) { nSkala = 0.5f; return; }
            if (nSkala == 0.5f) { nSkala = 0.25f; return; }
            if (nSkala == 0.25f) { nSkala = 0.125f; return; }
            if (nSkala == 0.125f) { nSkala = 0.0625f; return; }
        }

        break;

    case MFD_HAD:

        if (klawisz == OBS_12)
        {
            if (ActiveChannel == 1)
            {
                alfachannel = MFD_HAD;
                if (prevRESET == TRUE) { stan = MFD_RESET; }
                else { stan = MFD_MAIN; };
            }
            else
            {
                stan = alfachannel;
                ActiveChannel = 1;
            }
        }
        if (klawisz == OBS_13)
        {
            if (ActiveChannel == 2)
            {
                betachannel = MFD_HAD;
                if (prevRESET == TRUE) { stan = MFD_RESET; }
                else { stan = MFD_MAIN; };
            }
            else
            {
                stan = betachannel;
                ActiveChannel = 2;
            }
        }
        if (klawisz == OBS_14)
        {
            if (ActiveChannel == 3)
            {
                gammachannel = MFD_HAD;
                if (prevRESET == TRUE) { stan = MFD_RESET; }
                else { stan = MFD_MAIN; };
            }
            else
            {
                stan = gammachannel;
                ActiveChannel = 3;
            }
        }

        break;
    case MFD_RESET:
                      prevRESET = TRUE;
                      if (klawisz == OBS_1)
                      {
                          alfachannel = MFD_BLANK;
                          stan = MFD_BLANK;
                      }
                      if (klawisz == OBS_5)
                      {
                          stan = MFD_MAIN;
                          prevRESET = FALSE;
                      }
                      if (klawisz == OBS_12)
                      {
                          stan = alfachannel;
                          ActiveChannel = 1;
                      }
                      if (klawisz == OBS_13)
                      {
                          stan = betachannel;
                          ActiveChannel = 2;
                      }
                      if (klawisz == OBS_14)
                      {
                          stan = gammachannel;
                          ActiveChannel = 3;
                      }

        break;
    case MFD_SMS:

        if (klawisz == OBS_12)
        {
            if (ActiveChannel == 1)
            {
                alfachannel = MFD_SMS;
                if (prevRESET == TRUE) { stan = MFD_RESET; }
                else { stan = MFD_MAIN; };
            }
            else
            {
                stan = alfachannel;
                ActiveChannel = 1;
            }
        }
        if (klawisz == OBS_13)
        {
            if (ActiveChannel == 2)
            {
                betachannel = MFD_SMS;
                if (prevRESET == TRUE) { stan = MFD_RESET; }
                else { stan = MFD_MAIN; };
            }
            else
            {
                stan = betachannel;
                ActiveChannel = 2;
            }
        }
        if (klawisz == OBS_14)
        {
            if (ActiveChannel == 3)
            {
                gammachannel = MFD_SMS;
                if (prevRESET == TRUE) { stan = MFD_RESET; }
                else { stan = MFD_MAIN; };
            }
            else
            {
                stan = gammachannel;
                ActiveChannel = 3;
            }
        }

        break;
    case MFD_DTE:

                    if (klawisz == OBS_3)
                    {
                        bParamsLoaded = TRUE;
                    }
                    if (klawisz == OBS_12)
                    {
                        if (ActiveChannel == 1)
                        {
                            alfachannel = MFD_DTE;
                            if (prevRESET == TRUE) { stan = MFD_RESET; }
                            else { stan = MFD_MAIN; };
                        }
                        else
                        {
                            stan = alfachannel;
                            ActiveChannel = 1;
                        }
                    }
                    if (klawisz == OBS_13)
                    {
                        if (ActiveChannel == 2)
                        {
                            betachannel = MFD_DTE;
                            if (prevRESET == TRUE) { stan = MFD_RESET; }
                            else { stan = MFD_MAIN; };
                        }
                        else
                        {
                            stan = betachannel;
                            ActiveChannel = 2;
                        }
                    }
                    if (klawisz == OBS_14)
                    {
                        if (ActiveChannel == 3)
                        {
                            gammachannel = MFD_DTE;
                            if (prevRESET == TRUE) { stan = MFD_RESET; }
                            else { stan = MFD_MAIN; };
                        }
                        else
                        {
                            stan = gammachannel;
                            ActiveChannel = 3;
                        }
                    }

        break;
    case MFD_TEST:

        if (klawisz == OBS_12)
        {
            if (ActiveChannel == 1)
            {
                alfachannel = MFD_TEST;
                if (prevRESET == TRUE) { stan = MFD_RESET; }
                else { stan = MFD_MAIN; };
            }
            else
            {
                stan = alfachannel;
                ActiveChannel = 1;
            }
        }
        if (klawisz == OBS_13)
        {
            if (ActiveChannel == 2)
            {
                betachannel = MFD_TEST;
                if (prevRESET == TRUE) { stan = MFD_RESET; }
                else { stan = MFD_MAIN; };
            }
            else
            {
                stan = betachannel;
                ActiveChannel = 2;
            }
        }
        if (klawisz == OBS_14)
        {
            if (ActiveChannel == 3)
            {
                gammachannel = MFD_TEST;
                if (prevRESET == TRUE) { stan = MFD_RESET; }
                else { stan = MFD_MAIN; };
            }
            else
            {
                stan = gammachannel;
                ActiveChannel = 3;
            }
        }

        break;
    case MFD_FLCS:

        if (klawisz == OBS_12)
        {
            if (ActiveChannel == 1)
            {
                alfachannel = MFD_FLCS;
                if (prevRESET == TRUE) { stan = MFD_RESET; }
                else { stan = MFD_MAIN; };
            }
            else
            {
                stan = alfachannel;
                ActiveChannel = 1;
            }
        }
        if (klawisz == OBS_13)
        {
            if (ActiveChannel == 2)
            {
                betachannel = MFD_FLCS;
                if (prevRESET == TRUE) { stan = MFD_RESET; }
                else { stan = MFD_MAIN; };
            }
            else
            {
                stan = betachannel;
                ActiveChannel = 2;
            }
        }
        if (klawisz == OBS_14)
        {
            if (ActiveChannel == 3)
            {
                gammachannel = MFD_FLCS;
                if (prevRESET == TRUE) { stan = MFD_RESET; }
                else { stan = MFD_MAIN; };
            }
            else
            {
                stan = gammachannel;
                ActiveChannel = 3;
            }
        }

        break;
    default:
        break;
    }

    if (klawisz == OBS_15) swap = MFD_SWAP;
}

void CoknoGL::DodajSprite(Sprite sprite, const char* szTexturaNazwa)
{
    ObiektySprite.push_back(sprite);
    NazwyTekstur.push_back(szTexturaNazwa);
}

void CoknoGL::DodajSprite(Sprite sprite, int nNumerTextury)
{
    ObiektySprite.push_back(sprite);
    NazwyTekstur.push_back("brak");
}

Sprite::Sprite()
{

}

Sprite::Sprite(GLfloat x, GLfloat y, GLfloat u, GLfloat v, GLfloat szerokosc, GLfloat wysokosc)
{
    wierzcholki.push_back(x);
    wierzcholki.push_back(y);
    wierzcholki.push_back(0.0);
    wspolrzedneuv.push_back(u);
    wspolrzedneuv.push_back(v+wysokosc);

    wierzcholki.push_back(x);
    wierzcholki.push_back(y+wysokosc);
    wierzcholki.push_back(0.0);
    wspolrzedneuv.push_back(u);
    wspolrzedneuv.push_back(v);

    wierzcholki.push_back(x+szerokosc);
    wierzcholki.push_back(y);
    wierzcholki.push_back(0.0);
    wspolrzedneuv.push_back(u +szerokosc);
    wspolrzedneuv.push_back(v + wysokosc);

    wierzcholki.push_back(x + szerokosc);
    wierzcholki.push_back(y + wysokosc);
    wierzcholki.push_back(0.0);
    wspolrzedneuv.push_back(u + szerokosc);
    wspolrzedneuv.push_back(v);

}
  1. Ckursor.h
#pragma once
#include <Windows.h>

enum E_KEY {
    OBS_1, OBS_2, OBS_3, OBS_4, OBS_5, OBS_6, OBS_7, OBS_8, OBS_9, OBS_10,
    OBS_11, OBS_12, OBS_13, OBS_14, OBS_15, OBS_16, OBS_17, OBS_18, OBS_19, OBS_20, OBS_NULL
};

class Ckursor
{
public:
    Ckursor();
    virtual ~Ckursor();
    E_KEY IsCursorOnKey(LPARAM position);
    void ChangeCursor(E_KEY klawisz);
private:
    HCURSOR kursor_normalny;
    HCURSOR kursor_lapki;
};

pliku cpp kursora nie wrzucam bo jest banalny - zwykłe obliczenie pozycji i zmiana kursora.

0
  1. WinMain
// SEKCJA 1 - PLIKI NAGŁÓWKOWE
// ------------------------------------------------------------------------------------------------------------------------

#include "stdatx.h"                                   // Załączenie  wszystkich potrzebnych nagłówków w pliku

// SEKCJA 2 - DYREKTYWY PREPROCESORA (#DEFINE, #TYPEDEF ITP.)
// ------------------------------------------------------------------------------------------------------------------------

// Makro błędu aplikacji
#define APPLICATION_ERROR MessageBox(0, L"Błąd Aplikacji", L"Nieznany błąd!", MB_OK);
#define M_PI 3.14159265358979323846

// SEKCJA 3 - PROTOTYPY FUNKCJI
// ------------------------------------------------------------------------------------------------------------------------

void WybierzScene();
void SwapWindow();
bool CheckEqual(CoknoGL* obiekt);
void RysujMain(CoknoGL* obiekt);
void RysujBlank(CoknoGL* obiekt);
void RysujHad(CoknoGL* obiekt);
void RysujReset(CoknoGL* obiekt);
void RysujSms(CoknoGL* obiekt);
void RysujHsd(CoknoGL* obiekt);
void RysujHsdCen(CoknoGL* obiekt);
void RysujDte(CoknoGL* obiekt);
void RysujTest(CoknoGL* obiekt);
void RysujFlcs(CoknoGL* obiekt);
void RysujKanaly(CoknoGL* obiekt);
void CheckLoadParams(void);

std::vector<glm::mat4> stosmacierzy;
unsigned short  usStanBelek[9] = { 0 };
DWORD WINAPI WatekSieci(LPVOID lpParam);

// SEKCJA 4 - DEKLARACJE ZMIENNYCH GLOBALNYCH
// ------------------------------------------------------------------------------------------------------------------------

CoknoGL* okno1;                                     // Uchwyt do okna
CoknoGL* okno2;
DWORD ThreadID;
HANDLE hUchwytWatku;
Cflightdata flightdata;

float fAngle = 0.0;

struct FPOINT
{
    float x;
    float y;
};

std::vector<FPOINT> fWayPoints;

// SEKCJA 5 - FUNKCJA GŁÓWNA APLIKACJI
// ------------------------------------------------------------------------------------------------------------------------

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

    hUchwytWatku = CreateThread(
        NULL,
        0,
        WatekSieci,
        &flightdata,
        0,
        &ThreadID
        );

    okno1 = new CoknoGL(MFD_MAIN);
    okno1->UtworzOkno();
    okno2 = new CoknoGL(MFD_BLANK);
    okno2->UtworzOkno();

    glm::mat4 orto; 
    orto = glm::ortho(0.0, 572.0, 0.0, 574.0);
    glm::mat4 macierz_przycisku_beta = glm::translate(orto, glm::vec3(-67.0, 0.0, 0.0));
    stosmacierzy.push_back(macierz_przycisku_beta);
    macierz_przycisku_beta = glm::translate(orto, glm::vec3(-134.0, 0.0, 0.0));
    stosmacierzy.push_back(macierz_przycisku_beta);
    glm::mat4 macierz_samolotuhsd = glm::translate(orto, glm::vec3(0.0, 90.0, 0.0));
    stosmacierzy.push_back(macierz_samolotuhsd);
    glm::mat4 macierz_hsdobrot = glm::rotate(orto, fAngle, glm::vec3(0.0, 0.0, 1.0));
    stosmacierzy.push_back(orto);

    FPOINT P1, P2, P3, P4;
    P1.x = 10.0f;
    P1.y = 0.0f;
    P2.x = 200.0f;
    P2.y = 200.0f;
    P3.x = -135.0f;
    P3.y = -50.0f;
    P4.x = -50.0f;
    P4.y = 303.0f;

    Sprite frame(0.0, 0.0, 0.0, 0.0, 572.0, 574.0);                     //0

    Sprite main_menu(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);               //1
    Sprite submenu_blank(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);           //2
    Sprite submenu_reset(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);           //3
    Sprite submenu_sms(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);             //4
    Sprite submenu_hsd(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);             //5
    Sprite submenu_dte(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);             //6
    Sprite submenu_test(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);            //7
    Sprite submenu_flcs(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);            //8
    Sprite submenu_flir(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);            //9
    Sprite submenu_tfr(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);             //10
    Sprite submenu_wpn(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);             //11
    Sprite submenu_tgp(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);             //12
    Sprite submenu_fcr(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);             //13

    Sprite napis_fcr_i(0.0, 0.0, 0.0, 0.0, 400.0, 400.0);           //13
    Sprite napis_fcr(332.0, 86.0, 8.0, 88.0, 60.0, 26.0);               //14
    Sprite napis_blank_i(0.0, 0.0, 0.0, 0.0, 400.0, 400.0);         //15
    Sprite napis_blank(332.0, 86.0, 200.0, 212.0, 60.0, 26.0);          //16
    Sprite napis_had_i(0.0, 0.0, 0.0, 0.0, 400.0, 400.0);           //17
    Sprite napis_had(336.0, 85.0, 134.0, 12.0, 38.0, 26.0);             //18
    Sprite napis_sms_i(0.0, 0.0, 0.0, 0.0, 400.0, 400.0);           //19
    Sprite napis_sms(332.0, 83.0, 384.0, 90.0, 60.0, 26.0);             //20
    Sprite napis_hsd_i(0.0, 0.0, 0.0, 0.0, 400.0, 400.0);               //21
    Sprite napis_hsd(332.0, 81.0, 384.0, 156.0, 60.0, 26.0);                //22
    Sprite napis_dte_i(0.0, 0.0, 0.0, 0.0, 400.0, 400.0);               //23
    Sprite napis_dte(332.0, 83.0, 384.0, 220.0, 60.0, 26.0);                //24
    Sprite napis_test_i(0.0, 0.0, 0.0, 0.0, 400.0, 400.0);              //25
    Sprite napis_test(328.0, 82.0, 372.0, 286.0, 60.0, 26.0);           //26
    Sprite napis_flcs_i(0.0, 0.0, 0.0, 0.0, 400.0, 400.0);              //27
    Sprite napis_flcs(328.0, 84.0, 372.0, 348.0, 60.0, 26.0);           //28
    Sprite napis_flir_i(332.0, 86.0, 134.0, 12.0, 60.0, 26.0);              //29
    Sprite napis_flir(332.0, 86.0, 134.0, 12.0, 60.0, 26.0);                //30
    Sprite napis_tfr_i(332.0, 86.0, 134.0, 12.0, 60.0, 26.0);               //31
    Sprite napis_tfr(332.0, 86.0, 134.0, 12.0, 60.0, 26.0);             //32
    Sprite napis_wpn_i(332.0, 86.0, 134.0, 12.0, 60.0, 26.0);               //33
    Sprite napis_wpn(332.0, 86.0, 134.0, 12.0, 60.0, 26.0);             //34
    Sprite napis_tgp_i(332.0, 86.0, 134.0, 12.0, 60.0, 26.0);               //35
    Sprite napis_tgp(332.0, 86.0, 134.0, 12.0, 60.0, 26.0);             //36

    Sprite submenu_hsd_rings(70.0, 80.0, 0.0, 0.0, 434.0, 433.0);
    Sprite submenu_hsd_aircraft(265.0, 164.0, 0.0, 510.0, 40.0, 60.0);
    Sprite submenu_hsd_rings2(73.0, 70.0, 0.0, 0.0, 434.0, 433.0);
    Sprite submenu_hsd_rings3(70.0, -10.0, 0.0, 0.0, 434.0, 433.0);       // 33
    Sprite submenu_hsd_waypoints(-11.0, -13.0, 50.0, 510.0, 18.0, 60.0);
    Sprite submenu_hsd_240(81.0, 388.0, 107, 501.0, 35.0, 18.0); //34
    Sprite submenu_hsd_120(81.0, 388.0, 107, 519.0, 35.0, 18.0);
    Sprite submenu_hsd_60(81.0, 388.0, 107, 538.0, 35.0, 18.0);
    Sprite submenu_hsd_30(81.0, 388.0, 149, 501.0, 35.0, 18.0);
    Sprite submenu_hsd_15(81.0, 388.0, 149, 520.0, 35.0, 18.0);  //38
    Sprite submenu_hsd_8(81.0, 388.0, 149, 538.0, 35.0, 18.0);  //39

    Sprite submenu_sms_wpn(0.0, 0.0, 0.0, 0.0, 88.0, 18.0);
    Sprite submenu_sms_wpn2(0.0, 0.0, 0.0, 20.0, 88.0, 18.0);
    Sprite submenu_sms_wpn3(0.0, 0.0, 0.0, 37.0, 88.0, 18.0);
    Sprite submenu_sms_wpn4(0.0, 0.0, 0.0, 54.0, 88.0, 18.0);
    Sprite submenu_sms_wpn5(0.0, 0.0, 0.0, 71.0, 88.0, 18.0); 
    Sprite submenu_sms_wpn6(0.0, 0.0, 0.0, 218, 88.0, 18.0);
    Sprite submenu_sms_wpn7(0.0, 0.0, 0.0, 236, 88.0, 18.0);
    Sprite submenu_sms_wpn8(0.0, 0.0, 0.0, 255, 88.0, 18.0);
    Sprite submenu_sms_wpn9(0.0, 0.0, 0.0, 272, 88.0, 18.0);
    Sprite submenu_sms_wpn10(0.0, 0.0, 0.0, 272, 88.0, 18.0);
    Sprite submenu_sms_wpn11(0.0, 0.0, 0.0, 307, 88.0, 18.0);
    Sprite submenu_sms_wpn12(0.0, 0.0, 0.0, 324, 88.0, 18.0);
    Sprite submenu_sms_wpn13(0.0, 0.0, 0.0, 342, 88.0, 18.0);
    Sprite submenu_sms_wpn14(0.0, 0.0, 0.0, 359, 88.0, 18.0);
    Sprite submenu_sms_wpn15(0.0, 0.0, 0.0, 376, 88.0, 18.0);
    Sprite submenu_sms_wpn16(0.0, 0.0, 0.0, 393, 88.0, 18.0);
    Sprite submenu_sms_wpn17(0.0, 0.0, 0.0, 409, 88.0, 18.0);
    Sprite submenu_sms_wpn18(0.0, 0.0, 0.0, 425, 88.0, 18.0);
    Sprite submenu_sms_wpn19(0.0, 0.0, 0.0, 444, 88.0, 18.0);

    okno1->DodajSprite(frame, "ramka.jpg");
    okno1->DodajSprite(main_menu, "main_men.jpg");
    okno1->DodajSprite(submenu_blank, "sub_blank.jpg");
    okno1->DodajSprite(submenu_reset, "sub_reset.jpg");
    okno1->DodajSprite(submenu_sms, "sub_sms.jpg");
    okno1->DodajSprite(submenu_hsd, "sub_hsd.jpg");
    okno1->DodajSprite(submenu_dte, "sub_dte.jpg");
    okno1->DodajSprite(submenu_test, "sub_test.jpg");
    okno1->DodajSprite(submenu_flcs, "sub_flcs.jpg");
    okno1->DodajSprite(submenu_flir, "n");
    okno1->DodajSprite(submenu_tfr, "n");
    okno1->DodajSprite(submenu_wpn, "n");
    okno1->DodajSprite(submenu_tgp, "n");
    okno1->DodajSprite(submenu_fcr, "n");
    okno1->DodajSprite(napis_fcr_i, "napisy_1");
    okno1->DodajSprite(napis_fcr, "n");
    okno1->DodajSprite(napis_blank_i, "n");
    okno1->DodajSprite(napis_blank, "n");
    okno1->DodajSprite(napis_had_i, "n");
    okno1->DodajSprite(napis_had, "n");
    okno1->DodajSprite(napis_sms_i, "n");
    okno1->DodajSprite(napis_sms, "n");
    okno1->DodajSprite(napis_hsd_i, "n");
    okno1->DodajSprite(napis_hsd, "n");
    okno1->DodajSprite(napis_dte_i, "n");
    okno1->DodajSprite(napis_dte, "n");
    okno1->DodajSprite(napis_test_i, "n");
    okno1->DodajSprite(napis_test, "n");
    okno1->DodajSprite(napis_flcs_i, "sub_hsd3.jpg");
    okno1->DodajSprite(napis_flcs, "sub_hsd4.jpg");
    okno1->DodajSprite(submenu_hsd_rings, "sub_hsd2.bmp");
    okno1->DodajSprite(submenu_hsd_aircraft, "n");
    okno1->DodajSprite(submenu_hsd_rings2, "n");
    okno1->DodajSprite(submenu_hsd_rings3, "n");
    okno1->DodajSprite(submenu_hsd_240, "n");
    okno1->DodajSprite(submenu_hsd_120, "n");
    okno1->DodajSprite(submenu_hsd_60, "n");
    okno1->DodajSprite(submenu_hsd_30, "n");
    okno1->DodajSprite(submenu_hsd_15, "n");
    okno1->DodajSprite(submenu_hsd_8, "sub_hsd5.bmp");
    okno1->DodajSprite(submenu_hsd_waypoints, "sub_hsd5.jpg"); //40
    okno1->DodajSprite(submenu_sms_wpn, "sub_sms2.jpg"); //41
    okno1->DodajSprite(submenu_sms_wpn2, "n"); //42
    okno1->DodajSprite(submenu_sms_wpn3, "n"); //43
    okno1->DodajSprite(submenu_sms_wpn4, "n"); //44
    okno1->DodajSprite(submenu_sms_wpn5, "n"); //45
    okno1->DodajSprite(submenu_sms_wpn6, "n"); //46
    okno1->DodajSprite(submenu_sms_wpn7, "n"); //47
    okno1->DodajSprite(submenu_sms_wpn8, "n"); //48
    okno1->DodajSprite(submenu_sms_wpn9, "n"); //49
    okno1->DodajSprite(submenu_sms_wpn10, "n"); //49
//  okno1->DodajSprite(submenu_sms_wpn11, "n"); //50
/*  okno1->DodajSprite(submenu_sms_wpn12, "n"); //51  50 - wszystko działa ok 
    okno1->DodajSprite(submenu_sms_wpn13, "n"); //52  51 - program się sypie (error 1282)
    okno1->DodajSprite(submenu_sms_wpn14, "n"); //53 
    okno1->DodajSprite(submenu_sms_wpn15, "n"); //54
    okno1->DodajSprite(submenu_sms_wpn16, "n"); //55
    okno1->DodajSprite(submenu_sms_wpn17, "n"); //56
    okno1->DodajSprite(submenu_sms_wpn18, "n"); //57
    okno1->DodajSprite(submenu_sms_wpn19, "n"); //58 */

    okno1->ZainicjalizujGL();
    okno2->ZainicjalizujGL();
    int nEr = glGetError();

    MSG msg;
    bool finish = FALSE;
    while (!finish)
    {

        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
            if (msg.message == WM_QUIT)
            {
                finish = TRUE;
            }
        }

            WybierzScene();
            if (flightdata.run == TRUE)
            {
                SetWindowText(okno1->hUchwytOkna, L"Application MFD simulator - FALCON BMS 4.32 is running...");
                SetWindowText(okno2->hUchwytOkna, L"Application MFD simulator - FALCON BMS 4.32 is running...");
            }
            else
            {
                SetWindowText(okno1->hUchwytOkna, L"Application MFD simulator - FALCON BMS 4.32 is NOT running...");
                SetWindowText(okno2->hUchwytOkna, L"Application MFD simulator - FALCON BMS 4.32 is NOT running...");
            }       
            CheckLoadParams();
            fAngle += 0.5f;
    }

    delete okno1;
    delete okno2;
    CloseHandle(hUchwytWatku);
    return 0;
}

// SEKCJA 6 - POZOSTAŁE FUNKCJE (DEFINICJE)
// ------------------------------------------------------------------------------------------------------------------------

void WybierzScene()
{
    switch (okno1->stan)
    {
    case MFD_MAIN:
        RysujMain(okno1);
        break;
    case MFD_BLANK:
        RysujBlank(okno1);
        break;
    case MFD_HAD:
        RysujHad(okno1);
        break;
    case MFD_RESET:
        RysujReset(okno1);
        break;
    case MFD_SMS:
        RysujSms(okno1);
        break;
    case MFD_HSD:
        RysujHsd(okno1);
        break;
    case MFD_HSD_CEN:
        RysujHsdCen(okno1);
        break;
    case MFD_DTE:
        RysujDte(okno1);
        break;
    case MFD_TEST:
        RysujTest(okno1);
        break;
    case MFD_FLCS:
        RysujFlcs(okno1);
        break;
    default:
        break;
    }

    switch (okno2->stan)
    {
    case MFD_MAIN:
        RysujMain(okno2);
        break;
    case MFD_BLANK:
        RysujBlank(okno2);
        break;
    case MFD_HAD:
        RysujHad(okno2);
        break;
    case MFD_RESET:
        RysujReset(okno2);
        break;
    case MFD_SMS:
        RysujSms(okno2);
        break;
    case MFD_HSD:
        RysujHsd(okno2);
        break;
    case MFD_HSD_CEN:
        RysujHsdCen(okno2);
        break;
    case MFD_DTE:
        RysujDte(okno2);
        break;
    case MFD_TEST:
        RysujTest(okno2);
        break;
    case MFD_FLCS:
        RysujFlcs(okno2);
        break;
        default:
        break;
    }

    if ((okno1->swap == MFD_SWAP) || (okno2->swap == MFD_SWAP)) SwapWindow();
}

void SwapWindow()
{

    E_STAN stan, alfa, beta, gamma;
    int active;

    stan = okno1->stan;
    alfa = okno1->alfachannel;
    beta = okno1->betachannel;
    gamma = okno1->gammachannel;
    active = okno1->ActiveChannel;

    okno1->stan = okno2->stan;
    okno1->alfachannel = okno2->betachannel;
    okno1->betachannel = okno2->betachannel;
    okno1->gammachannel = okno2->gammachannel;
    okno1->ActiveChannel = okno2->ActiveChannel;

    okno2->stan = stan;
    okno2->alfachannel = alfa;
    okno2->betachannel = beta;
    okno2->gammachannel = gamma;
    okno2->ActiveChannel = active;

    okno1->swap = MFD_BLANK;
    okno2->swap = MFD_BLANK;
}

bool CheckEqual()
{
    if (okno1->stan == MFD_MAIN && okno2->stan == MFD_MAIN)
    {
        okno1->TakieSamoMenu = TRUE;
        return true;
    }
    okno1->TakieSamoMenu = FALSE;
    return false;
}

void RysujMain(CoknoGL* obiekt)
{
    obiekt->OproznijBufor();
    obiekt->RenderujKlatke(1, 2);
    obiekt->RenderujRamke(0);
    RysujKanaly(obiekt);
    obiekt->ZamienBufor();
}

void RysujBlank(CoknoGL* obiekt)
{
    obiekt->OproznijBufor();
    obiekt->RenderujKlatke(2, 3);
    obiekt->RenderujRamke(0);
    RysujKanaly(obiekt);
    obiekt->ZamienBufor();
}

void RysujHad(CoknoGL* obiekt)
{
    obiekt->OproznijBufor();
    obiekt->RenderujKlatke(2, 3);
    obiekt->RenderujRamke(0);
    RysujKanaly(obiekt);
    obiekt->ZamienBufor();
}

void RysujReset(CoknoGL* obiekt)
{
    obiekt->OproznijBufor();
    obiekt->RenderujKlatke(3, 4);
    obiekt->RenderujRamke(0);
    RysujKanaly(obiekt);
    obiekt->ZamienBufor();
}

void RysujSms(CoknoGL* obiekt)
{

    glm::mat4 poz_1_1 = glm::translate(stosmacierzy[3], glm::vec3(110, 140, 0));
    glm::mat4 poz_1_2 = glm::translate(stosmacierzy[3], glm::vec3(110, 160, 0));
    glm::mat4 poz_2_1 = glm::translate(stosmacierzy[3], glm::vec3(110, 200, 0));
    glm::mat4 poz_2_2 = glm::translate(stosmacierzy[3], glm::vec3(110, 220, 0));
    glm::mat4 poz_3_1 = glm::translate(stosmacierzy[3], glm::vec3(140, 255, 0));
    glm::mat4 poz_3_2 = glm::translate(stosmacierzy[3], glm::vec3(140, 275, 0));
    glm::mat4 poz_3_3 = glm::translate(stosmacierzy[3], glm::vec3(140, 295, 0));
    glm::mat4 poz_4_1 = glm::translate(stosmacierzy[3], glm::vec3(175, 318, 0));
    glm::mat4 poz_4_2 = glm::translate(stosmacierzy[3], glm::vec3(175, 338, 0));
    glm::mat4 poz_4_3 = glm::translate(stosmacierzy[3], glm::vec3(175, 358, 0));
    glm::mat4 poz_5_1 = glm::translate(stosmacierzy[3], glm::vec3(250, 410, 0));
    glm::mat4 poz_5_2 = glm::translate(stosmacierzy[3], glm::vec3(250, 430, 0));
    glm::mat4 poz_5_3 = glm::translate(stosmacierzy[3], glm::vec3(250, 450, 0));
    glm::mat4 poz_6_1 = glm::translate(stosmacierzy[3], glm::vec3(325, 318, 0));
    glm::mat4 poz_6_2 = glm::translate(stosmacierzy[3], glm::vec3(325, 338, 0));
    glm::mat4 poz_6_3 = glm::translate(stosmacierzy[3], glm::vec3(325, 358, 0));
    glm::mat4 poz_7_1 = glm::translate(stosmacierzy[3], glm::vec3(360, 255, 0));
    glm::mat4 poz_7_2 = glm::translate(stosmacierzy[3], glm::vec3(360, 275, 0));
    glm::mat4 poz_7_3 = glm::translate(stosmacierzy[3], glm::vec3(360, 295, 0));
    glm::mat4 poz_8_1 = glm::translate(stosmacierzy[3], glm::vec3(390, 200, 0));
    glm::mat4 poz_8_2 = glm::translate(stosmacierzy[3], glm::vec3(390, 220, 0));
    glm::mat4 poz_9_1 = glm::translate(stosmacierzy[3], glm::vec3(390, 140, 0));
    glm::mat4 poz_9_2 = glm::translate(stosmacierzy[3], glm::vec3(390, 160, 0));

    int i = 42;
    obiekt->OproznijBufor();
    obiekt->RenderujKlatke(4, 5);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_1_1);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_1_2);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_2_1);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_2_2);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_3_1);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_3_2);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_3_3);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_4_1);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_4_2);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_4_3);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_5_1);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_5_2);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_5_3);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_6_1);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_6_2);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_6_3);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_7_1);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_7_2);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_7_3);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_8_1);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_8_2);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_9_1);
    obiekt->RenderujPojedynczyObiekt(i, 41, poz_9_2);

    obiekt->RenderujPojedynczyObiekt(42, 41);

    //obiekt->RenderujRamke(0);
    RysujKanaly(obiekt);
    obiekt->ZamienBufor();
}

void RysujHsd(CoknoGL* obiekt)
{

    float diff = fAngle - flightdata.heading;
    if ((diff > 0.5f) || (diff < -0.5f))
    {
        if ((flightdata.heading - fAngle) > 0.0f)
        {
            fAngle += 0.1f;
        }
        if ((flightdata.heading - fAngle) < 0.0f)
        {
            fAngle -= 0.1f;
        }
    }

    obiekt->OproznijBufor();
    obiekt->WlaczMieszanie(TRUE);

    glm::mat4 orto, orto2;
    orto = glm::ortho(-286.0, 278.0, -147.0, 287.0);
    orto2 = glm::ortho(-286.0, 278.0, -147.0, 287.0);
    orto = glm::rotate(orto, fAngle, glm::vec3(0, 0, -1));

    glm::mat4 przesuniecie = glm::translate(stosmacierzy[3], glm::vec3(290.0, 196.5, 0.0));
    glm::mat4 obrot = glm::rotate(przesuniecie, fAngle, glm::vec3(0.0, 0.0, -1.0));
    glm::mat4 fina = glm::translate(obrot, glm::vec3(-290.0, -196.5, 0.0));

    float scale = obiekt->nSkala;

    obiekt->RenderujPojedynczyObiekt(33, 28, fina);
    obiekt->RenderujPojedynczyObiekt(30, 29);
    obiekt->RenderujPojedynczyObiekt(31, 30);

    if (scale == 2) obiekt->RenderujPojedynczyObiekt(39, 30);
    if (scale == 1) obiekt->RenderujPojedynczyObiekt(38, 30);
    if (scale == 0.5) obiekt->RenderujPojedynczyObiekt(37, 30);
    if (scale == 0.25) obiekt->RenderujPojedynczyObiekt(36, 30);
    if (scale == 0.125) obiekt->RenderujPojedynczyObiekt(35, 30);
    if (scale == 0.0625) obiekt->RenderujPojedynczyObiekt(34, 30);

    for (int  i = 0; i < fWayPoints.size(); i++)
    {
        float fX = fWayPoints[i].x - flightdata.x;
        float fY = fWayPoints[i].y - flightdata.y;
        glm::mat4 przesuniecie_wp = glm::translate(orto, glm::vec3(fX*scale, fY*scale, 0.0));
        obiekt->RenderujPojedynczyObiekt(40, 30, przesuniecie_wp);
    }

    if (obiekt->bHsdSubmenu)
    {
        obiekt->RenderujPojedynczyObiekt(5, 39);
    }
    else
    {
        obiekt->RenderujKlatke(5, 6);
    }
    obiekt->WlaczMieszanie(FALSE);
    orto = glm::scale(orto, glm::vec3(scale, scale, 1));
    orto2 = glm::scale(orto2, glm::vec3(scale, scale, 1));
    obiekt->RenderujLinie(orto, glm::vec3(1, 1, 1), 0, fWayPoints.size(), glm::vec3(1, 1, 1));
    obiekt->RenderujLinie(orto2, glm::vec3(0.1529, 0.9215, 0.9059), 19, 2, glm::vec3(1, 1, 1));
    obiekt->RenderujLinie(orto2, glm::vec3(0.1529, 0.9215, 0.9059), 21, 2, glm::vec3(1, 1, 1));
    obiekt->RenderujLinie(orto2, glm::vec3(0.1529, 0.9215, 0.9059), 23, 2, glm::vec3(1, 1, 1));
    obiekt->RenderujRamke(0);
    RysujKanaly(obiekt);
    obiekt->ZamienBufor();
}

void RysujHsdCen(CoknoGL* obiekt)
{

    float diff = fAngle - flightdata.heading;
    if ((diff > 0.5f) || (diff < -0.5f))
    {
        if ((flightdata.heading - fAngle) > 0.0f)
        {
            fAngle += 0.1f;
        }
        if ((flightdata.heading - fAngle) < 0.0f)
        {
            fAngle -= 0.1f;
        }
    }

    glm::mat4 orto, orto2;
    orto = glm::ortho(-286.0, 277.0, -280.0, 287.0);
    orto2 = glm::ortho(-286.0, 277.0, -280.0, 287.0);
    orto = glm::rotate(orto, fAngle, glm::vec3(0, 0, -1));

    glm::mat4 przesuniecie = glm::translate(stosmacierzy[3], glm::vec3(290.0, 286.5, 0.0));
    glm::mat4 obrot = glm::rotate(przesuniecie, fAngle , glm::vec3(0.0, 0.0, -1.0));
    glm::mat4 fina = glm::translate(obrot, glm::vec3(-290.0, -286.5, 0.0));

    float scale = obiekt->nSkala;

    obiekt->OproznijBufor();
    obiekt->WlaczMieszanie(TRUE);
    obiekt->RenderujPojedynczyObiekt(32, 30, fina);
    obiekt->RenderujPojedynczyObiekt(31, 30, stosmacierzy[2]);

    if (scale == 2) obiekt->RenderujPojedynczyObiekt(39, 30);
    if (scale == 1) obiekt->RenderujPojedynczyObiekt(38, 30);
    if (scale == 0.5) obiekt->RenderujPojedynczyObiekt(37, 30);
    if (scale == 0.25) obiekt->RenderujPojedynczyObiekt(36, 30);
    if (scale == 0.125) obiekt->RenderujPojedynczyObiekt(35, 30);
    if (scale == 0.0625) obiekt->RenderujPojedynczyObiekt(34, 30);

    for (int i = 0; i < fWayPoints.size(); i++)
    {
        float fX = fWayPoints[i].x - flightdata.x;
        float fY = fWayPoints[i].y - flightdata.y;
        glm::mat4 przesuniecie_wp = glm::translate(orto, glm::vec3(fX*scale, fY*scale, 0.0));
        obiekt->RenderujPojedynczyObiekt(40, 30, przesuniecie_wp);
    }
    if (obiekt->bHsdSubmenu)
    {
        obiekt->RenderujPojedynczyObiekt(5, 39);
    }
    else
    {
        obiekt->RenderujPojedynczyObiekt(2, 40);
    }
    obiekt->WlaczMieszanie(FALSE);
    int nsize = fWayPoints.size();
    if (nsize == 1) nsize = 0;
    orto = glm::scale(orto, glm::vec3(scale, scale, 1));
    orto2 = glm::scale(orto2, glm::vec3(scale, scale, 1));
    obiekt->RenderujLinie(orto, glm::vec3(1, 1, 1), 0, fWayPoints.size(), glm::vec3(1, 1, 1));
    obiekt->RenderujLinie(orto2, glm::vec3(0.1529, 0.9215, 0.9059), 19, 2, glm::vec3(1, 1, 1));
    obiekt->RenderujLinie(orto2, glm::vec3(0.1529, 0.9215, 0.9059), 21, 2, glm::vec3(1, 1, 1));
    obiekt->RenderujLinie(orto2, glm::vec3(0.1529, 0.9215, 0.9059), 23, 2, glm::vec3(1, 1, 1));
    obiekt->RenderujRamke(0);
    RysujKanaly(obiekt);
    obiekt->ZamienBufor();  
}

void RysujDte(CoknoGL* obiekt)
{
    obiekt->OproznijBufor();
    obiekt->RenderujKlatke(6, 7);
    obiekt->RenderujRamke(0);
    RysujKanaly(obiekt);
    obiekt->RenderujRamke(0);
    obiekt->ZamienBufor();
}

void RysujTest(CoknoGL* obiekt)
{
    obiekt->OproznijBufor();
    obiekt->RenderujKlatke(7, 8);
    obiekt->RenderujRamke(0);
    RysujKanaly(obiekt);
    obiekt->ZamienBufor();
}

void RysujFlcs(CoknoGL* obiekt)
{
    obiekt->OproznijBufor();
    obiekt->RenderujKlatke(8, 9);
    obiekt->RenderujRamke(0);
    RysujKanaly(obiekt);
    obiekt->ZamienBufor();
}
void RysujKanaly(CoknoGL* obiekt)
{
    obiekt->WlaczMieszanie(TRUE);

    switch (obiekt->alfachannel)
    {
    case MFD_BLANK:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(17, 1);
        break;
    case MFD_HAD:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(19, 1);
        break;
    case MFD_SMS:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(21, 1);
        break;
    case MFD_HSD:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(23, 1);
        break;
    case MFD_HSD_CEN:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(23, 1);
        break;
    case MFD_DTE:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(25, 1);
        break;
    case MFD_TEST:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(27, 1);
        break;
    case MFD_FLCS:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(29, 1);
        break;
    default:
        obiekt->RenderujPojedynczyObiekt(17, 1);
        break;
    }

    switch (obiekt->betachannel)
    {
    case MFD_BLANK:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(17, 1, stosmacierzy[0]);
        break;
    case MFD_HAD:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(19, 1, stosmacierzy[0]);
        break;
    case MFD_SMS:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(21, 1, stosmacierzy[0]);
        break;
    case MFD_HSD:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(23, 1, stosmacierzy[0]);
        break;
    case MFD_HSD_CEN:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(23, 1, stosmacierzy[0]);
        break;
    case MFD_DTE:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(25, 1, stosmacierzy[0]);
        break;
    case MFD_TEST:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(27, 1, stosmacierzy[0]);
        break;
    case MFD_FLCS:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(29, 1, stosmacierzy[0]);
        break;
    default:
        obiekt->RenderujPojedynczyObiekt(17, 1, stosmacierzy[0]);
        break;
    }

    switch (obiekt->gammachannel)
    {
    case MFD_BLANK:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(17, 1, stosmacierzy[1]);
        break;
    case MFD_HAD:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(19, 1, stosmacierzy[1]);
        break;
    case MFD_SMS:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(21, 1, stosmacierzy[1]);
        break;
    case MFD_HSD:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(23, 1, stosmacierzy[1]);
        break;
    case MFD_HSD_CEN:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(23, 1, stosmacierzy[1]);
        break;
    case MFD_DTE:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(25, 1, stosmacierzy[1]);
        break;
    case MFD_TEST:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(27, 1, stosmacierzy[1]);
        break;
    case MFD_FLCS:
        if (obiekt->ActiveChannel == 1);
        obiekt->RenderujPojedynczyObiekt(29, 1, stosmacierzy[1]);
        break;
    default:
        obiekt->RenderujPojedynczyObiekt(17, 1, stosmacierzy[1]);
        break;
    }

    obiekt->WlaczMieszanie(GL_FALSE);
}

void CheckLoadParams(void)
{
    if (okno1->bParamsLoaded == TRUE)
    {
        fWayPoints.clear();
        for (int i = 0; i < 9; i++)
        {
            usStanBelek[i] = okno1->usBelki[i];
        }
        if (okno1->nCounter > -1)
        {
            FPOINT fpoint;
            for (int i = 0; i < okno1->nCounter; i++)
            {
                fpoint.x = okno1->xwaypoints[i];
                fpoint.y = okno1->ywaypoints[i];
                fWayPoints.push_back(fpoint);
                //okno1->g_vertex_buffer_data[2*i] = fpoint.x + 292.0f;
                //okno1->g_vertex_buffer_data[2*i +1] = fpoint.y + 288.0f;
                okno1->g_vertex_buffer_data[2*i] = fpoint.x;
                okno1->g_vertex_buffer_data[2*i +1] = fpoint.y;
            }   
            okno1->WypelnijBuffor();
            okno2->WypelnijBuffor();
        }
    }

    okno1->bParamsLoaded = FALSE;
}

Definicji i deklaracji okien dialogowych nie wrzucam bo to nie tam na 99% tkwi problem. Myślałem, że przyczyną może być jakieś ograniczenie OpenGL co do ilości deklarowanych buforów, ale zdaje się, że nie ma to znaczenia (ograniczeniem jest pamięć na karcie?). Gdyby ktoś rzucił okiem na kod byłbym bardzo wdzięczny bo sam jestem ciekaw co jest nie tak. Rozdzieliłem na dwa posty z powodu objętości kodu.

0

O Boże ale głupi błąd zrobiłem! Zadeklarowałem na sztywno tablice na 50 elementów (dla buforów i współrzędnych tekstur):

GLuint tablicabuforow[50];
GLuint tablicabuforowUV[50];

Nic dziwnego, że powyżej 50 elementów program się sypie ;) Przypadkiem to zauważyłem teraz ;) . Jak już wrzuciłem trochę kodu to mile widziane byłyby wskazówki i złe nawyki jakie popełniam bo dopiero się uczę :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0