GRK/cw 7/src/Render_Utils.h
secret_dude a7bd7ecb75 master
2022-01-12 16:07:16 +01:00

117 lines
3.1 KiB
C++

#pragma once
#include "glm.hpp"
#include "ext.hpp"
#include "glew.h"
#include "objload.h"
#include <assimp/Importer.hpp>
#include <assimp/scene.h>
#include <assimp/postprocess.h>
#include "Texture.h"
#define BUFFER_OFFSET(i) ((char *)NULL + (i))
namespace Core
{
static inline glm::mat4 mat4_cast(const aiMatrix4x4& m) { return glm::transpose(glm::make_mat4(&m.a1)); }
struct Material {
GLuint program;
virtual void init_data() = 0;
};
struct DiffuseMaterial : Core::Material {
GLuint texture;
glm::vec3 lightDir;
void init_data();
};
struct DiffuseSpecularMaterial : Core::Material {
GLuint texture;
GLuint textureSpecular;
glm::vec3 lightDir;
void init_data();
};
struct RenderContext
{
GLuint vertexArray;
GLuint vertexBuffer;
GLuint vertexIndexBuffer;
Material* material;
int size = 0;
void initFromOBJ(obj::Model& model);
void initFromAssimpMesh(aiMesh* mesh);
void render();
};
struct RayContext : RenderContext {
void render();
};
struct Node {
std::vector<RenderContext> renderContexts;
glm::mat4 matrix;
int parent;
};
// vertexArray - jednowymiarowa tablica zawierajaca wartosci opisujace pozycje kolejnych wierzcholkow w jednym ciagu (x1, y1, z1, w1, x2, y2, z2, w2, ...)
// numVertices - liczba wierzcholkow do narysowania
// elementSize - liczba wartosci opisujacych pojedynczy wierzcholek (np. 3 gdy wierzcholek opisany jest trojka (x, y, z))
void DrawVertexArray(const float * vertexArray, int numVertices, int elementSize);
// indexArray - jednowymiarowa tablica zawierajaca indeksy wierzcholkow kolejnych trojkatow w jednym ciagu (t1_i1, t1_i2, t1_i3, t2_i1, t2_i2, t2_i3, ...)
// numIndexes - liczba indeksow w tablicy indexArray
void DrawVertexArrayIndexed(const float * vertexArray, const int * indexArray, int numIndexes, int elementSize);
struct VertexAttribute
{
const void * Pointer;
int Size;
};
struct VertexData
{
static const int MAX_ATTRIBS = 8;
VertexAttribute Attribs[MAX_ATTRIBS];
int NumActiveAttribs;
int NumVertices;
};
// Ta funkcja sluzy do rysowania trojkatow, ktorych wierzcholki moga byc opisane wiecej niz jednym atrybutem.
// Funkcja przyjmuje jako parametr strukture, w ktorej nalezy zawrzec wszystkie potrzebne dane.
//
// Przykladowe wywolanie funkcji - narysowanie trojkata jak na pierwszych zajeciach:
/*
const float vertices[] = {
0.25f, 0.25f, 0.0f, 1.0f,
0.25f, -0.25f, 0.0f, 1.0f,
-0.25f, -0.25f, 0.0f, 1.0f
};
Core::VertexData vertexData;
vertexData.NumActiveAttribs = 1; // Liczba uzywanych atrybutow wierzcholka
vertexData.Attribs[0].Pointer = vertices; // Wskaznik na dane zerowego atrybutu
vertexData.Attribs[0].Size = 4; // Wielkosc zerowego atrybutu (ilosc liczb opisujacych ten atrybut w pojedynczym wierzcholku)
vertexData.NumVertices = 3; // Liczba wierzcholkow do narysowania
Core::DrawVertexArray(vertexData);
*/
void DrawVertexArray(const VertexData & data);
void initRay(RayContext& rayContext);
void updateRayPos(RayContext& rayContext, std::vector<glm::vec3> keyPoints);
//void DrawContext(Core::RayContext& rayContext);
}