video:: source review

This commit is contained in:
James Turk 2005-07-18 07:19:48 +00:00
parent 0610686ce6
commit 3027bb6a3c
11 changed files with 101 additions and 66 deletions

View File

@ -5,7 +5,7 @@
// James Turk (jpt2433@rit.edu) // James Turk (jpt2433@rit.edu)
// //
// Version: // Version:
// $Id: Font.hpp,v 1.6 2005/07/18 05:14:18 cozman Exp $ // $Id: Font.hpp,v 1.7 2005/07/18 07:19:48 cozman Exp $
#ifndef PHOTON_VIDEO_FONT_HPP #ifndef PHOTON_VIDEO_FONT_HPP
#define PHOTON_VIDEO_FONT_HPP #define PHOTON_VIDEO_FONT_HPP
@ -98,16 +98,16 @@ public:
// Group: Drawing // Group: Drawing
public: public:
void drawText(float x, float y, const char *str, ...) const; void drawText(scalar x, scalar y, const char *str, ...) const;
void drawText(float x, float y, const std::string& str) const; void drawText(scalar x, scalar y, const std::string& str) const;
std::ostream& beginDraw(float x, float y); std::ostream& beginDraw(scalar x, scalar y);
StreamFlusher endDraw(); StreamFlusher endDraw();
// Group: Font Metrics // Group: Font Metrics
public: public:
unsigned int calcStringWidth(const std::string& str) const; uint calcStringWidth(const std::string& str) const;
unsigned int getHeight() const; uint getHeight() const;
// Group: Resource Creation // Group: Resource Creation
public: public:
@ -140,8 +140,8 @@ private:
ubyte height_; ubyte height_;
// stream drawing stuff // stream drawing stuff
std::ostringstream ss_; std::ostringstream ss_;
float drawX_; scalar drawX_;
float drawY_; scalar drawY_;
// color // color
Color color_; Color color_;
}; };

View File

@ -5,7 +5,7 @@
// James Turk (jpt2433@rit.edu) // James Turk (jpt2433@rit.edu)
// //
// Version: // Version:
// $Id: FontResourceManager.hpp,v 1.3 2005/07/03 06:33:19 cozman Exp $ // $Id: FontResourceManager.hpp,v 1.4 2005/07/18 07:19:48 cozman Exp $
#ifndef PHOTON_VIDEO_FONTRESOURCEMANAGER_HPP #ifndef PHOTON_VIDEO_FONTRESOURCEMANAGER_HPP
#define PHOTON_VIDEO_FONTRESOURCEMANAGER_HPP #define PHOTON_VIDEO_FONTRESOURCEMANAGER_HPP
@ -57,10 +57,10 @@ private:
virtual void freeResourceData(FontResource &res); virtual void freeResourceData(FontResource &res);
private: private:
FT_Library library_; FT_Library library_; // only need one FT_Library, so manager owns it
public: public:
static const unsigned int SPACE = 32; static const uint SPACE = 32;
static const unsigned int NUM_CHARS = 96; static const uint NUM_CHARS = 96;
}; };
} }

View File

@ -5,7 +5,7 @@
// James Turk (jpt2433@rit.edu) // James Turk (jpt2433@rit.edu)
// //
// Version: // Version:
// $Id: Image.hpp,v 1.1 2005/06/13 07:05:28 cozman Exp $ // $Id: Image.hpp,v 1.2 2005/07/18 07:19:48 cozman Exp $
#ifndef PHOTON_VIDEO_IMAGE_HPP #ifndef PHOTON_VIDEO_IMAGE_HPP
#define PHOTON_VIDEO_IMAGE_HPP #define PHOTON_VIDEO_IMAGE_HPP

View File

@ -5,7 +5,7 @@
// James Turk (jpt2433@rit.edu) // James Turk (jpt2433@rit.edu)
// //
// Version: // Version:
// $Id: TextureResourceManager.hpp,v 1.3 2005/07/03 06:33:19 cozman Exp $ // $Id: TextureResourceManager.hpp,v 1.4 2005/07/18 07:19:48 cozman Exp $
#ifndef PHOTON_VIDEO_TEXTURERESOURCEMANAGER_HPP #ifndef PHOTON_VIDEO_TEXTURERESOURCEMANAGER_HPP
#define PHOTON_VIDEO_TEXTURERESOURCEMANAGER_HPP #define PHOTON_VIDEO_TEXTURERESOURCEMANAGER_HPP
@ -24,7 +24,7 @@ public:
uint texID; uint texID;
uint width; uint width;
uint height; uint height;
ubyte *pixels; ubyte *pixels; // keep pixels around for future use (post-load colorkeying)
}; };
class TextureResourceManager : public ResourceManager<TextureResource> class TextureResourceManager : public ResourceManager<TextureResource>

View File

@ -5,7 +5,7 @@
// James Turk (jpt2433@rit.edu) // James Turk (jpt2433@rit.edu)
// //
// Version: // Version:
// $Id: VideoCore.hpp,v 1.2 2005/03/15 18:53:12 cozman Exp $ // $Id: VideoCore.hpp,v 1.3 2005/07/18 07:19:48 cozman Exp $
#ifndef PHOTON_VIDEO_VIDEOCORE_HPP #ifndef PHOTON_VIDEO_VIDEOCORE_HPP
#define PHOTON_VIDEO_VIDEOCORE_HPP #define PHOTON_VIDEO_VIDEOCORE_HPP
@ -159,7 +159,7 @@ public:
// behind the scenes // behind the scenes
private: private:
void initOpenGL(); void initOpenGL(); // set desired OpenGL options
// data members // data members
private: private:

View File

@ -5,7 +5,7 @@
// James Turk (jpt2433@rit.edu) // James Turk (jpt2433@rit.edu)
// //
// Version: // Version:
// $Id: Font.cpp,v 1.5 2005/07/17 07:14:09 cozman Exp $ // $Id: Font.cpp,v 1.6 2005/07/18 07:19:48 cozman Exp $
#include "video/Font.hpp" #include "video/Font.hpp"
@ -36,6 +36,7 @@ Font::Font(const Font &rhs) :
ResourceManaged<FontResourceManager>(rhs), ResourceManaged<FontResourceManager>(rhs),
drawX_(0), drawY_(0) drawX_(0), drawY_(0)
{ {
// a font is a texture, 96 lists, 96 widths, and a height
resMgr_.getFontData(getName(), texID_, listBase_, widths_, height_); resMgr_.getFontData(getName(), texID_, listBase_, widths_, height_);
} }
@ -53,6 +54,7 @@ void Font::open(const std::string& name)
bool Font::isValid() const bool Font::isValid() const
{ {
// valid if texture is created
return glIsTexture(texID_) == GL_TRUE; return glIsTexture(texID_) == GL_TRUE;
} }
@ -81,7 +83,7 @@ Color Font::getColor() const
return color_; return color_;
} }
void Font::drawText(float x, float y, const char *str, ...) const void Font::drawText(scalar x, scalar y, const char *str, ...) const
{ {
if(!isValid()) if(!isValid())
{ {
@ -97,15 +99,15 @@ void Font::drawText(float x, float y, const char *str, ...) const
// push attrib before setting color // push attrib before setting color
glPushAttrib(GL_CURRENT_BIT); glPushAttrib(GL_CURRENT_BIT);
glColor4ub(color_.red, color_.green, color_.blue, color_.alpha); color_.makeGLColor();
glBindTexture(GL_TEXTURE_2D, texID_); glBindTexture(GL_TEXTURE_2D, texID_);
glPushMatrix(); glPushMatrix();
glTranslated(x,y,0); glTranslated(x,y,0);
for(unsigned int i=0; i < std::strlen(buf); ++i) for(uint i=0; i < std::strlen(buf); ++i)
{ {
// ch-SPACE = DisplayList offset // ch-SPACE = DisplayList offset
unsigned char ch( buf[i] - FontResourceManager::SPACE ); ubyte ch( buf[i] - FontResourceManager::SPACE );
// replace characters outside the valid range with undrawable // replace characters outside the valid range with undrawable
if(ch > FontResourceManager::NUM_CHARS) if(ch > FontResourceManager::NUM_CHARS)
{ {
@ -123,7 +125,7 @@ void Font::drawText(float x, float y, const char *str, ...) const
glPopAttrib(); glPopAttrib();
} }
void Font::drawText(float x, float y, const std::string& str) const void Font::drawText(scalar x, scalar y, const std::string& str) const
{ {
if(!isValid()) if(!isValid())
{ {
@ -132,7 +134,7 @@ void Font::drawText(float x, float y, const std::string& str) const
// push attrib before setting color // push attrib before setting color
glPushAttrib(GL_CURRENT_BIT); glPushAttrib(GL_CURRENT_BIT);
glColor4ub(color_.red, color_.green, color_.blue, color_.alpha); color_.makeGLColor();
glBindTexture(GL_TEXTURE_2D, texID_); glBindTexture(GL_TEXTURE_2D, texID_);
glPushMatrix(); glPushMatrix();
@ -140,7 +142,7 @@ void Font::drawText(float x, float y, const std::string& str) const
for(std::string::const_iterator i = str.begin(); i != str.end(); ++i) for(std::string::const_iterator i = str.begin(); i != str.end(); ++i)
{ {
// ch-SPACE = DisplayList offset // ch-SPACE = DisplayList offset
unsigned char ch( *i - FontResourceManager::SPACE ); ubyte ch( *i - FontResourceManager::SPACE );
// replace characters outside the valid range with undrawable // replace characters outside the valid range with undrawable
if(ch > FontResourceManager::NUM_CHARS) if(ch > FontResourceManager::NUM_CHARS)
{ {
@ -158,7 +160,7 @@ void Font::drawText(float x, float y, const std::string& str) const
glPopAttrib(); glPopAttrib();
} }
std::ostream& Font::beginDraw(float x, float y) std::ostream& Font::beginDraw(scalar x, scalar y)
{ {
// clear the string and store the draw-position // clear the string and store the draw-position
ss_.str(""); ss_.str("");
@ -171,28 +173,28 @@ StreamFlusher Font::endDraw()
{ {
drawText(drawX_, drawY_, ss_.str()); // draw the string drawText(drawX_, drawY_, ss_.str()); // draw the string
ss_.str(""); // clear the buffer ss_.str(""); // clear the buffer
return StreamFlusher(); return StreamFlusher(); // special null class that simply outputs nothing
} }
unsigned int Font::calcStringWidth(const std::string& str) const uint Font::calcStringWidth(const std::string& str) const
{ {
if(!isValid()) if(!isValid())
{ {
throw PreconditionException("Invalid Font::calcStringWidth call."); throw PreconditionException("Invalid Font::calcStringWidth call.");
} }
unsigned int width=0; uint width(0); // accumulator for widths
// iterate through widths of each char and accumulate width of string // iterate through widths of each char and accumulate width of string
for(std::string::const_iterator i = str.begin(); i < str.end(); ++i) for(std::string::const_iterator i = str.begin(); i < str.end(); ++i)
{ {
width += widths_[static_cast<unsigned int>(*i) - width += widths_[static_cast<uint>(*i) -
FontResourceManager::SPACE]; FontResourceManager::SPACE];
} }
return width; return width;
} }
unsigned int Font::getHeight() const uint Font::getHeight() const
{ {
if(!isValid()) if(!isValid())
{ {

View File

@ -5,7 +5,7 @@
// James Turk (jpt2433@rit.edu) // James Turk (jpt2433@rit.edu)
// //
// Version: // Version:
// $Id: FontResourceManager.cpp,v 1.3 2005/07/03 06:33:19 cozman Exp $ // $Id: FontResourceManager.cpp,v 1.4 2005/07/18 07:19:48 cozman Exp $
#include "video/FontResourceManager.hpp" #include "video/FontResourceManager.hpp"
@ -18,6 +18,7 @@ namespace video
FontResourceManager::FontResourceManager() FontResourceManager::FontResourceManager()
{ {
// initialize library upon creation
if(FT_Init_FreeType(&library_) != 0) if(FT_Init_FreeType(&library_) != 0)
{ {
throw APIError("Could not initialize FreeType2 library."); throw APIError("Could not initialize FreeType2 library.");
@ -26,6 +27,7 @@ FontResourceManager::FontResourceManager()
FontResourceManager::~FontResourceManager() FontResourceManager::~FontResourceManager()
{ {
// deinitialize library on destruction
FT_Done_FreeType(library_); FT_Done_FreeType(library_);
} }
@ -188,6 +190,7 @@ void FontResourceManager::loadResourceData(FontResource &res,
void FontResourceManager::freeResourceData(FontResource &res) void FontResourceManager::freeResourceData(FontResource &res)
{ {
// free both the lists and the texture
if(glIsList(res.listBase)) if(glIsList(res.listBase))
{ {
glDeleteLists(res.listBase, NUM_CHARS); glDeleteLists(res.listBase, NUM_CHARS);

View File

@ -5,7 +5,7 @@
// James Turk (jpt2433@rit.edu) // James Turk (jpt2433@rit.edu)
// //
// Version: // Version:
// $Id: Image.cpp,v 1.3 2005/06/27 04:24:16 cozman Exp $ // $Id: Image.cpp,v 1.4 2005/07/18 07:19:48 cozman Exp $
#include "video/Image.hpp" #include "video/Image.hpp"
@ -41,6 +41,7 @@ Image& Image::operator=(const Image &rhs)
{ {
if(&rhs != this) if(&rhs != this)
{ {
// copy texture and all Image members
Texture::operator=(rhs); Texture::operator=(rhs);
alpha_ = rhs.alpha_; alpha_ = rhs.alpha_;
texMinX_ = rhs.texMinX_; texMinX_ = rhs.texMinX_;
@ -93,6 +94,8 @@ void Image::resize(scalar width, scalar height)
void Image::draw(scalar x, scalar y) const void Image::draw(scalar x, scalar y) const
{ {
// avoid wonky coloring, but use alpha
glPushAttrib(GL_CURRENT_BIT);
glColor4ub(255,255,255,alpha_); glColor4ub(255,255,255,alpha_);
bind(); bind();
glBegin(GL_QUADS); glBegin(GL_QUADS);
@ -101,11 +104,13 @@ void Image::draw(scalar x, scalar y) const
glTexCoord2i(texMaxX_,texMaxY_); glVertex2d(x+width_,y+height_); glTexCoord2i(texMaxX_,texMaxY_); glVertex2d(x+width_,y+height_);
glTexCoord2i(texMinX_,texMaxY_); glVertex2d(x,y+height_); glTexCoord2i(texMinX_,texMaxY_); glVertex2d(x,y+height_);
glEnd(); glEnd();
glColor4ub(255,255,255,255); glPopAttrib();
} }
void Image::draw(scalar x, scalar y, ubyte vc[]) const void Image::draw(scalar x, scalar y, ubyte vc[]) const
{ {
// store current state, so vc doesn't destroy
glPushAttrib(GL_CURRENT_BIT);
bind(); bind();
glBegin(GL_QUADS); glBegin(GL_QUADS);
glTexCoord2i(texMinX_,texMinY_); glTexCoord2i(texMinX_,texMinY_);
@ -124,7 +129,7 @@ void Image::draw(scalar x, scalar y, ubyte vc[]) const
glColor4ub(vc[12],vc[13],vc[14],vc[15]); glColor4ub(vc[12],vc[13],vc[14],vc[15]);
glVertex2d(x,y+height_); glVertex2d(x,y+height_);
glEnd(); glEnd();
glColor4ub(255,255,255,255); glPopAttrib();
} }
void Image::drawRotated(scalar x, scalar y, scalar angle) const void Image::drawRotated(scalar x, scalar y, scalar angle) const
@ -132,11 +137,14 @@ void Image::drawRotated(scalar x, scalar y, scalar angle) const
//center point //center point
scalar cX = width_/2., cY = height_/2.; scalar cX = width_/2., cY = height_/2.;
// avoid wonky coloring, but use alpha
glPushAttrib(GL_CURRENT_BIT);
glPushMatrix(); glPushMatrix();
glLoadIdentity(); glLoadIdentity();
glTranslated(x+cX,y+cY,0); //translate to center glTranslated(x+cX,y+cY,0); //translate to center
glRotated(angle,0,0,1.0f); //rotate on z axis, to keep x&y in 2D plane glRotated(angle,0,0,1.0f); //rotate on z axis, to keep x&y in 2D plane
glColor4ub(255,255,255,255); glColor4ub(255,255,255,alpha_);
bind(); bind();
//draw is modified to be based around center //draw is modified to be based around center
glBegin(GL_QUADS); glBegin(GL_QUADS);
@ -146,7 +154,7 @@ void Image::drawRotated(scalar x, scalar y, scalar angle) const
glTexCoord2i(texMinX_,texMaxY_); glVertex2d(-cX,-cY+height_); glTexCoord2i(texMinX_,texMaxY_); glVertex2d(-cX,-cY+height_);
glEnd(); glEnd();
glPopMatrix(); glPopMatrix();
glColor4ub(255,255,255,255); glPopAttrib();
} }
void Image::drawRotated(scalar x, scalar y, scalar angle, ubyte vc[]) const void Image::drawRotated(scalar x, scalar y, scalar angle, ubyte vc[]) const
@ -156,6 +164,8 @@ void Image::drawRotated(scalar x, scalar y, scalar angle, ubyte vc[]) const
cX = width_/2.0f; cX = width_/2.0f;
cY = height_/2.0f; cY = height_/2.0f;
// store current state, so vc doesn't destroy
glPushAttrib(GL_CURRENT_BIT);
glPushMatrix(); glPushMatrix();
glLoadIdentity(); glLoadIdentity();
glTranslated(x+cX,y+cY,0); //translate to center glTranslated(x+cX,y+cY,0); //translate to center
@ -180,7 +190,7 @@ void Image::drawRotated(scalar x, scalar y, scalar angle, ubyte vc[]) const
glVertex2d(-cX,-cY+height_); glVertex2d(-cX,-cY+height_);
glEnd(); glEnd();
glPopMatrix(); glPopMatrix();
glColor4ub(255,255,255,255); glPopAttrib();
} }
ubyte Image::getAlpha() const ubyte Image::getAlpha() const

View File

@ -5,7 +5,7 @@
// James Turk (jpt2433@rit.edu) // James Turk (jpt2433@rit.edu)
// //
// Version: // Version:
// $Id: Pen.cpp,v 1.3 2005/04/21 19:30:19 cozman Exp $ // $Id: Pen.cpp,v 1.4 2005/07/18 07:19:48 cozman Exp $
#include "video/Pen.hpp" #include "video/Pen.hpp"
@ -46,22 +46,24 @@ void Pen::setColor(const Color& color)
void Pen::drawPoint(const math::Point2& point) const void Pen::drawPoint(const math::Point2& point) const
{ {
glBindTexture(GL_TEXTURE_2D,0); glBindTexture(GL_TEXTURE_2D,0);
glPushAttrib(GL_CURRENT_BIT);
color_.makeGLColor(); color_.makeGLColor();
glBegin(GL_POINTS); glBegin(GL_POINTS); // draw single point
glVertex2d(point.x,point.y); glVertex2d(point.x,point.y);
glEnd(); glEnd();
glColor4ub(255,255,255,255); glPopAttrib();
} }
void Pen::drawLine(const math::Point2& p1, const math::Point2& p2) const void Pen::drawLine(const math::Point2& p1, const math::Point2& p2) const
{ {
glBindTexture(GL_TEXTURE_2D,0); glBindTexture(GL_TEXTURE_2D,0);
glPushAttrib(GL_CURRENT_BIT);
color_.makeGLColor(); color_.makeGLColor();
glBegin(GL_LINES); glBegin(GL_LINES); // draw single line
glVertex2d(p1.x,p1.y); glVertex2d(p1.x,p1.y);
glVertex2d(p2.x,p2.y); glVertex2d(p2.x,p2.y);
glEnd(); glEnd();
glColor4ub(255,255,255,255); glPopAttrib();
} }
void Pen::drawVector(const math::Point2& point, void Pen::drawVector(const math::Point2& point,
@ -71,7 +73,7 @@ void Pen::drawVector(const math::Point2& point,
math::Vector2 v; math::Vector2 v;
x2 = point.x+vector.x; x2 = point.x+vector.x;
y2 = point.y+vector.y; y2 = point.y+vector.y;
//calculate an arrow (5pi/6) //calculate an arrow head (5pi/6 radian angle offset)
v.resolveRad(vector.getMagnitude()/5,vector.getAngleRad()+(5./6)*math::PI); v.resolveRad(vector.getMagnitude()/5,vector.getAngleRad()+(5./6)*math::PI);
x3 = x2+v.x; x3 = x2+v.x;
y3 = y2-v.y; y3 = y2-v.y;
@ -80,47 +82,50 @@ void Pen::drawVector(const math::Point2& point,
y4 = y2-v.y; y4 = y2-v.y;
glBindTexture(GL_TEXTURE_2D,0); glBindTexture(GL_TEXTURE_2D,0);
glPushAttrib(GL_CURRENT_BIT);
color_.makeGLColor(); color_.makeGLColor();
glBegin(GL_LINE_STRIP); glBegin(GL_LINE_STRIP); // use line strip to draw arrow
glVertex2d(point.x,point.y); glVertex2d(point.x,point.y);
glVertex2d(x2,y2); glVertex2d(x2,y2);
glVertex2d(x3,y3); glVertex2d(x3,y3);
glVertex2d(x4,y4); glVertex2d(x4,y4);
glVertex2d(x2,y2); glVertex2d(x2,y2);
glEnd(); glEnd();
glColor4ub(255,255,255,255); glPopAttrib();
} }
void Pen::drawRectangle(const math::Rect &rect) const void Pen::drawRectangle(const math::Rect &rect) const
{ {
glBindTexture(GL_TEXTURE_2D,0); glBindTexture(GL_TEXTURE_2D,0);
glPushAttrib(GL_CURRENT_BIT);
color_.makeGLColor(); color_.makeGLColor();
glBegin(GL_LINE_STRIP); glBegin(GL_LINE_STRIP); // use line strips to draw outline of rectangle
glVertex2d(rect.getLeft(),rect.getTop()); glVertex2d(rect.getLeft(),rect.getTop());
glVertex2d(rect.getRight(),rect.getTop()); glVertex2d(rect.getRight(),rect.getTop());
glVertex2d(rect.getRight(),rect.getBottom()); glVertex2d(rect.getRight(),rect.getBottom());
glVertex2d(rect.getLeft(),rect.getBottom()); glVertex2d(rect.getLeft(),rect.getBottom());
glVertex2d(rect.getLeft(),rect.getTop()); glVertex2d(rect.getLeft(),rect.getTop());
glEnd(); glEnd();
glColor4ub(255,255,255,255); glPopAttrib();
} }
void Pen::fillRectangle(const math::Rect &rect) const void Pen::fillRectangle(const math::Rect &rect) const
{ {
glBindTexture(GL_TEXTURE_2D,0); glBindTexture(GL_TEXTURE_2D,0);
glPushAttrib(GL_CURRENT_BIT);
color_.makeGLColor(); color_.makeGLColor();
glBegin(GL_QUADS); glBegin(GL_QUADS); // draw one colored quad
glVertex2d(rect.getLeft(),rect.getTop()); glVertex2d(rect.getLeft(),rect.getTop());
glVertex2d(rect.getRight(),rect.getTop()); glVertex2d(rect.getRight(),rect.getTop());
glVertex2d(rect.getRight(),rect.getBottom()); glVertex2d(rect.getRight(),rect.getBottom());
glVertex2d(rect.getLeft(),rect.getBottom()); glVertex2d(rect.getLeft(),rect.getBottom());
glEnd(); glEnd();
glColor4ub(255,255,255,255); glPopAttrib();
} }
void Pen::drawCircle(const math::Circle &circle) const void Pen::drawCircle(const math::Circle &circle) const
{ {
//written from Bresenham's algorithm //written from Bresenham's circle algorithm
double cx(circle.getCenter().x); double cx(circle.getCenter().x);
double cy(circle.getCenter().y); double cy(circle.getCenter().y);
double d(3-(2*circle.getRadius())); double d(3-(2*circle.getRadius()));
@ -128,8 +133,10 @@ void Pen::drawCircle(const math::Circle &circle) const
double y(circle.getRadius()); double y(circle.getRadius());
glBindTexture(GL_TEXTURE_2D,0); glBindTexture(GL_TEXTURE_2D,0);
glPushAttrib(GL_CURRENT_BIT);
color_.makeGLColor(); color_.makeGLColor();
glBegin(GL_POINTS);
glBegin(GL_POINTS); // draw points, creating a circle
while(y > x) while(y > x)
{ {
glVertex2d(cx+x,cy+y); glVertex2d(cx+x,cy+y);
@ -153,12 +160,12 @@ void Pen::drawCircle(const math::Circle &circle) const
++x; ++x;
} }
glEnd(); glEnd();
glColor4ub(255,255,255,255); glPopAttrib();
} }
void Pen::fillCircle(const math::Circle &circle) const void Pen::fillCircle(const math::Circle &circle) const
{ {
//written from Bresenham's algorithm //written from Bresenham's circle algorithm
double cx(circle.getCenter().x); double cx(circle.getCenter().x);
double cy(circle.getCenter().y); double cy(circle.getCenter().y);
double d(3-(2*circle.getRadius())); double d(3-(2*circle.getRadius()));
@ -166,8 +173,10 @@ void Pen::fillCircle(const math::Circle &circle) const
double y(circle.getRadius()); double y(circle.getRadius());
glBindTexture(GL_TEXTURE_2D,0); glBindTexture(GL_TEXTURE_2D,0);
glPushAttrib(GL_CURRENT_BIT);
color_.makeGLColor(); color_.makeGLColor();
glBegin(GL_LINES);
glBegin(GL_LINES); // draw lines instead of points, filling the circle
while(y > x) while(y > x)
{ {
glVertex2d(cx+x,cy+y); glVertex2d(cx+x,cy+y);
@ -191,7 +200,7 @@ void Pen::fillCircle(const math::Circle &circle) const
++x; ++x;
} }
glEnd(); glEnd();
glColor4ub(255,255,255,255); glPopAttrib();
} }
} }

View File

@ -5,7 +5,7 @@
// James Turk (jpt2433@rit.edu) // James Turk (jpt2433@rit.edu)
// //
// Version: // Version:
// $Id: Texture.cpp,v 1.4 2005/07/04 03:06:48 cozman Exp $ // $Id: Texture.cpp,v 1.5 2005/07/18 07:19:48 cozman Exp $
#include "video/Texture.hpp" #include "video/Texture.hpp"
@ -22,6 +22,7 @@ Texture::Texture()
Texture::Texture(const Texture &rhs) : Texture::Texture(const Texture &rhs) :
ResourceManaged<TextureResourceManager>(rhs) ResourceManaged<TextureResourceManager>(rhs)
{ {
// the resource is width, height, and GL texture name/ID
resMgr_.getTextureData(getName(), width_, height_, texID_); resMgr_.getTextureData(getName(), width_, height_, texID_);
} }
@ -32,6 +33,7 @@ Texture::Texture(const std::string& name)
void Texture::open(const std::string& name) void Texture::open(const std::string& name)
{ {
// open the texture and grab the resource contents
ResourceManaged<TextureResourceManager>::open(name); ResourceManaged<TextureResourceManager>::open(name);
resMgr_.getTextureData(getName(), width_, height_, texID_); resMgr_.getTextureData(getName(), width_, height_, texID_);
} }

View File

@ -5,7 +5,7 @@
// James Turk (jpt2433@rit.edu) // James Turk (jpt2433@rit.edu)
// //
// Version: // Version:
// $Id: TextureResourceManager.cpp,v 1.4 2005/07/03 06:33:19 cozman Exp $ // $Id: TextureResourceManager.cpp,v 1.5 2005/07/18 07:19:48 cozman Exp $
#include "video/TextureResourceManager.hpp" #include "video/TextureResourceManager.hpp"
@ -22,12 +22,14 @@ namespace video
void TextureResourceManager::setGlobalColorKey(bool enabled, ubyte red, void TextureResourceManager::setGlobalColorKey(bool enabled, ubyte red,
ubyte green, ubyte blue) ubyte green, ubyte blue)
{ {
// if enabled, sets alpha to 0, which is indicator that colorkeying is on
colorKey_.setColor(red,green,blue,enabled?0:255); colorKey_.setColor(red,green,blue,enabled?0:255);
} }
void TextureResourceManager::getGlobalColorKey(bool &enabled, ubyte &red, void TextureResourceManager::getGlobalColorKey(bool &enabled, ubyte &red,
ubyte &green, ubyte &blue) ubyte &green, ubyte &blue)
{ {
// if alpha is 0, colorkeying is enabled
enabled = (colorKey_.alpha == 0); enabled = (colorKey_.alpha == 0);
red = colorKey_.red; red = colorKey_.red;
green = colorKey_.green; green = colorKey_.green;
@ -51,6 +53,7 @@ void TextureResourceManager::loadResourceData(TextureResource &res,
util::FileBuffer buf(path.path); util::FileBuffer buf(path.path);
corona::File *file; corona::File *file;
// load via FileBuffer to allow loading of archived content
std::vector<ubyte> data = buf.getData(); std::vector<ubyte> data = buf.getData();
file = corona::CreateMemoryFile((ubyte*)&data[0],data.size()); file = corona::CreateMemoryFile((ubyte*)&data[0],data.size());
@ -77,26 +80,30 @@ void TextureResourceManager::loadResourceData(TextureResource &res,
std::memcpy(res.pixels,image->getPixels(),res.width*res.height*4); std::memcpy(res.pixels,image->getPixels(),res.width*res.height*4);
delete image; //no longer need image delete image; //no longer need image
// implementation of the color key
if(colorKey_.alpha == 0) //ck alpha == 0, means colorkey on if(colorKey_.alpha == 0) //ck alpha == 0, means colorkey on
{ {
ubyte r,g,b; ubyte r,g,b;
ubyte *pxl=res.pixels; ubyte *pxl=res.pixels;
// go through all pixels (width*height = numPixels)
for(uint i=0; i < res.width*res.height; ++i) for(uint i=0; i < res.width*res.height; ++i)
{ {
r = *pxl++; r = *pxl++; // get red component
g = *pxl++; g = *pxl++; // get green component
b = *pxl++; b = *pxl++; // get blue component
//set current pixel alpha = 0
//set current pixel alpha = 0 if each component matches the colorKey
if(r == colorKey_.red && if(r == colorKey_.red &&
g == colorKey_.green && g == colorKey_.green &&
b == colorKey_.blue) b == colorKey_.blue)
{ {
*pxl = 0; *pxl = 0; // make transparent
} }
*pxl++; *pxl++; // go to next pixel
} }
} }
// actually bind the OpenGL texture
glGenTextures(1,&res.texID); glGenTextures(1,&res.texID);
glBindTexture(GL_TEXTURE_2D,res.texID); glBindTexture(GL_TEXTURE_2D,res.texID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
@ -110,11 +117,13 @@ void TextureResourceManager::loadResourceData(TextureResource &res,
void TextureResourceManager::freeResourceData(TextureResource &res) void TextureResourceManager::freeResourceData(TextureResource &res)
{ {
// pixels can be deleted
if(res.pixels) if(res.pixels)
{ {
delete []res.pixels; delete []res.pixels;
res.pixels = 0; res.pixels = 0;
} }
// free OpenGL texture identifier
glDeleteTextures(1, &res.texID); glDeleteTextures(1, &res.texID);
} }