mirror of
https://github.com/rwengine/openrw.git
synced 2024-11-23 02:42:39 +01:00
Improved Collision data loading and debugging.
- Removed interleaved data from CollisionInstance as Bullet didn't understand. - Improved performance of the DebugDraw to around 2-3 fps
This commit is contained in:
parent
46c400e078
commit
04a8a7d9c5
@ -13,7 +13,8 @@ DebugDraw::DebugDraw()
|
||||
{
|
||||
glGenBuffers(1, &vbo);
|
||||
glGenVertexArrays(1, &vao);
|
||||
glGenTextures(1, &texture);
|
||||
glGenTextures(1, &texture);
|
||||
maxlines = 0;
|
||||
}
|
||||
|
||||
DebugDraw::~DebugDraw()
|
||||
@ -25,41 +26,14 @@ DebugDraw::~DebugDraw()
|
||||
|
||||
void DebugDraw::drawLine(const btVector3 &from, const btVector3 &to, const btVector3 &color)
|
||||
{
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, texture);
|
||||
float img[] = {color.getX(), color.getY(), color.getZ()};
|
||||
glTexImage2D(
|
||||
GL_TEXTURE_2D, 0, GL_RGB, 1, 1,
|
||||
0, GL_RGB, GL_FLOAT, img
|
||||
);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
|
||||
float verts[] = {
|
||||
from.getX(), from.getY(), from.getZ(),
|
||||
to.getX(), to.getY(), to.getZ(),
|
||||
};
|
||||
GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
|
||||
GLint uniModel = glGetUniformLocation(shaderProgram, "model");
|
||||
|
||||
glBindVertexArray(vao);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
||||
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STREAM_DRAW);
|
||||
|
||||
glEnableVertexAttribArray(posAttrib);
|
||||
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);
|
||||
|
||||
glm::mat4 model;
|
||||
glUniformMatrix4fv(uniModel, 1, GL_FALSE, glm::value_ptr(model));
|
||||
|
||||
glDrawArrays(GL_LINES, 0, 2);
|
||||
lines.push_back(glm::vec3(from.getX(), from.getY(), from.getZ()));
|
||||
lines.push_back(glm::vec3(to.getX(), to.getY(), to.getZ()));
|
||||
this->color = color;
|
||||
}
|
||||
|
||||
void DebugDraw::drawTriangle(const btVector3 &a, const btVector3 &b, const btVector3 &c, const btVector3 &color, btScalar alpha)
|
||||
{
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
/*glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, texture);
|
||||
float img[] = {color.getX(), color.getY(), color.getZ()};
|
||||
glTexImage2D(
|
||||
@ -90,7 +64,7 @@ void DebugDraw::drawTriangle(const btVector3 &a, const btVector3 &b, const btVec
|
||||
glm::mat4 model;
|
||||
glUniformMatrix4fv(uniModel, 1, GL_FALSE, glm::value_ptr(model));
|
||||
|
||||
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||
glDrawArrays(GL_TRIANGLES, 0, 3);*/
|
||||
}
|
||||
|
||||
void DebugDraw::drawContactPoint(const btVector3 &pointOnB, const btVector3 &normalOnB, btScalar distance, int lifeTime, const btVector3 &color)
|
||||
@ -98,6 +72,50 @@ void DebugDraw::drawContactPoint(const btVector3 &pointOnB, const btVector3 &nor
|
||||
|
||||
}
|
||||
|
||||
void DebugDraw::drawAllLines()
|
||||
{
|
||||
if(lines.size() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, texture);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, texture);
|
||||
float img[] = {color.getX(), color.getY(), color.getZ()};
|
||||
glTexImage2D(
|
||||
GL_TEXTURE_2D, 0, GL_RGB, 1, 1,
|
||||
0, GL_RGB, GL_FLOAT, img
|
||||
);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
|
||||
GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
|
||||
GLint uniModel = glGetUniformLocation(shaderProgram, "model");
|
||||
|
||||
glBindVertexArray(vao);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
||||
if( lines.size() > maxlines ) {
|
||||
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * lines.size(), &lines[0].x, GL_STREAM_DRAW);
|
||||
}
|
||||
else {
|
||||
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(glm::vec3) * lines.size(), &lines[0].x);
|
||||
}
|
||||
maxlines = std::max(maxlines, lines.size());
|
||||
|
||||
glEnableVertexAttribArray(posAttrib);
|
||||
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);
|
||||
|
||||
glm::mat4 model;
|
||||
glUniformMatrix4fv(uniModel, 1, GL_FALSE, glm::value_ptr(model));
|
||||
|
||||
glDrawArrays(GL_LINES, 0, lines.size());
|
||||
|
||||
lines.clear();
|
||||
}
|
||||
|
||||
void DebugDraw::reportErrorWarning(const char *warningString)
|
||||
{
|
||||
std::cerr << warningString << std::endl;
|
||||
|
@ -160,8 +160,8 @@ bool GTAEngine::placeItems(const std::string& name)
|
||||
if( physInst.triangles.size() > 0 ) {
|
||||
btTriangleIndexVertexArray* vertarray = new btTriangleIndexVertexArray(
|
||||
physInst.triangles.size(),
|
||||
(int*) &(physInst.triangles.data()->a),
|
||||
sizeof(CollTFace),
|
||||
(int*) physInst.triangles.data(),
|
||||
sizeof(CollTFaceTriangle),
|
||||
physInst.vertices.size(),
|
||||
&(physInst.vertices[0].x),
|
||||
sizeof(glm::vec3)
|
||||
|
@ -33,7 +33,7 @@ bool LoaderCOL::load(char* data, const size_t size)
|
||||
std::vector<CollTSphere> spheres;
|
||||
std::vector<CollTBox> boxes;
|
||||
std::vector<CollTVertex> meshvertices;
|
||||
std::vector<CollTFaceV1> meshfaces;
|
||||
std::vector<CollTFaceTriangle> meshfaces;
|
||||
|
||||
if(version >= 2)
|
||||
{
|
||||
@ -97,12 +97,12 @@ bool LoaderCOL::load(char* data, const size_t size)
|
||||
CollTFaceV1 face = readType<CollTFaceV1>(data, &dataI);
|
||||
size_t maxv = std::max(face.a, std::max(face.b, face.c));
|
||||
maxvert = std::max( maxvert, maxv );
|
||||
meshfaces.push_back(face);
|
||||
meshfaces.push_back({face.a, face.b, face.c});
|
||||
}
|
||||
|
||||
// Load up to maxvert vertices.
|
||||
meshvertices.reserve(maxvert);
|
||||
for( size_t v = 0, vertI = head2.offsetverts; v < maxvert; ++v ) {
|
||||
meshvertices.reserve(maxvert+1);
|
||||
for( size_t v = 0, vertI = head2.offsetverts; v < maxvert+1; ++v ) {
|
||||
CollTVertex vert = readType<CollTVertex>(data, &vertI);
|
||||
meshvertices.push_back(vert);
|
||||
}
|
||||
|
@ -58,9 +58,9 @@ typedef glm::vec3 CollTVertex;
|
||||
|
||||
struct CollTFace
|
||||
{
|
||||
uint16_t a, b, c;
|
||||
uint8_t material;
|
||||
uint8_t light;
|
||||
uint16_t a, b, c;
|
||||
uint8_t material;
|
||||
uint8_t light;
|
||||
};
|
||||
|
||||
struct CollTFaceV1
|
||||
@ -69,6 +69,17 @@ struct CollTFaceV1
|
||||
CollTSurface surface;
|
||||
};
|
||||
|
||||
struct CollTFaceTriangle
|
||||
{
|
||||
uint32_t a, b, c;
|
||||
};
|
||||
|
||||
struct CollTFaceData
|
||||
{
|
||||
uint8_t material;
|
||||
uint8_t light;
|
||||
};
|
||||
|
||||
struct CollTHeader
|
||||
{
|
||||
char magic[4];
|
||||
@ -113,7 +124,7 @@ public:
|
||||
std::vector<CollTSphere> spheres;
|
||||
std::vector<CollTBox> boxes;
|
||||
std::vector<CollTVertex> vertices;
|
||||
std::vector<CollTFaceV1> triangles;
|
||||
std::vector<CollTFaceTriangle> triangles;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -4,6 +4,8 @@
|
||||
|
||||
#define GLEW_STATIC
|
||||
#include <GL/glew.h>
|
||||
#include <vector>
|
||||
#include <glm/glm.hpp>
|
||||
|
||||
class DebugDraw : public btIDebugDraw
|
||||
{
|
||||
@ -19,12 +21,20 @@ public:
|
||||
void setDebugMode(int debugMode);
|
||||
int getDebugMode() const;
|
||||
|
||||
void drawAllLines();
|
||||
|
||||
void setShaderProgram(GLuint shaderProgram) {
|
||||
this->shaderProgram = shaderProgram;
|
||||
}
|
||||
|
||||
protected:
|
||||
int debugMode;
|
||||
|
||||
std::vector<glm::vec3> lines;
|
||||
size_t maxlines;
|
||||
|
||||
btVector3 color;
|
||||
|
||||
GLuint shaderProgram;
|
||||
|
||||
GLuint vbo, vao, texture;
|
||||
|
@ -24,6 +24,8 @@ sf::RenderWindow window;
|
||||
|
||||
GTAEngine* gta = nullptr;
|
||||
|
||||
DebugDraw* debugDrawer = nullptr;
|
||||
|
||||
glm::vec3 plyPos;
|
||||
glm::vec2 plyLook;
|
||||
float moveSpeed = 20.0f;
|
||||
@ -98,10 +100,10 @@ void init(std::string gtapath)
|
||||
if((k++ % 4) == 0) { spawnPos += glm::vec3(-20, -15, 0); }
|
||||
}
|
||||
|
||||
DebugDraw* debg = new DebugDraw;
|
||||
debg->setShaderProgram(gta->renderer.worldProgram);
|
||||
debg->setDebugMode(btIDebugDraw::DBG_DrawWireframe);
|
||||
gta->dynamicsWorld->setDebugDrawer(debg);
|
||||
debugDrawer = new DebugDraw;
|
||||
debugDrawer->setShaderProgram(gta->renderer.worldProgram);
|
||||
debugDrawer->setDebugMode(btIDebugDraw::DBG_DrawWireframe);
|
||||
gta->dynamicsWorld->setDebugDrawer(debugDrawer);
|
||||
}
|
||||
|
||||
void update(float dt)
|
||||
@ -170,6 +172,7 @@ void render()
|
||||
glUniformMatrix4fv(gta->renderer.uniView, 1, GL_FALSE, glm::value_ptr(view));
|
||||
glUniformMatrix4fv(gta->renderer.uniProj, 1, GL_FALSE, glm::value_ptr(proj));
|
||||
gta->dynamicsWorld->debugDrawWorld();
|
||||
debugDrawer->drawAllLines();
|
||||
}
|
||||
else {
|
||||
gta->renderer.renderWorld(gta);
|
||||
|
Loading…
Reference in New Issue
Block a user