Пишу небольшой 3Д-движок на С++ по вот этому
туториалу.
Вот мой код:
TspEngine.cpp
#include <iostream>
#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <GL/GL.h>
#include "Window.h"
#include "Events.h"
int WIDTH = 1280;
int HEIGHT = 720;
int main() {
Window::initialize(WIDTH, HEIGHT, "Window");
Events::initialize();
glClearColor(0.6f, 0.62f, 0.65f, 1);
while (!Window::isShouldClose()) {
Events::pullEvents();
if (Events::jpressed(GLFW_KEY_ESCAPE)) {
Window::setShouldClose(true);
}
if (Events::jclicked(GLFW_MOUSE_BUTTON_1)) {
glClearColor(0.8f, 0.4f, 0.2f, 1);
}
glClear(GL_COLOR_BUFFER_BIT);
Window::swapBuffers();
}
Window::terminate();
return 0;
}
Window.h
#ifndef WINDOW_WINDOW_H_
#define WINDOW_WINDOW_H_
class GLFWwindow;
class Window {
public:
static GLFWwindow* window;
static int initialize(int width, int height, const char* title);
static void terminate();
static bool isShouldClose();
static void setShouldClose(bool flag);
static void swapBuffers();
};
#endif /* WINDOW_WINDOW_H_ */
Window.cpp
#include <iostream>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include "Window.h"
GLFWwindow* Window::window;
int Window::initialize(int width, int height, const char* title) {
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
window = glfwCreateWindow(width, height, title, nullptr, nullptr);
if (window == nullptr) {
std::cerr << "Failed to create GLFW Window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK) {
std::cerr << "Failed to initialize GLEW" << std::endl;
return -1;
}
return 0;
}
void Window::terminate() {
glfwTerminate();
}
bool Window::isShouldClose() {
return glfwWindowShouldClose(window);
}
void Window::setShouldClose(bool flag) {
glfwSetWindowShouldClose(window, flag);
}
void Window::swapBuffers() {
glfwSwapBuffers(window);
}
Events.h
#ifndef WINDOW_EVENTS_H_
#define WINDOW_EVENTS_H_
#include "Window.h"
typedef unsigned int uint;
class Events {
public:
static bool* _keys;
static uint* _frames;
static uint _current;
static float deltaX;
static float deltaY;
static float x;
static float y;
static bool _cursor_locked;
static bool _cursor_started;
static int initialize();
static void pullEvents();
static bool pressed(int keycode);
static bool jpressed(int keycode);
static bool clicked(int button);
static bool jclicked(int button);
};
#endif /* WINDOW_EVENTS_H_ */
Events.cpp
#include "Events.h"
#include <GLFW/glfw3.h>
#include <string.h>
bool* Events::_keys;
uint* Events::_frames;
uint Events::_current = 0;
float Events::deltaX = 0.0f;
float Events::deltaY = 0.0f;
float Events::x = 0.0f;
float Events::y = 0.0f;
bool Events::_cursor_locked = false;
bool Events::_cursor_started = false;
#define _MOUSE_BUTTONS 1024
void cursor_position_callback(GLFWwindow* window, double xpos, double ypos) {
if (Events::_cursor_started) {
Events::deltaX += xpos - Events::x;
Events::deltaY += ypos - Events::y;
}
else {
Events::_cursor_started = true;
}
Events::x = xpos;
Events::y = ypos;
}
void mouse_button_callback(GLFWwindow* window, int button, int action, int mode) {
if (action == GLFW_PRESS) {
Events::_keys[_MOUSE_BUTTONS + button] = true;
Events::_frames[_MOUSE_BUTTONS + button] = Events::_current;
}
else if (action == GLFW_RELEASE) {
Events::_keys[_MOUSE_BUTTONS + button] = false;
Events::_frames[_MOUSE_BUTTONS + button] = Events::_current;
}
}
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode) {
if (action == GLFW_PRESS) {
Events::_keys[key] = true;
Events::_frames[key] = Events::_current;
}
else if (action == GLFW_RELEASE) {
Events::_keys[key] = false;
Events::_frames[key] = Events::_current;
}
}
int Events::initialize() {
GLFWwindow* window = Window::window;
_keys = new bool[1032];
_frames = new uint[1032];
memset(_keys, false, 1032 * sizeof(bool));
memset(_frames, 0, 1032 * sizeof(uint));
glfwSetKeyCallback(window, key_callback);
glfwSetMouseButtonCallback(window, mouse_button_callback);
glfwSetCursorPosCallback(window, cursor_position_callback);
return 0;
}
bool Events::pressed(int keycode) {
if (keycode < 0 || keycode >= _MOUSE_BUTTONS)
return false;
return _keys[keycode];
}
bool Events::jpressed(int keycode) {
if (keycode < 0 || keycode >= _MOUSE_BUTTONS)
return false;
return _keys[keycode] && _frames[keycode] == _current;
}
bool Events::clicked(int button) {
int index = _MOUSE_BUTTONS + button;
return _keys[index];
}
bool Events::jclicked(int button) {
int index = _MOUSE_BUTTONS + button;
return _keys[index] && _frames[index] == _current;
}
void Events::pullEvents() {
_current++;
deltaX = 0.0f;
deltaY = 0.0f;
glfwPollEvents();
}
Компилирую в Visual Studio 2022 на Windows 10 Pro
Однако возникает ошибка
LNK2001 unresolved external symbol "public: static class GLFWwindow * Window::window" (?window@Window@@2PEAVGLFWwindow@@EA) TspEngine D:\TspEngine\TspEngine\Events.obj 1
Все библиотеки подключил, все перепробовал, не работает, С++ плохо знаю, до этого учил С