From: <ju...@us...> - 2007-06-14 05:39:59
|
Revision: 14330 http://bzflag.svn.sourceforge.net/bzflag/?rev=14330&view=rev Author: judecn Date: 2007-06-13 22:39:46 -0700 (Wed, 13 Jun 2007) Log Message: ----------- Hopefull this fixes it (...again...*cringe*) Modified Paths: -------------- trunk/bzworkbench/Debug/dialogs/subdir.mk trunk/bzworkbench/Debug/sources.mk trunk/bzworkbench/Debug/subdir.mk trunk/bzworkbench/include/render/Index3D.h Added Paths: ----------- trunk/bzworkbench/Debug/objects/ trunk/bzworkbench/Debug/objects/subdir.mk trunk/bzworkbench/Debug/widgets/ trunk/bzworkbench/Debug/widgets/subdir.mk trunk/bzworkbench/include/DrawInfo.h trunk/bzworkbench/include/LOD.h trunk/bzworkbench/include/LODCommand.h trunk/bzworkbench/include/MeshFace.h trunk/bzworkbench/include/mesh.h trunk/bzworkbench/objects/mesh.cpp Modified: trunk/bzworkbench/Debug/dialogs/subdir.mk =================================================================== --- trunk/bzworkbench/Debug/dialogs/subdir.mk 2007-06-14 05:31:22 UTC (rev 14329) +++ trunk/bzworkbench/Debug/dialogs/subdir.mk 2007-06-14 05:39:46 UTC (rev 14330) @@ -5,24 +5,24 @@ # Add inputs and outputs from these tool invocations to the build variables CPP_SRCS += \ ../dialogs/Fl_Dialog.cpp \ +../dialogs/Fl_Error.cpp \ ../dialogs/MainMenu.cpp \ -../dialogs/QuickLabel.cpp \ -../dialogs/WorldOptionsDialog.cpp \ -../dialogs/MasterConfigurationDialog.cpp +../dialogs/MasterConfigurationDialog.cpp \ +../dialogs/WorldOptionsDialog.cpp OBJS += \ ./dialogs/Fl_Dialog.o \ +./dialogs/Fl_Error.o \ ./dialogs/MainMenu.o \ -./dialogs/QuickLabel.o \ -./dialogs/WorldOptionsDialog.o \ -./dialogs/MasterConfigurationDialog.o +./dialogs/MasterConfigurationDialog.o \ +./dialogs/WorldOptionsDialog.o CPP_DEPS += \ ./dialogs/Fl_Dialog.d \ +./dialogs/Fl_Error.d \ ./dialogs/MainMenu.d \ -./dialogs/QuickLabel.d \ -./dialogs/WorldOptionsDialog.d \ -./dialogs/MasterConfigurationDialog.d +./dialogs/MasterConfigurationDialog.d \ +./dialogs/WorldOptionsDialog.d # Each subdirectory must supply rules for building sources it contributes Added: trunk/bzworkbench/Debug/objects/subdir.mk =================================================================== --- trunk/bzworkbench/Debug/objects/subdir.mk (rev 0) +++ trunk/bzworkbench/Debug/objects/subdir.mk 2007-06-14 05:39:46 UTC (rev 14330) @@ -0,0 +1,90 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +CPP_SRCS += \ +../objects/arc.cpp \ +../objects/base.cpp \ +../objects/box.cpp \ +../objects/bz2object.cpp \ +../objects/cone.cpp \ +../objects/dynamicColor.cpp \ +../objects/group.cpp \ +../objects/link.cpp \ +../objects/material.cpp \ +../objects/mesh.cpp \ +../objects/meshbox.cpp \ +../objects/meshpyr.cpp \ +../objects/options.cpp \ +../objects/physics.cpp \ +../objects/pyramid.cpp \ +../objects/sphere.cpp \ +../objects/teleporter.cpp \ +../objects/tetra.cpp \ +../objects/texturematrix.cpp \ +../objects/waterLevel.cpp \ +../objects/weapon.cpp \ +../objects/world.cpp \ +../objects/zone.cpp + +OBJS += \ +./objects/arc.o \ +./objects/base.o \ +./objects/box.o \ +./objects/bz2object.o \ +./objects/cone.o \ +./objects/dynamicColor.o \ +./objects/group.o \ +./objects/link.o \ +./objects/material.o \ +./objects/mesh.o \ +./objects/meshbox.o \ +./objects/meshpyr.o \ +./objects/options.o \ +./objects/physics.o \ +./objects/pyramid.o \ +./objects/sphere.o \ +./objects/teleporter.o \ +./objects/tetra.o \ +./objects/texturematrix.o \ +./objects/waterLevel.o \ +./objects/weapon.o \ +./objects/world.o \ +./objects/zone.o + +CPP_DEPS += \ +./objects/arc.d \ +./objects/base.d \ +./objects/box.d \ +./objects/bz2object.d \ +./objects/cone.d \ +./objects/dynamicColor.d \ +./objects/group.d \ +./objects/link.d \ +./objects/material.d \ +./objects/mesh.d \ +./objects/meshbox.d \ +./objects/meshpyr.d \ +./objects/options.d \ +./objects/physics.d \ +./objects/pyramid.d \ +./objects/sphere.d \ +./objects/teleporter.d \ +./objects/tetra.d \ +./objects/texturematrix.d \ +./objects/waterLevel.d \ +./objects/weapon.d \ +./objects/world.d \ +./objects/zone.d + + +# Each subdirectory must supply rules for building sources it contributes +objects/%.o: ../objects/%.cpp + @echo 'Building file: $<' + @echo 'Invoking: GCC C++ Compiler' + g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<" + @echo 'Finished building: $<' + @echo ' ' + + Modified: trunk/bzworkbench/Debug/sources.mk =================================================================== --- trunk/bzworkbench/Debug/sources.mk 2007-06-14 05:31:22 UTC (rev 14329) +++ trunk/bzworkbench/Debug/sources.mk 2007-06-14 05:39:46 UTC (rev 14330) @@ -24,6 +24,8 @@ # Every subdirectory with source files must be described here SUBDIRS := \ windows \ +widgets \ +objects \ model \ . \ dialogs \ Modified: trunk/bzworkbench/Debug/subdir.mk =================================================================== --- trunk/bzworkbench/Debug/subdir.mk 2007-06-14 05:31:22 UTC (rev 14329) +++ trunk/bzworkbench/Debug/subdir.mk 2007-06-14 05:39:46 UTC (rev 14330) @@ -4,17 +4,20 @@ # Add inputs and outputs from these tool invocations to the build variables CPP_SRCS += \ -../main.cpp +../model/BZWParser.cpp \ +../model/Model.cpp OBJS += \ -./main.o +./model/BZWParser.o \ +./model/Model.o CPP_DEPS += \ -./main.d +./model/BZWParser.d \ +./model/Model.d # Each subdirectory must supply rules for building sources it contributes -%.o: ../%.cpp +model/%.o: ../model/%.cpp @echo 'Building file: $<' @echo 'Invoking: GCC C++ Compiler' g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<" Added: trunk/bzworkbench/Debug/widgets/subdir.mk =================================================================== --- trunk/bzworkbench/Debug/widgets/subdir.mk (rev 0) +++ trunk/bzworkbench/Debug/widgets/subdir.mk 2007-06-14 05:39:46 UTC (rev 14330) @@ -0,0 +1,27 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +CPP_SRCS += \ +../widgets/QuickLabel.cpp \ +../widgets/TransformWidget.cpp + +OBJS += \ +./widgets/QuickLabel.o \ +./widgets/TransformWidget.o + +CPP_DEPS += \ +./widgets/QuickLabel.d \ +./widgets/TransformWidget.d + + +# Each subdirectory must supply rules for building sources it contributes +widgets/%.o: ../widgets/%.cpp + @echo 'Building file: $<' + @echo 'Invoking: GCC C++ Compiler' + g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<" + @echo 'Finished building: $<' + @echo ' ' + + Added: trunk/bzworkbench/include/DrawInfo.h =================================================================== --- trunk/bzworkbench/include/DrawInfo.h (rev 0) +++ trunk/bzworkbench/include/DrawInfo.h 2007-06-14 05:39:46 UTC (rev 14330) @@ -0,0 +1,330 @@ +#ifndef DRAWINFO_H_ +#define DRAWINFO_H_ + +/** + * This is an assistant class to "mesh". It stores the drawinfo section of the mesh + */ + +#include "DataEntry.h" +#include "model/BZWParser.h" +#include "render/Point3D.h" +#include "render/Index3D.h" +#include "render/TexCoord2D.h" +#include "render/Vector3D.h" + +class DrawInfo : public DataEntry { + +public: + + // default constructor + DrawInfo() : + DataEntry("drawinfo", "<dlist><decorative><angvel><extends><sphere><corner><vertex><normal><texcoord><lod>") { + + vertices = vector<Point3D>(); + normals = vector<Point3D>(); + texcoords = vector<TexCoord2D>(); + corners = vector<Point3D>(); + + minExtends = Point3D(0.0f, 0.0f, 0.0f); + maxExtends = Point3D(0.0f, 0.0f, 0.0f); + spherePosition = Point3D(0.0f, 0.0f, 0.0f); + + angvel = 0.0f; + sphereRadius = 0.0f; + + dlist = true; + decorative = false; + } + + // constructor with data + DrawInfo(string& data) : + DataEntry("drawinfo", "<dlist><decorative><angvel><extends><sphere><corner><vertex><normal><texcoord><lod>", data.c_str()) { + + vertices = vector<Point3D>(); + normals = vector<Point3D>(); + texcoords = vector<TexCoord2D>(); + corners = vector<Point3D>(); + + minExtends = Point3D(0.0f, 0.0f, 0.0f); + maxExtends = Point3D(0.0f, 0.0f, 0.0f); + spherePosition = Point3D(0.0f, 0.0f, 0.0f); + + angvel = 0.0f; + sphereRadius = 0.0f; + + dlist = true; + decorative = false; + + this->update(data); + } + + // getter + string get(void) { return this->toString(); } + + // setter + int update(string& data) { + const char* header = this->getHeader(); + + // get the section + vector<string> lines = BZWParser::getSectionsByHeader(header, data.c_str()); + + // break if there's no section + if(lines[0] == BZW_NOT_FOUND) + return 0; + + // break if there's too many + if(!hasOnlyOne(lines, header)) + return 0; + + // get the data + const char* drawInfoData = lines[0].c_str(); + + // get the vertices + vector<string> vertexVals = BZWParser::getValuesByKey("vertex", header, drawInfoData); + + // get the texcoords + vector<string> texCoordVals = BZWParser::getValuesByKey("texcoord", header, drawInfoData); + + // get the normals + vector<string> normalVals = BZWParser::getValuesByKey("normal", header, drawInfoData); + + // get the dlist + vector<string> dlistVals = BZWParser::getValuesByKey("dlist", header, drawInfoData); + + // get the decorative + vector<string> decorativeVals = BZWParser::getValuesByKey("decorative", header, drawInfoData); + + // get angvel + vector<string> angvelVAls = BZWParser::getValuesByKey("angvel", header, drawInfoData); + if(anvelVals.size() > 1) { + printf("mesh::DrawInfo::update(): Error! Defined \"angvel\" %d times!\n", angvelVals.size()) + return 0; + } + if(!hasNumElements(angvelVals[0], 1)) + return 0; + + // get corners + vector<string> cornerVals = BZWParser::getValuesByKey("corner", header, drawInfoData); + + // get spheres + vector<string> sphereVals = BZWParser::getValuesByKey("sphere", header, drawInfoData); + if(sphereVals.size() > 1) { + printf("mesh::DrawInfo::update(): Error! Defined \"sphere\" %d times!\n", sphereVals.size()); + return 0; + } + if(!hasNumElements(sphereVals[0], 4)) + return 0; + + // get extends + vector<string> extendsVals = BZWParser::getValuesByKey("extends", header, drawInfoData); + if(extendsVals.size() > 1) { + printf("mesh::DrawInfo::update(): Error! Defined \"extends\" %d times!\n", sphereVals.size()); + return 0; + } + if(!hasNumElements(extendsVals[0], 6)) + return 0; + + + // do base-class update + if(!DataEntry::update(data)) + return 0; + + // need same amount of corners as vertexes + if(cornerVals.size() != vertexVals.size()) { + printf("mesh::DrawInfo::update(): Error! Unequal numbers of corners and vertexes\n") + return 0; + } + + // need same amount of corners as normals + if(cornerVals.size() != normalVals.size()) { + printf("mesh::DrawInfo::update(): Error! Unequal numbers of corners and normals\n") + return 0; + } + + // parse the values + vector<Point3D> vertexData = vector<Point3D>(); + vector<Index3D> cornerData = vector<Index3D>(); + vector<Vector3D> vectorData = vector<Vector3D>(); + vector<TexCoord2D> texCoordData = vector<TexCoord2D>(); + + // validate the vertexes (i.e. make sure they all have 3 values) + if(vertexVals.size() > 0) { + vector<string> tmp; + for(vector<string>::iterator i = vertexVals.begin(); i != vertexVals.end(); i++) { + tmp = BZWParser::getLineElements( i->c_str() ); + if(tmp.size() != 3) { + printf("mesh::DrawInfo::update(): Error! \"vertex\" in \"vertex %s\" needs 3 values!\n", i->c_str()); + } + vertexData.push_back( Point3D( i->c_str() ) ); + return 0; + } + } + + // validate the corners (i.e. make sure they all have 3 values) + if(cornerVals.size() > 0) { + vector<string> tmp; + for(vector<string>::iterator i = cornerVals.begin(); i != cornerVals.end(); i++) { + tmp = BZWParser::getLineElements( i->c_str() ); + if(tmp.size() != 3) { + printf("mesh::DrawInfo::update(): Error! \"corner\" in \"corner %s\" needs 3 values!\n", i->c_str()); + return 0; + } + cornerData.push_back( Index3D( i->c_str() ) ); + } + } + + // validate the normals (i.e. make sure they all have 3 values) + if(normalVals.size() > 0) { + vector<string> tmp; + for(vector<string>::iterator i = normalVals.begin(); i != normalVals.end(); i++) { + tmp = BZWParser::getLineElements( i->c_str() ); + if(tmp.size() != 3) { + printf("mesh::update(): Error! \"normal\" in \"normal %s\" needs 3 values!\n", i->c_str()); + return 0; + } + normalVals.push_back( Vector3D( i->c_str() ) ); + } + } + + // validate the texture coordinates (i.e. make sure they all have 2 values) + if(vertexVals.size() > 0) { + vector<string> tmp; + for(vector<string>::iterator i = texCoordVals.begin(); i != texCoordVals.end(); i++) { + tmp = BZWParser::getLineElements( i->c_str() ); + if(tmp.size() != 2) { + printf("mesh::update(): Error! \"texcoord\" in \"texcoord %s\" needs 2 values!\n", i->c_str()); + return 0; + } + texCoordData.push_back( TexCoord2D( i->c_str() ) ); + } + } + + // get the "extends" if it exists + Point3D eLow = Point3D(0.0f, 0.0f, 0.0f), eHigh = Point3D(0.0f, 0.0f, 0.0f); + if(extendsVals.size() > 0) { + vector<string> extendsParams = BZWParser::getLineElements( extendVals[0].c_str() ); + string eLowString = extendsParams[0] + " " + extendsParams[1] + " " + extendsParams[2]; + string eHighString = extendsParams[3] + " " + extendsParams[4] + " " + extendsParams[5]; + eLow = Point3D(eLowString); + eHigh = Point3D(eHighString); + } + + // get the "sphere" if it exists + Point3D spherePoint(0.0f, 0.0f, 0.0f); + float sphereRad; + if(sphereVals.size() > 0) { + vector<string> sphereParams = BZWParser::getLineElements( sphereVals[0].c_str() ); + string pString = sphereParams[0] + " " + sphereParams[1] + " " + sphereParams[2]; + sphereRad = atof( sphereParams[3].c_str() ); + spherePoint = Point3D(pString); + } + + // finally, set the data + this->vertices = vertexData; + this->texcoords = texCoordData; + this->corners = cornerData; + this->normals = normalData; + this->minExtends = eLow; + this->maxExtends = eHigh; + this->sphereRadius = sphereRad; + this->spherePosition = spherePoint; + this->angVel = atof( angValVels[0].c_str() ); + this->dlist = (dlistVals.size() > 0 ? true : false); + this->decorative = (decorativeVals.size() > 0 ? true : false); + + return 1; + } + + // toString + string toString(void) { + // string-ify the vertices, normals, and texcoords + string vertexString(""), normalString(""), texcoordString(""), cornerString(""); + + if(vertices.size() > 0) { + for(vector<Point3D>::iterator i = vertices.begin(); i != vertices.end(); i++) { + vertexString += " vertex " + i->toString() + "\n"; + } + } + + if(normals.size() > 0) { + for(vector<Vector3D>::iterator i = normals.begin(); i != normals.end(); i++) { + nomralString += " normal " + i->toString() + "\n"; + } + } + + if(texcoords.size() > 0) { + for(vector<TexCoord2D>::iterator i = texcoords.begin(); i != texcoords.end(); i++) { + texcoordString += " texcoord " + i->toString() + "\n"; + } + } + + if(corners.size() > 0) { + for(vector<Index3D>::iterator i = corners.begin(); i != corners.end(); i++) { + cornerString += " corner " + i->toString() + "\n"; + } + } + + return string("drawinfo\n") + + (dlist == true ? " dlist\n" : "") + + (decorative == true ? " decorative\n" : "") + + vertexString + "\n" + + normalString + "\n" + + cornerString + "\n" + + texcoordString + "\n" + + + + + } + + // render + int render(void) { + return 0; + } + +private: + + /** + * Helper method: convert an array of strings into an array of floats + */ + vector<float> parseValues(vector<string>& values) { + vector<float> ret = vector<float>(); + + if(values.size() > 0) { + for(vector<string>::iterator i = values.begin(); i != values.end(); i++) { + ret.push_back( atof( i->c_str() ) ); + } + } + + return ret; + } + + /** + * Helper method: convert an array of floats into a string + */ + + string stringify(vector<float>& values) { + string ret = string(""); + + if(values.size() > 0) { + for(vector<int>::iterator i = values.begin(); i != values.end(); i++) { + ret += string(ftoa(*i)) + " "; + } + } + + return ret; + } + + vector<Point3D> vertices; + vector<Vector3D> normals; + vector<TexCoord2D> texcoords; + vector<Index3D> corners; + vector<LOD> lods; + + Point3D minExtends, maxExtends, spherePosition; + + float angvel, sphereRadius; + + bool dlist, decorative; +}; + +#endif /*DRAWINFO_H_*/ Added: trunk/bzworkbench/include/LOD.h =================================================================== --- trunk/bzworkbench/include/LOD.h (rev 0) +++ trunk/bzworkbench/include/LOD.h 2007-06-14 05:39:46 UTC (rev 14330) @@ -0,0 +1,49 @@ +#ifndef LOD_H_ +#define LOD_H_ + +#include "DataEntry.h" +#include "model/BZWParser.h" +#include "LODCommand.h" + +#include <string> +#include <vector> + +class LOD : public DataEntry { + +public: + + // default constructor + LOD() : DataEntry("lod", "<matref><lengthPerPixel>") { + + } + + // constructor with data + LOD(string& data) : DataEntry("lod", "<matref><lengthPerPixel>", data.c_str()) { + + } + + // getter + string get(void) { return this->toString(); } + + // setter + int update(string& data) { + + } + + // toString + string toString(void) { + + } + + // render + int render(void) { + return 0; + } + +private: + + vector<LODCommand> commands; + int pixelLength; +}; + +#endif /*LOD_H_*/ Added: trunk/bzworkbench/include/LODCommand.h =================================================================== --- trunk/bzworkbench/include/LODCommand.h (rev 0) +++ trunk/bzworkbench/include/LODCommand.h 2007-06-14 05:39:46 UTC (rev 14330) @@ -0,0 +1,188 @@ +#ifndef LODCOMMAND_H_ +#define LODCOMMAND_H_ + +#include "DataEntry.h" + +class LODCommand : public DataEntry { + +public: + + // constructor + LODCommand() : DataEntry("", "<dlist><sphere><points><lines><lineloop><linestrip><tris><tristrip><trifan><quads><quadstrip><polygon>") { + name = string(""); + commands = vector<int>(); + rad = 0; + } + + // constructor with data + LODCommand(string& data) : DataEntry("", "<dlist><sphere><points><lines><lineloop><linestrip><tris><tristrip><trifan><quads><quadstrip><polygon>", data.c_str()) { + name = string(""); + commands = vector<int>(); + rad = 0; + + this->update(data); + } + + // getter + string get(void) { return this->toString(); } + + // setter + int update(string& data) { + + // assume its just one line + // is the command valid? + if(!isValidCommand(data)) + return 0; + + // get the name + string newName = BZWParser::key( data.c_str() ); + + // get the data + string value = BZWParser::value( newName.c_str(), data.c_str() ); + + // break up the data into line elements + vector<string> values = vector<string>(); + if(value != newName) + values = BZWParser::getLineElements( value.c_str() ); + + // set the data in the superclass + if(!DataEntry::update(data)) + return 0; + + // load the data in (first clear the arg list) + args.clear(); + this->name = newName; + + // exception: sphere's last arg has to be a float + if(newName == sphere) { + args.push_back( atoi( values[0].c_str() ) ); + args.push_back( atoi( values[1].c_str() ) ); + args.push_back( atoi( values[2].c_str() ) ); + rad = atof( values[3].c_str() ); + } + else if(values.size() > 0) { + for(vector<string>::iterator i = values.begin(); i != values.end(); i++) { + args.push_back( atoi( i->c_str() ) ); + } + } + + return 1; + + } + + /** + * Helper method: determine whether or not the command is valid + */ + + static bool isValidCommand(string& command) { + + // non-existant commands are valid + if(command.length() == 0) + return true; + + // get the name and values + string commandName = BZWParser::key( command.c_str() ); + vector<string> values = BZWParser::getLineElements( BZWParser::value( commandName.c_str(), command.c_str() ) ); + + // make sure its a valid command + // (can't call isKey here--isKey isn't and can't be static) + if(! (commandName == "dlist" || + commandName == "sphere" || + commandName == "points" || + commandName == "lines" || + commandName == "lineloop" || + commandName == "linestrip" || + commandName == "tris" || + commandName == "tristrip" || + commandName == "trifan" || + commandName == "quads" || + commandName == "quadstrip" || + commandName == "polygon") ) + return false; + + // dlist gets 0 args (values[0] will be the same as the key in that case) + if(commandName == "dlist" && values[0] != "dlist") + return false; + + // sphere gets four args + if(commandName == "sphere" && values.size() != 4) + return false; + + // points gets at least one arg + if(commandName == "point" && values[0] == "dlist") + return false; + + // lines gets at least 2 args + if(commandName == "lines" && values.size() < 2) + return false; + + // lineloop gets at least 2 args + if(commandName == "lineloop" && values.size() < 2) + return false; + + // linestrip gets at least 2 args + if(commandName == "linestrip" && values.size() < 2) + return false; + + // tris gets at least 3 args + if(commandName == "tris" && values.size() < 3) + return false; + + // tristrip gets at least 3 args + if(commandName == "tristrip" && values.size() < 3) + return false; + + // trifan gets at least 3 args + if(commandName == "trifan" && values.size() < 3) + return false; + + // quads gets at least 4 args + if(commandName == "quads" && values.size() < 4) + return false; + + // quadstrip gets at least 4 args + if(commandName == "quadStrip" && values.size() < 4) + return false; + + // polygon gets at least 2 + if(commandName == "polygon" && values.size() < 2) + return false; + + // test passed + return true; + } + + // toString + string toString(void) { + if(name == "sphere") + return name + " " + stringify(args) + " " + string(ftoa(rad)); + else + return name + " " + stringify(args); + } + + // render + int render(void) { + return 0; + } + +private: + + // turn an array of ints into a string + string stringify(vector<int>& values) { + string ret = string(""); + + if(values.size() > 0) { + for(vector<int>::iterator i = values.begin(); i != values.end(); i++) { + ret += string(itoa(*i)) + " "; + } + } + + return ret; + } + + string name; + vector<int> args; + float rad; // only used in sphere +}; + +#endif /*LODCOMMAND_H_*/ Added: trunk/bzworkbench/include/MeshFace.h =================================================================== --- trunk/bzworkbench/include/MeshFace.h (rev 0) +++ trunk/bzworkbench/include/MeshFace.h 2007-06-14 05:39:46 UTC (rev 14330) @@ -0,0 +1,201 @@ +#ifndef MESHFACE_H_ +#define MESHFACE_H_ + +#include "DataEntry.h" +#include "model/BZWParser.h" +#include <vector> +#include <string> + +/** + * This is a class for reading, parsing, writing, and storing information about + * a "mesh" object's faces. It assists "mesh" similar to how "ColorCommand" assists + * "dynamicColor" and "Transform" assists "bz2object" + */ + +class MeshFace : public DataEntry { + +public: + + // default constructor + MeshFace() : + DataEntry("face", "<vertices><normals><texcoords><phydrv><matref><drivethrough><shootthrough><passable>") { + vertices = vector<int>(); + normals = vector<int>(); + texcoords = vector<int>(); + physicsDriver = string(""); + materials = vector<string>(); + driveThrough = shootThrough = passable = false; + } + + // constructor with data + MeshFace(string& data) : DataEntry("face", "<vertices><normals><texcoords><phydrv><matref><drivethrough><shootthrough><passable>", data.c_str()) { + vertices = vector<int>(); + normals = vector<int>(); + texcoords = vector<int>(); + physicsDriver = string(""); + materials = vector<string>(); + driveThrough = shootThrough = passable = false; + + this->update(data); + } + + // getter + string get(void) { return this->toString(); } + + // setter + int update(string& data) { + const char* header = this->getHeader().c_str(); + + // get the chunk + vector<string> lines = BZWParser::getSectionsByHeader(header, data.c_str()); + + // break if there are none + if(lines[0] == BZW_NOT_FOUND) + return 0; + + // break if we have more than one + if(!hasOnlyOne(lines, header)) + return 0; + + // get the data + const char* faceData = lines[0].c_str(); + + // get the vertices + vector<string> vertexVals = BZWParser::getValuesByKey("vertices", header, faceData); + if(!hasOnlyOne(vertexVals, "vertices")) + return 0; + + // get the texcoords + vector<string> texCoordVals = BZWParser::getValuesByKey("texcoords", header, faceData); + if(!hasOnlyOne(texCoordVals, "texcoords")) + return 0; + + // get the normals + vector<string> normalVals = BZWParser::getValuesByKey("normals", header, faceData); + if(!hasOnlyOne(normalVals, "normals")) + return 0; + + // get the physics driver + vector<string> physicsDriverVals = BZWParser::getValuesByKey("phydrv", header, faceData); + + // get the materials + vector<string> matrefVals = BZWParser::getValuesByKey("matref", header, faceData); + + // get passable + vector<string> passableVals = BZWParser::getValuesByKey("passable", header, faceData); + + // get drivethrough + vector<string> driveThroughVals = BZWParser::getValuesByKey("drivethrough", header, faceData); + + // get shootthrough + vector<string> shootThroughVals = BZWParser::getValuesByKey("shootthrough", header, faceData); + + // do base-class update + if(!DataEntry::update(data)) + return 0; + + // vertices, texcoords, and normals should have the same number of parameters... + vector<string> vertexParams = BZWParser::getLineElements( vertexVals[0].c_str() ); + vector<string> texCoordParams = BZWParser::getLineElements( texCoordVals[0].c_str() ); + vector<string> normalParams = BZWParser::getLineElements( normalVals[0].c_str() ); + + // check the lengths of the parameters of "vertices", "texcoords", and "normals"...should be the same + // (of not, then break) + if( vertexParams.size() != texCoordParams.size() || + vertexParams.size() != normalParams.size() || + normalParams.size() != texCoordParams.size()) { + printf("mesh::update(): Error! unequal numbers of referenced vertices, normals, and texture coordinates in face!\n"); + printf(" vertices %s\n texcoords %s\n normals%s\n", vertexVals[0].c_str(), texCoordVals[0].c_str(), normalVals[0].c_str() ); + return 0; + } + + // there must be at least three vertices + if( vertexParams.size() < 3) { + printf("mesh::update(): Error! Faces must have at least 3 vertices!\n"); + printf(" vertices %s\n texcoords %s\n normals%s\n", vertexVals[0].c_str(), texCoordVals[0].c_str(), normalVals[0].c_str() ); + return 0; + } + + // load in the data + vertices = parseValues( vertexParams ); + texcoords = parseValues( texCoordParams ); + normals = parseValues( normalParams ); + materials = matrefVals; + physicsDriver = ( physicsDriverVals.size() == 0 ? "" : physicsDriverVals[0] ); + driveThrough = ( driveThroughVals.size() == 0 ? false : true ); + shootThrough = ( shootThroughVals.size() == 0 ? false : true ); + passable = ( passableVals.size() == 0 ? (false || (driveThrough && shootThrough)) : true ); + + return 1; + } + + // toString + string toString(void) { + // string-ify the material list + string matstring = string(""); + if(materials.size() > 0) { + for(vector<string>::iterator i = materials.begin(); i != materials.end(); i++) { + matstring += " matref " + (*i) + "\n"; + } + } + + return string("face\n") + + " vertices " + stringify(vertices) + "\n" + + " texcoords " + stringify(texcoords) + "\n" + + " normals " + stringify(normals) + "\n" + + matstring + + (physicsDriver.length() != 0 ? " " + physicsDriver + "\n" : "") + + (passable == true ? " passable\n" : "") + + (shootThrough == true ? " shootthrough\n" : "") + + (driveThrough == true ? " drivethrough\n" : "") + + "end\n"; + + } + + // render + int render(void) { + return 0; + } + +private: + + /** + * Helper method: convert an array of strings into an array of ints + */ + vector<int> parseValues(vector<string>& values) { + vector<int> ret = vector<int>(); + + if(values.size() > 0) { + for(vector<string>::iterator i = values.begin(); i != values.end(); i++) { + ret.push_back( atoi( i->c_str() ) ); + } + } + + return ret; + } + + /** + * Helper method: convert an array of ints into a string + */ + + string stringify(vector<int>& values) { + string ret = string(""); + + if(values.size() > 0) { + for(vector<int>::iterator i = values.begin(); i != values.end(); i++) { + ret += string(itoa(*i)) + " "; + } + } + + return ret; + } + vector<int> vertices; + vector<int> normals; + vector<int> texcoords; + string physicsDriver; + vector<string> materials; + + bool driveThrough, shootThrough, passable; +}; + +#endif /*MESHFACE_H_*/ Added: trunk/bzworkbench/include/mesh.h =================================================================== --- trunk/bzworkbench/include/mesh.h (rev 0) +++ trunk/bzworkbench/include/mesh.h 2007-06-14 05:39:46 UTC (rev 14330) @@ -0,0 +1,63 @@ +#ifndef MESH_H_ +#define MESH_H_ + +#include "bz2object.h" +#include "../render/Point3D.h" +#include "../render/Index3D.h" +#include "../render/TexCoord2D.h" +#include "../render/Vector3D.h" +#include "../MeshFace.h" + +class mesh : public bz2object { + +public: + + // constructor + mesh(void); + + // constructor with data + mesh(string& data); + + // getter + string get(void); + + // setter + int update(string& data); + + // toString + string toString(void); + + // render + int render(void); + +private: + + // vertices + vector<Point3D> vertices; + + // indexes + vector<Index3D> indexes; + + // texture coordinates + vector<TexCoord2D> texCoords; + + // normals + vector<Vector3D> normals; + + // inside points + vector<Point3D> insidePoints; + + // outside points + vector<Point3D> outsidePoints; + + // boolean options + bool noClusters, smoothBounce; + + // global materials + vector<string> materials; + + // faces + vector<MeshFace> faces; +}; + +#endif /*MESH_H_*/ Modified: trunk/bzworkbench/include/render/Index3D.h =================================================================== --- trunk/bzworkbench/include/render/Index3D.h 2007-06-14 05:31:22 UTC (rev 14329) +++ trunk/bzworkbench/include/render/Index3D.h 2007-06-14 05:39:46 UTC (rev 14330) @@ -1,6 +1,8 @@ #ifndef INDEX3D_H_ #define INDEX3D_H_ +#include "../model/BZWParser.h" + class Index3D { public: @@ -30,6 +32,28 @@ this->t3 = t3; } + Index3D(const char* description) { + vector<string> points = BZWParser::getLineElements(description); + + // only initialize from the string if there are at least 3 elements + if(points.size() == 3) { + this->a = atoi( points[0].c_str() ); + this->b = atoi( points[1].c_str() ); + this->c = atoi( points[2].c_str() ); + } + else if(points.size() == 6) { + this->a = atoi( points[0].c_str() ); + this->b = atoi( points[1].c_str() ); + this->c = atoi( points[2].c_str() ); + this->t1 = atoi( points[3].c_str() ); + this->t2 = atoi( points[4].c_str() ); + this->t3 = atoi( points[5].c_str() ); + } + else { + a = b = c = t1 = t2 = t3 = 0; + } + } + virtual ~Index3D() {} }; Added: trunk/bzworkbench/objects/mesh.cpp =================================================================== --- trunk/bzworkbench/objects/mesh.cpp (rev 0) +++ trunk/bzworkbench/objects/mesh.cpp 2007-06-14 05:39:46 UTC (rev 14330) @@ -0,0 +1,3 @@ +#include "../include/objects/mesh.h" + +// default constructor This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |