primitiveStream.cc [plain text]
#include "gluos.h"
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <GL/gl.h>
#include "primitiveStream.h"
Int primStream::num_triangles()
{
Int i;
Int ret=0;
for(i=0; i<index_lengths; i++)
{
ret += lengths[i]-2;
}
return ret;
}
void primStream::begin()
{
counter = 0;
}
void primStream::insert(Real u, Real v)
{
if(index_vertices+1 >= size_vertices) {
Real* temp = (Real*) malloc (sizeof(Real) * (2*size_vertices + 2));
assert(temp);
for(Int i=0; i<index_vertices; i++)
temp[i] = vertices[i];
free(vertices);
vertices = temp;
size_vertices = 2*size_vertices + 2;
}
vertices[index_vertices++] = u;
vertices[index_vertices++] = v;
counter++;
}
void primStream::end(Int type)
{
Int i;
if(counter == 0) return ;
if(index_lengths >= size_lengths){
Int* temp = (Int*) malloc(sizeof(Int) * (2*size_lengths + 2));
assert(temp);
Int* tempTypes = (Int*) malloc(sizeof(Int) * (2*size_lengths + 2));
assert(tempTypes);
for(i=0; i<index_lengths; i++){
temp[i] = lengths[i];
tempTypes[i] = types[i];
}
free(lengths);
free(types);
lengths = temp;
types = tempTypes;
size_lengths = 2*size_lengths + 2;
}
lengths[index_lengths] = counter;
types[index_lengths] = type;
index_lengths++;
}
void primStream::print()
{
Int i,j,k;
printf("index_lengths=%i,size_lengths=%i\n", index_lengths, size_lengths);
printf("index_vertices=%i,size_vertices=%i\n", index_vertices, size_vertices);
k=0;
for(i=0; i<index_lengths; i++)
{
if(types[i] == PRIMITIVE_STREAM_FAN)
printf("primitive-FAN:\n");
else
printf("primitive-STRIP:\n");
for(j=0; j<lengths[i]; j++)
{
printf("(%f,%f) ", vertices[k], vertices[k+1]);
k += 2;
}
printf("\n");
}
}
primStream::primStream(Int sizeLengths, Int sizeVertices)
{
lengths = (Int*)malloc (sizeof(Int) * sizeLengths);
assert(lengths);
types = (Int*)malloc (sizeof(Int) * sizeLengths);
assert(types);
vertices = (Real*) malloc(sizeof(Real) * sizeVertices);
assert(vertices);
index_lengths = 0;
index_vertices = 0;
size_lengths = sizeLengths;
size_vertices = sizeVertices;
}
primStream::~primStream()
{
free(lengths);
free(types);
free(vertices);
}
void primStream::draw()
{
Int i,j,k;
k=0;
for(i=0; i<index_lengths; i++)
{
switch(types[i]){
case PRIMITIVE_STREAM_FAN:
glBegin(GL_TRIANGLE_FAN);
break;
case PRIMITIVE_STREAM_STRIP:
glBegin(GL_TRIANGLE_STRIP);
break;
}
for(j=0; j<lengths[i]; j++){
glVertex2fv(vertices+k);
k += 2;
}
glEnd();
}
}