Vbo added.
This commit is contained in:
parent
d403de71f8
commit
2acaf1a503
|
|
@ -164,6 +164,9 @@ unsigned int Nexus::AddPatch(unsigned int nvert, unsigned int nface,
|
||||||
return index.size() -1;
|
return index.size() -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Nexus::SetRamBufferSize(unsigned int r_size) {
|
||||||
|
patches.SetRamBufferSize(r_size);
|
||||||
|
}
|
||||||
|
|
||||||
void Nexus::Join(const std::set<unsigned int> &patches,
|
void Nexus::Join(const std::set<unsigned int> &patches,
|
||||||
std::vector<Point3f> &newvert,
|
std::vector<Point3f> &newvert,
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,9 @@ class Nexus {
|
||||||
bool HasColors() { return (signature & NXS_COLORS) != 0; }
|
bool HasColors() { return (signature & NXS_COLORS) != 0; }
|
||||||
bool HasNormalsShort() { return (signature & NXS_NORMALS_SHORT) != 0; }
|
bool HasNormalsShort() { return (signature & NXS_NORMALS_SHORT) != 0; }
|
||||||
bool HasNormalsFloat() { return (signature & NXS_NORMALS_FLOAT) != 0; }
|
bool HasNormalsFloat() { return (signature & NXS_NORMALS_FLOAT) != 0; }
|
||||||
|
|
||||||
|
void SetRamBufferSize(unsigned int ram_size);
|
||||||
|
|
||||||
//MOVE to nexus_build.cpp
|
//MOVE to nexus_build.cpp
|
||||||
void Join(const std::set<unsigned int> &patches,
|
void Join(const std::set<unsigned int> &patches,
|
||||||
std::vector<vcg::Point3f> &vert,
|
std::vector<vcg::Point3f> &vert,
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,7 @@ void Policy::NodeVisited(Node *node) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NexusMt::NexusMt(): vbo(VBO_AUTO), vbo_size(0),
|
NexusMt::NexusMt(): vbo_mode(VBO_AUTO),
|
||||||
metric(NULL), mode(SMOOTH) {
|
metric(NULL), mode(SMOOTH) {
|
||||||
metric = new FrustumMetric();
|
metric = new FrustumMetric();
|
||||||
metric->index = &index;
|
metric->index = &index;
|
||||||
|
|
@ -115,18 +115,26 @@ bool NexusMt::Load(const string &filename, bool readonly) {
|
||||||
SetComponent(TEXTURE, true);
|
SetComponent(TEXTURE, true);
|
||||||
SetComponent(DATA, true);
|
SetComponent(DATA, true);
|
||||||
|
|
||||||
|
patches.vbos.resize(index.size());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NexusMt::InitGL() {
|
bool NexusMt::InitGL(Vbo mode, unsigned int vbosize) {
|
||||||
GLenum ret = glewInit();
|
GLenum ret = glewInit();
|
||||||
if(ret != GLEW_OK) return false;
|
if(ret != GLEW_OK) return false;
|
||||||
if(!GLEW_ARB_vertex_buffer_object)
|
if(!GLEW_ARB_vertex_buffer_object) {
|
||||||
vbo = VBO_OFF;
|
cerr << "No vbo available!" << endl;
|
||||||
|
vbo_mode = VBO_OFF;
|
||||||
|
}
|
||||||
|
if(vbo_mode == VBO_OFF) {
|
||||||
|
patches.vbo_size = vbosize / patches.chunk_size;
|
||||||
|
patches.vbos.resize(0);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NexusMt::Render() {
|
void NexusMt::Render() {
|
||||||
|
patches.Flush();
|
||||||
Frustumf frustum;
|
Frustumf frustum;
|
||||||
frustum.GetView();
|
frustum.GetView();
|
||||||
|
|
||||||
|
|
@ -156,15 +164,36 @@ void NexusMt::Render() {
|
||||||
|
|
||||||
tri_rendered += entry.nface;
|
tri_rendered += entry.nface;
|
||||||
|
|
||||||
Patch &patch = GetPatch(cell);
|
Patch &patch = GetPatch(cell, false);
|
||||||
|
char *fstart;
|
||||||
|
char *vstart;
|
||||||
|
char *cstart;
|
||||||
|
char *nstart;
|
||||||
|
|
||||||
assert(patch.start);
|
if(vbo_mode != VBO_OFF) {
|
||||||
|
VboBuffer &vbo = patches.GetVbo(cell);
|
||||||
|
assert(vbo.index);
|
||||||
|
assert(vbo.vertex);
|
||||||
|
|
||||||
glVertexPointer(3, GL_FLOAT, 0, patch.VertBegin());
|
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo.vertex);
|
||||||
|
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vbo.index);
|
||||||
|
|
||||||
|
fstart = NULL;
|
||||||
|
vstart = NULL;
|
||||||
|
cstart = (char *)(sizeof(float) * patch.cstart);
|
||||||
|
nstart = (char *)(sizeof(float) * patch.nstart);
|
||||||
|
} else {
|
||||||
|
fstart = (char *)patch.FaceBegin();
|
||||||
|
vstart = (char *)patch.VertBegin();
|
||||||
|
cstart = (char *)patch.ColorBegin();
|
||||||
|
nstart = (char *)patch.Norm16Begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
glVertexPointer(3, GL_FLOAT, 0, vstart);
|
||||||
if(use_colors)
|
if(use_colors)
|
||||||
glColorPointer(4, GL_UNSIGNED_BYTE, 0, patch.ColorBegin());
|
glColorPointer(4, GL_UNSIGNED_BYTE, 0, cstart);
|
||||||
if(use_normals)
|
if(use_normals)
|
||||||
glNormalPointer(GL_SHORT, 8, patch.Norm16Begin());
|
glNormalPointer(GL_SHORT, 8, nstart);
|
||||||
|
|
||||||
switch(mode) {
|
switch(mode) {
|
||||||
case POINTS:
|
case POINTS:
|
||||||
|
|
@ -174,10 +203,10 @@ void NexusMt::Render() {
|
||||||
case SMOOTH:
|
case SMOOTH:
|
||||||
if(signature & NXS_FACES)
|
if(signature & NXS_FACES)
|
||||||
glDrawElements(GL_TRIANGLES, patch.nf * 3,
|
glDrawElements(GL_TRIANGLES, patch.nf * 3,
|
||||||
GL_UNSIGNED_SHORT, patch.FaceBegin());
|
GL_UNSIGNED_SHORT, fstart);
|
||||||
else if(signature & NXS_STRIP)
|
else if(signature & NXS_STRIP)
|
||||||
glDrawElements(GL_TRIANGLE_STRIP, patch.nf,
|
glDrawElements(GL_TRIANGLE_STRIP, patch.nf,
|
||||||
GL_UNSIGNED_SHORT, patch.FaceBegin());
|
GL_UNSIGNED_SHORT, fstart);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
cerr << "Unsupported rendering mode sorry\n";
|
cerr << "Unsupported rendering mode sorry\n";
|
||||||
|
|
@ -190,7 +219,7 @@ void NexusMt::Render() {
|
||||||
glDisableClientState(GL_NORMAL_ARRAY);
|
glDisableClientState(GL_NORMAL_ARRAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NexusMt::SetRamSize(unsigned int r_size) {
|
void NexusMt::SetRamExtractionSize(unsigned int r_size) {
|
||||||
policy.ram_size = r_size/patches.chunk_size;
|
policy.ram_size = r_size/patches.chunk_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -203,13 +232,8 @@ void NexusMt::SetError(float error) {
|
||||||
policy.error = error;
|
policy.error = error;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NexusMt::SetVbo(Vbo _vbo, unsigned int _vbo_size,
|
void NexusMt::SetVboSize(unsigned int _vbo_size) {
|
||||||
unsigned int _ram_size) {
|
patches.vbo_size = _vbo_size;
|
||||||
vbo = _vbo;
|
|
||||||
if(!GLEW_ARB_vertex_buffer_object)
|
|
||||||
vbo = VBO_OFF;
|
|
||||||
vbo_size = _vbo_size;
|
|
||||||
patches.ram_size = _ram_size/chunk_size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NexusMt::SetMode(Mode _mode) {
|
bool NexusMt::SetMode(Mode _mode) {
|
||||||
|
|
@ -448,4 +472,5 @@ void NexusMt::VisitNode(Node *node, vector<TNode> &heap) {
|
||||||
|
|
||||||
node->visited = true;
|
node->visited = true;
|
||||||
policy.NodeVisited(node);
|
policy.NodeVisited(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ namespace nxs {
|
||||||
TNode(Node *n, float e): node(n), error(e) {}
|
TNode(Node *n, float e): node(n), error(e) {}
|
||||||
bool operator<(const TNode &n) { return error < n.error; }
|
bool operator<(const TNode &n) { return error < n.error; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class Metric {
|
class Metric {
|
||||||
public:
|
public:
|
||||||
vector<Nexus::PatchInfo> *index;
|
vector<Nexus::PatchInfo> *index;
|
||||||
|
|
@ -74,11 +74,11 @@ namespace nxs {
|
||||||
class NexusMt: public Nexus {
|
class NexusMt: public Nexus {
|
||||||
private:
|
private:
|
||||||
std::vector<Node> nodes;
|
std::vector<Node> nodes;
|
||||||
|
std::vector<VboBuffer> vbos;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
//Vertex buffer object mode
|
//Vertex buffer object mode
|
||||||
enum Vbo { VBO_AUTO, //autodetect best size (fallback if not VBO)
|
enum Vbo { VBO_AUTO, //autodetect best size
|
||||||
VBO_AUTO_ON, //autodetect best size must use VBO
|
|
||||||
VBO_OFF, //no vertex buffer object
|
VBO_OFF, //no vertex buffer object
|
||||||
VBO_FIXED }; //user supplied size
|
VBO_FIXED }; //user supplied size
|
||||||
|
|
||||||
|
|
@ -99,8 +99,7 @@ class NexusMt: public Nexus {
|
||||||
TEXTURE = 0x4,
|
TEXTURE = 0x4,
|
||||||
DATA = 0x8};
|
DATA = 0x8};
|
||||||
|
|
||||||
Vbo vbo;
|
Vbo vbo_mode;
|
||||||
unsigned int vbo_size;
|
|
||||||
|
|
||||||
Metric *metric;
|
Metric *metric;
|
||||||
Policy policy;
|
Policy policy;
|
||||||
|
|
@ -121,15 +120,14 @@ class NexusMt: public Nexus {
|
||||||
~NexusMt();
|
~NexusMt();
|
||||||
|
|
||||||
bool Load(const std::string &filename, bool readonly = true);
|
bool Load(const std::string &filename, bool readonly = true);
|
||||||
bool InitGL();
|
bool InitGL(Vbo mode = VBO_AUTO, unsigned int vbo_size = 0);
|
||||||
|
|
||||||
void Render();
|
void Render();
|
||||||
|
|
||||||
void SetMetric(MetricKind kind);
|
void SetMetric(MetricKind kind);
|
||||||
void SetError(float error);
|
void SetError(float error);
|
||||||
void SetRamSize(unsigned int ram_size);
|
void SetRamExtractionSize(unsigned int ram_size);
|
||||||
void SetVbo(Vbo mode, unsigned int vbo_size = 0,
|
void SetVboSize(unsigned int vbo_size);
|
||||||
unsigned int ram_size = 128000000);
|
|
||||||
|
|
||||||
bool SetMode(Mode mode);
|
bool SetMode(Mode mode);
|
||||||
bool SetComponent(Component c, bool on);
|
bool SetComponent(Component c, bool on);
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.14 2004/10/14 13:52:02 ponchio
|
||||||
|
Small changes.
|
||||||
|
|
||||||
Revision 1.13 2004/10/14 13:41:34 ponchio
|
Revision 1.13 2004/10/14 13:41:34 ponchio
|
||||||
Added statistics.
|
Added statistics.
|
||||||
|
|
||||||
|
|
@ -47,7 +50,6 @@ Backup
|
||||||
|
|
||||||
Revision 1.6 2004/09/17 15:25:09 ponchio
|
Revision 1.6 2004/09/17 15:25:09 ponchio
|
||||||
First working (hopefully) release.
|
First working (hopefully) release.
|
||||||
|
|
||||||
Revision 1.5 2004/09/16 14:25:16 ponchio
|
Revision 1.5 2004/09/16 14:25:16 ponchio
|
||||||
Backup. (lot of changes).
|
Backup. (lot of changes).
|
||||||
|
|
||||||
|
|
@ -94,7 +96,7 @@ using namespace std;
|
||||||
|
|
||||||
#include <GL/gl.h>
|
#include <GL/gl.h>
|
||||||
#include <GL/glu.h>
|
#include <GL/glu.h>
|
||||||
|
#include <GL/glut.h>
|
||||||
|
|
||||||
#include <wrap/gui/trackball.h>
|
#include <wrap/gui/trackball.h>
|
||||||
#include "stopwatch.h"
|
#include "stopwatch.h"
|
||||||
|
|
@ -107,7 +109,7 @@ bool fullscreen = false;
|
||||||
int width =1024;
|
int width =1024;
|
||||||
int height = 768;
|
int height = 768;
|
||||||
|
|
||||||
//TrackHand hand;
|
void gl_print(float x, float y, char *str);
|
||||||
|
|
||||||
SDL_Surface *screen = NULL;
|
SDL_Surface *screen = NULL;
|
||||||
|
|
||||||
|
|
@ -206,9 +208,11 @@ int main(int argc, char *argv[]) {
|
||||||
unsigned int ram_size = 640000;
|
unsigned int ram_size = 640000;
|
||||||
|
|
||||||
nexus.SetError(error);
|
nexus.SetError(error);
|
||||||
nexus.SetRamSize(ram_size);
|
nexus.SetRamExtractionSize(ram_size);
|
||||||
nexus.SetMetric(NexusMt::FRUSTUM);
|
nexus.SetMetric(NexusMt::FRUSTUM);
|
||||||
|
if(!nexus.InitGL()) {
|
||||||
|
cerr << "Could not init glew.\n";
|
||||||
|
}
|
||||||
|
|
||||||
glClearColor(0, 0, 0, 0);
|
glClearColor(0, 0, 0, 0);
|
||||||
glEnable(GL_LIGHTING);
|
glEnable(GL_LIGHTING);
|
||||||
|
|
@ -242,11 +246,11 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
case SDLK_LEFT:
|
case SDLK_LEFT:
|
||||||
ram_size *= 0.7;
|
ram_size *= 0.7;
|
||||||
nexus.SetRamSize(ram_size);
|
nexus.SetRamExtractionSize(ram_size);
|
||||||
cerr << "Max extraction ram size: " << ram_size << endl; break;
|
cerr << "Max extraction ram size: " << ram_size << endl; break;
|
||||||
case SDLK_RIGHT:
|
case SDLK_RIGHT:
|
||||||
ram_size *= 1.5;
|
ram_size *= 1.5;
|
||||||
nexus.SetRamSize(ram_size);
|
nexus.SetRamExtractionSize(ram_size);
|
||||||
cerr << "Max extraction ram size: " << ram_size << endl; break;
|
cerr << "Max extraction ram size: " << ram_size << endl; break;
|
||||||
|
|
||||||
case SDLK_s: metric = NexusMt::FRUSTUM; break;
|
case SDLK_s: metric = NexusMt::FRUSTUM; break;
|
||||||
|
|
@ -356,13 +360,50 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
//cerr Do some reporting:
|
//cerr Do some reporting:
|
||||||
if(show_statistics) {
|
if(show_statistics) {
|
||||||
cerr << "Ram used : " << nexus.policy.ram_used << endl;
|
glMatrixMode(GL_MODELVIEW);
|
||||||
cerr << "Tri drawn: " << nexus.tri_rendered << endl;
|
glPushMatrix();
|
||||||
cerr << "Tri tot : " << nexus.tri_total << endl;
|
glLoadIdentity();
|
||||||
cerr << "Ram flushed: " << nexus.patches.ram_flushed << endl;
|
glMatrixMode(GL_PROJECTION);
|
||||||
cerr << "Ram readed: " << nexus.patches.ram_readed << endl;
|
glPushMatrix();
|
||||||
nexus.patches.ram_flushed = 0;
|
glLoadIdentity();
|
||||||
nexus.patches.ram_readed = 0;
|
gluOrtho2D(0, 1, 0, 1);
|
||||||
|
|
||||||
|
|
||||||
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
glDisable(GL_LIGHTING);
|
||||||
|
char buffer[1024];
|
||||||
|
glColor3f(1.0f, 1.0f, 1.0f);
|
||||||
|
|
||||||
|
sprintf(buffer, "Ram size : %.3fMb (max) %.3fMb (cur)",
|
||||||
|
nexus.patches.ram_size * nexus.chunk_size/(float)(1<<20),
|
||||||
|
nexus.patches.ram_used * nexus.chunk_size/(float)(1<<20));
|
||||||
|
gl_print(0.03, 0.12, buffer);
|
||||||
|
|
||||||
|
sprintf(buffer, "Extr size: %.3fMb(max) %.3fMb(cur)",
|
||||||
|
nexus.policy.ram_size * nexus.chunk_size/(float)(1<<20),
|
||||||
|
nexus.policy.ram_used * nexus.chunk_size/(float)(1<<20));
|
||||||
|
gl_print(0.03, 0.09, buffer);
|
||||||
|
|
||||||
|
sprintf(buffer, "Vbo size : %.3fMb(max) %.3fMb(cur)",
|
||||||
|
nexus.patches.vbo_size * nexus.chunk_size/(float)(1<<20),
|
||||||
|
nexus.patches.vbo_used * nexus.chunk_size/(float)(1<<20));
|
||||||
|
gl_print(0.03, 0.06, buffer);
|
||||||
|
|
||||||
|
sprintf(buffer, "Triangles: %.2fK (tot) %.2fK (vis)",
|
||||||
|
nexus.tri_total/(float)(1<<10),
|
||||||
|
nexus.tri_rendered/(float)(1<<10));
|
||||||
|
gl_print(0.03, 0.03, buffer);
|
||||||
|
|
||||||
|
|
||||||
|
/* cerr << "Ram flushed: " << nexus.patches.ram_flushed << endl;
|
||||||
|
cerr << "Ram readed: " << nexus.patches.ram_readed << endl;*/
|
||||||
|
nexus.patches.ram_flushed = 0;
|
||||||
|
nexus.patches.ram_readed = 0;
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
glEnable(GL_LIGHTING);
|
||||||
|
glPopMatrix();
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
glPopMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_GL_SwapBuffers();
|
SDL_GL_SwapBuffers();
|
||||||
|
|
@ -374,4 +415,11 @@ int main(int argc, char *argv[]) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gl_print(float x, float y, char *str) {
|
||||||
|
glRasterPos2f(x, y);
|
||||||
|
int len = strlen(str);
|
||||||
|
for(int i = 0; i < len; i++)
|
||||||
|
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, str[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
#include <GL/glew.h>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace nxs;
|
using namespace nxs;
|
||||||
|
|
||||||
|
|
@ -16,6 +18,9 @@ bool PatchServer::Create(const std::string &filename,
|
||||||
ram_size = rsize;
|
ram_size = rsize;
|
||||||
ram_used = 0;
|
ram_used = 0;
|
||||||
|
|
||||||
|
vbo_size = 0;
|
||||||
|
vbo_used = 0;
|
||||||
|
|
||||||
ram_readed = 0;
|
ram_readed = 0;
|
||||||
ram_flushed = 0;
|
ram_flushed = 0;
|
||||||
lru.clear();
|
lru.clear();
|
||||||
|
|
@ -33,6 +38,8 @@ bool PatchServer::Load(const std::string &filename, Signature sig,
|
||||||
|
|
||||||
ram_readed = 0;
|
ram_readed = 0;
|
||||||
ram_flushed = 0;
|
ram_flushed = 0;
|
||||||
|
vbo_size = 0;
|
||||||
|
vbo_used = 0;
|
||||||
lru.clear();
|
lru.clear();
|
||||||
return File::Load(filename, readonly);
|
return File::Load(filename, readonly);
|
||||||
}
|
}
|
||||||
|
|
@ -146,6 +153,38 @@ Patch &PatchServer::GetPatch(unsigned int idx,
|
||||||
return *(entry.patch);
|
return *(entry.patch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VboBuffer &PatchServer::GetVbo(unsigned int p) {
|
||||||
|
VboBuffer &buffer = vbos[p];
|
||||||
|
if(buffer.index) return buffer;
|
||||||
|
|
||||||
|
//TODO cerr << "Adding vbo: " << p << endl;
|
||||||
|
assert(patches[p].patch);
|
||||||
|
Patch &patch = *patches[p].patch;
|
||||||
|
|
||||||
|
glGenBuffersARB(1, &buffer.index);
|
||||||
|
assert(buffer.index);
|
||||||
|
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, buffer.index);
|
||||||
|
|
||||||
|
unsigned int size = patch.nf * sizeof(unsigned short);
|
||||||
|
if((signature & NXS_FACES) != 0) size *= 3;
|
||||||
|
|
||||||
|
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, size, patch.FaceBegin(),
|
||||||
|
GL_STATIC_DRAW_ARB);
|
||||||
|
|
||||||
|
//TODO fix this when we allow data :p
|
||||||
|
size = sizeof(float) * patch.dstart;
|
||||||
|
|
||||||
|
glGenBuffersARB(1, &buffer.vertex);
|
||||||
|
glBindBufferARB(GL_ARRAY_BUFFER_ARB, buffer.vertex);
|
||||||
|
|
||||||
|
glBufferDataARB(GL_ARRAY_BUFFER_ARB, size, patch.VertBegin(),
|
||||||
|
GL_STATIC_DRAW_ARB);
|
||||||
|
|
||||||
|
vbo_used += patches[p].ram_size;
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void PatchServer::Flush() {
|
void PatchServer::Flush() {
|
||||||
|
|
||||||
if(ram_used < ram_size * 1.1) return;
|
if(ram_used < ram_size * 1.1) return;
|
||||||
|
|
@ -215,10 +254,22 @@ void PatchServer::Flush(unsigned int patch) {
|
||||||
delete entry.patch;
|
delete entry.patch;
|
||||||
entry.patch = NULL;
|
entry.patch = NULL;
|
||||||
entry.lru_pos = 0xffffffff;
|
entry.lru_pos = 0xffffffff;
|
||||||
|
if(FlushVbo(patch))
|
||||||
|
vbo_used -= entry.ram_size;
|
||||||
ram_used -= entry.ram_size;
|
ram_used -= entry.ram_size;
|
||||||
ram_flushed += entry.ram_size;
|
ram_flushed += entry.ram_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool PatchServer::FlushVbo(unsigned int patch) {
|
||||||
|
//TODO
|
||||||
|
//cerr << "Flushing vbo: " << patch << endl;
|
||||||
|
VboBuffer &buffer = vbos[patch];
|
||||||
|
if(!buffer.index) return false;
|
||||||
|
glDeleteBuffersARB(1, &buffer.index);
|
||||||
|
glDeleteBuffersARB(1, &buffer.vertex);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void PatchServer::SetRamBufferSize(unsigned int r_buffer) {
|
void PatchServer::SetRamBufferSize(unsigned int r_buffer) {
|
||||||
ram_size = (unsigned int)(r_buffer/chunk_size) + 1;
|
ram_size = (unsigned int)(r_buffer/chunk_size) + 1;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,14 @@ struct PatchEntry {
|
||||||
unsigned int lru_pos;
|
unsigned int lru_pos;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct VboBuffer {
|
||||||
|
VboBuffer(unsigned int v = 0, unsigned int i = 0):
|
||||||
|
vertex(v), index(i) {}
|
||||||
|
unsigned int vertex;
|
||||||
|
unsigned int index;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class PatchServer: public File {
|
class PatchServer: public File {
|
||||||
public:
|
public:
|
||||||
struct PTime {
|
struct PTime {
|
||||||
|
|
@ -34,6 +42,8 @@ class PatchServer: public File {
|
||||||
|
|
||||||
unsigned int ram_size;
|
unsigned int ram_size;
|
||||||
unsigned int ram_used;
|
unsigned int ram_used;
|
||||||
|
unsigned int vbo_size;
|
||||||
|
unsigned int vbo_used;
|
||||||
unsigned int frame;
|
unsigned int frame;
|
||||||
|
|
||||||
//statistics:
|
//statistics:
|
||||||
|
|
@ -53,15 +63,22 @@ class PatchServer: public File {
|
||||||
bool WriteEntries(FILE *fp);
|
bool WriteEntries(FILE *fp);
|
||||||
|
|
||||||
void AddPatch(unsigned short nvert, unsigned short nface);
|
void AddPatch(unsigned short nvert, unsigned short nface);
|
||||||
Patch &GetPatch(unsigned int patch, unsigned short nvert, unsigned short nface,
|
Patch &GetPatch(unsigned int patch,
|
||||||
|
unsigned short nvert, unsigned short nface,
|
||||||
bool flush = true);
|
bool flush = true);
|
||||||
|
|
||||||
|
VboBuffer &GetVbo(unsigned int patch);
|
||||||
|
|
||||||
|
void Flush(unsigned int patch);
|
||||||
|
//return false if was not allocated.
|
||||||
|
bool FlushVbo(unsigned int patch);
|
||||||
void Flush();
|
void Flush();
|
||||||
void FlushAll();
|
void FlushAll();
|
||||||
void Flush(unsigned int patch);
|
|
||||||
void SetRamBufferSize(unsigned int ram_buffer);
|
void SetRamBufferSize(unsigned int ram_buffer);
|
||||||
|
|
||||||
std::vector<PatchEntry> patches;
|
std::vector<PatchEntry> patches;
|
||||||
|
std::vector<VboBuffer> vbos;
|
||||||
std::vector<PTime> lru;
|
std::vector<PTime> lru;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.12 2004/10/15 11:41:03 ponchio
|
||||||
|
Tests and small changes.
|
||||||
|
|
||||||
Revision 1.11 2004/10/10 17:19:42 ponchio
|
Revision 1.11 2004/10/10 17:19:42 ponchio
|
||||||
Added compression and debugged.
|
Added compression and debugged.
|
||||||
|
|
||||||
|
|
@ -127,7 +130,7 @@ void VoronoiChain::Init(Crude &crude, float scaling, int steps) {
|
||||||
for(unsigned int v = 0; v < fine.size(); v++) {
|
for(unsigned int v = 0; v < fine.size(); v++) {
|
||||||
if(fcount[v] == 0) continue;
|
if(fcount[v] == 0) continue;
|
||||||
fine[v].p = fcentroids[v]/(float)fcount[v];
|
fine[v].p = fcentroids[v]/(float)fcount[v];
|
||||||
fine[v].weight = (float)pow(fcount[v]/(float)fine_vmean, 0.3f);
|
fine[v].weight = (float)pow(fcount[v]/(float)fine_vmean, 0.2f);
|
||||||
}
|
}
|
||||||
fine.Init();
|
fine.Init();
|
||||||
}
|
}
|
||||||
|
|
@ -138,7 +141,10 @@ void VoronoiChain::Init(Crude &crude, float scaling, int steps) {
|
||||||
if(fcount[i] > min_size)
|
if(fcount[i] > min_size)
|
||||||
seeds.push_back(fine[i]);
|
seeds.push_back(fine[i]);
|
||||||
}
|
}
|
||||||
swap(fine, seeds);
|
fine.clear();
|
||||||
|
for(unsigned int i = 0; i < seeds.size(); i++)
|
||||||
|
fine.push_back(seeds[i]);
|
||||||
|
|
||||||
if(fine.size() == 0) fine.push_back(Point3f(0,0,0));
|
if(fine.size() == 0) fine.push_back(Point3f(0,0,0));
|
||||||
fine.Init();
|
fine.Init();
|
||||||
|
|
||||||
|
|
@ -167,31 +173,12 @@ void VoronoiChain::Init(Crude &crude, float scaling, int steps) {
|
||||||
if(ccount[v] == 0) continue;
|
if(ccount[v] == 0) continue;
|
||||||
|
|
||||||
coarse[v].p = ccentroids[v]/(float)ccount[v];
|
coarse[v].p = ccentroids[v]/(float)ccount[v];
|
||||||
coarse[v].weight = (float)pow(ccount[v]/(float)coarse_vmean, 0.3f);
|
coarse[v].weight = (float)pow(ccount[v]/(float)coarse_vmean, 0.2f);
|
||||||
|
|
||||||
if(radius[v] == 0) continue;
|
if(radius[v] == 0) continue;
|
||||||
|
|
||||||
//repel from fine seeds
|
//repel from fine seeds
|
||||||
unsigned int atarget;
|
// coarse[v].p = fine.FindBorder(coarse[v].p, radius[v]);
|
||||||
float closest = fine.Closest(coarse[v].p, atarget);
|
|
||||||
Point3f dir = (coarse[v].p - fine[atarget].p).Normalize();
|
|
||||||
Point3f a = coarse[v].p;
|
|
||||||
Point3f b = fine[atarget].p + dir*radius[v]*1.1;
|
|
||||||
unsigned int btarget;
|
|
||||||
closest = fine.Closest(b, btarget);
|
|
||||||
if(atarget == btarget) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Point3f m;
|
|
||||||
for(unsigned int i = 0; i < 10; i++) {
|
|
||||||
m = (a + b)/2;
|
|
||||||
unsigned int mtarget;
|
|
||||||
fine.Closest(m, mtarget);
|
|
||||||
if(mtarget == atarget) a = m;
|
|
||||||
else if(mtarget == btarget) b = m;
|
|
||||||
else break;
|
|
||||||
}
|
|
||||||
coarse[v].p = m;
|
|
||||||
}
|
}
|
||||||
coarse.Init();
|
coarse.Init();
|
||||||
}
|
}
|
||||||
|
|
@ -203,7 +190,10 @@ void VoronoiChain::Init(Crude &crude, float scaling, int steps) {
|
||||||
if(ccount[i] > (int)min_size)
|
if(ccount[i] > (int)min_size)
|
||||||
seeds.push_back(coarse[i]);
|
seeds.push_back(coarse[i]);
|
||||||
}
|
}
|
||||||
swap(coarse, seeds);
|
coarse.clear();
|
||||||
|
for(unsigned int i = 0; i < seeds.size(); i++)
|
||||||
|
coarse.push_back(seeds[i]);
|
||||||
|
|
||||||
if(coarse.size() == 0) coarse.push_back(Point3f(0,0,0));
|
if(coarse.size() == 0) coarse.push_back(Point3f(0,0,0));
|
||||||
coarse.Init();
|
coarse.Init();
|
||||||
|
|
||||||
|
|
@ -429,14 +419,11 @@ void VoronoiChain::BuildLevel(Nexus &nexus, unsigned int offset,
|
||||||
|
|
||||||
coarse[v].p = ccentroids[v]/(float)ccount[v];
|
coarse[v].p = ccentroids[v]/(float)ccount[v];
|
||||||
//0.3 is related to the fact is doubled the box size.
|
//0.3 is related to the fact is doubled the box size.
|
||||||
coarse[v].weight = (float)pow(ccount[v]/(float)coarse_vmean, 0.3f);
|
coarse[v].weight = (float)pow(ccount[v]/(float)coarse_vmean, 0.2f);
|
||||||
|
|
||||||
if(radius[v] == 0) continue;
|
if(radius[v] == 0) continue;
|
||||||
|
//coarse[v].p = fine.FindBorder(coarse[v].p, radius[v]);
|
||||||
//repel from fine seeds
|
|
||||||
|
|
||||||
}
|
}
|
||||||
// fine.Init(fine.bbox);
|
|
||||||
coarse.Init();
|
coarse.Init();
|
||||||
}
|
}
|
||||||
vector<Seed> seeds;
|
vector<Seed> seeds;
|
||||||
|
|
@ -444,7 +431,11 @@ void VoronoiChain::BuildLevel(Nexus &nexus, unsigned int offset,
|
||||||
if(ccount[i] > (int)min_size)
|
if(ccount[i] > (int)min_size)
|
||||||
seeds.push_back(coarse[i]);
|
seeds.push_back(coarse[i]);
|
||||||
}
|
}
|
||||||
swap(coarse, seeds);
|
|
||||||
|
coarse.clear();
|
||||||
|
for(unsigned int i = 0; i < seeds.size(); i++)
|
||||||
|
coarse.push_back(seeds[i]);
|
||||||
|
|
||||||
if(coarse.size() == 0) coarse.push_back(Point3f(0,0,0));
|
if(coarse.size() == 0) coarse.push_back(Point3f(0,0,0));
|
||||||
coarse.Init();
|
coarse.Init();
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue