Files
2026-02-02 04:50:13 +01:00

175 lines
5.2 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
/*
* Copyright (C) 2006-2010 - Frictional Games
*
* This file is part of HPL1 Engine.
*/
#ifndef HPL_VERTEXBUFFER_H
#define HPL_VERTEXBUFFER_H
#include "hpl1/engine/graphics/GraphicsTypes.h"
#include "hpl1/engine/math/BoundingVolume.h"
#include "hpl1/engine/math/MathTypes.h"
#include "hpl1/engine/system/SystemTypes.h"
namespace hpl {
class cBoundingVolume;
enum eVertexBufferDrawType {
eVertexBufferDrawType_Tri,
eVertexBufferDrawType_Quad,
eVertexBufferDrawType_Lines,
eVertexBufferDrawType_LastEnum
};
enum eVertexBufferUsageType {
eVertexBufferUsageType_Static,
eVertexBufferUsageType_Dynamic,
eVertexBufferUsageType_Stream,
eVertexBufferUsageType_LastEnum
};
typedef tFlag tVertexFlag;
#define eVertexFlag_Normal (0x00000001)
#define eVertexFlag_Position (0x00000002)
#define eVertexFlag_Color0 (0x00000004)
#define eVertexFlag_Color1 (0x00000008)
#define eVertexFlag_Texture0 (0x00000010)
#define eVertexFlag_Texture1 (0x00000020)
#define eVertexFlag_Texture2 (0x00000040)
#define eVertexFlag_Texture3 (0x00000080)
#define eVertexFlag_Texture4 (0x00000100)
#define klNumOfVertexFlags (9)
const tVertexFlag kvVertexFlags[] = {eVertexFlag_Normal, eVertexFlag_Position, eVertexFlag_Color0,
eVertexFlag_Color1, eVertexFlag_Texture0, eVertexFlag_Texture1, eVertexFlag_Texture2,
eVertexFlag_Texture3, eVertexFlag_Texture4};
const int kvVertexElements[] = {
3, // Normal
4, // Position
4, // Color0
4, // Color1
3, // Texture0
3, // Texture1
3, // Texture2
3, // Texture3
3 // Texture4
};
typedef tFlag tVertexCompileFlag;
#define eVertexCompileFlag_CreateTangents (0x00000001)
class iLowLevelGraphics;
class iVertexBuffer {
public:
iVertexBuffer(iLowLevelGraphics *apLowLevelGraphics, tVertexFlag aFlags,
eVertexBufferDrawType aDrawType, eVertexBufferUsageType aUsageType,
int alReserveVtxSize, int alReserveIdxSize) : mVertexFlags(aFlags), mpLowLevelGraphics(apLowLevelGraphics),
mDrawType(aDrawType), mUsageType(aUsageType), mlElementNum(-1),
mbTangents(false) {}
virtual ~iVertexBuffer() {}
tVertexFlag GetFlags() { return mVertexFlags; }
virtual void AddVertex(tVertexFlag aType, const cVector3f &avVtx) = 0;
virtual void AddColor(tVertexFlag aType, const cColor &aColor) = 0;
virtual void AddIndex(unsigned int alIndex) = 0;
virtual bool Compile(tVertexCompileFlag aFlags) = 0;
virtual void UpdateData(tVertexFlag aTypes, bool abIndices) = 0;
/**
* This creates a double of the vertex array with w=0.
* \param abUpdateData if the hardware buffer should be updated as well.
*/
virtual void CreateShadowDouble(bool abUpdateData) = 0;
/**
* Transform the entire buffer with transform.
*/
virtual void Transform(const cMatrixf &mtxTransform) = 0;
virtual void Draw(eVertexBufferDrawType aDrawType = eVertexBufferDrawType_LastEnum) = 0;
virtual void DrawIndices(unsigned int *apIndices, int alCount,
eVertexBufferDrawType aDrawType = eVertexBufferDrawType_LastEnum) = 0;
virtual void Bind() = 0;
virtual void UnBind() = 0;
virtual iVertexBuffer *CreateCopy(eVertexBufferUsageType aUsageType) = 0;
virtual cBoundingVolume CreateBoundingVolume() = 0;
virtual float *GetArray(tVertexFlag aType) = 0;
virtual unsigned int *GetIndices() = 0;
virtual int GetVertexNum() = 0;
virtual int GetIndexNum() = 0;
/**
* Resizes an array to a custom size, the size is number of elements and NOT number of vertices.
*/
virtual void ResizeArray(tVertexFlag aType, int alSize) = 0;
virtual void ResizeIndices(int alSize) = 0;
// For debugging purposes, quite slow to use.
virtual cVector3f GetVector3(tVertexFlag aType, unsigned alIdx) = 0;
virtual cVector3f GetVector4(tVertexFlag aType, unsigned alIdx) = 0;
virtual cColor GetColor(tVertexFlag aType, unsigned alIdx) = 0;
virtual unsigned int GetIndex(tVertexFlag aType, unsigned alIdx) = 0;
/**
* Set the number of of elements to draw.
* \param alNum If < 0, draw all indices.
*/
void SetElementNum(int alNum) { mlElementNum = alNum; }
int GetElementNum() { return mlElementNum; }
tVertexFlag GetVertexFlags() { return mVertexFlags; }
bool HasTangents() { return mbTangents; }
void SetTangents(bool abX) { mbTangents = abX; }
protected:
tVertexFlag mVertexFlags;
eVertexBufferDrawType mDrawType;
eVertexBufferUsageType mUsageType;
iLowLevelGraphics *mpLowLevelGraphics;
int mlElementNum;
bool mbTangents;
};
} // namespace hpl
#endif // HPL_RENDERER3D_H