raze/source/common/rendering/i_modelvertexbuffer.h
2023-08-19 16:59:05 +02:00

67 lines
1.4 KiB
C++

#pragma once
#include "basics.h"
struct FModelVertex
{
float x, y, z; // world position
float u, v; // texture coordinates
unsigned packedNormal; // normal vector as GL_INT_2_10_10_10_REV.
float lu, lv; // lightmap texture coordinates
float lindex; // lightmap texture index
uint8_t boneselector[4];
uint8_t boneweight[4];
void Set(float xx, float yy, float zz, float uu, float vv)
{
x = xx;
y = yy;
z = zz;
u = uu;
v = vv;
lu = 0.0f;
lv = 0.0f;
lindex = -1.0f;
}
void SetNormal(float nx, float ny, float nz)
{
int inx = clamp(int(nx * 512), -512, 511);
int iny = clamp(int(ny * 512), -512, 511);
int inz = clamp(int(nz * 512), -512, 511);
int inw = 0;
packedNormal = (inw << 30) | ((inz & 1023) << 20) | ((iny & 1023) << 10) | (inx & 1023);
}
void SetBoneSelector(int x, int y, int z, int w)
{
boneselector[0] = x;
boneselector[1] = y;
boneselector[2] = z;
boneselector[3] = w;
}
void SetBoneWeight(int x, int y, int z, int w)
{
boneweight[0] = x;
boneweight[1] = y;
boneweight[2] = z;
boneweight[3] = w;
}
};
#define VMO ((FModelVertex*)nullptr)
class IModelVertexBuffer
{
public:
virtual ~IModelVertexBuffer() { }
virtual FModelVertex *LockVertexBuffer(unsigned int size) = 0;
virtual void UnlockVertexBuffer() = 0;
virtual unsigned int *LockIndexBuffer(unsigned int size) = 0;
virtual void UnlockIndexBuffer() = 0;
};