X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2F3dengfx%2Fsrc%2F3dengfx%2Fobject.hpp;fp=src%2F3dengfx%2Fsrc%2F3dengfx%2Fobject.hpp;h=c66d84377064c7022307d354440cb0a58d6d9322;hb=6e23259dbabaeb1711a2a5ca25b9cb421f693759;hp=0000000000000000000000000000000000000000;hpb=fe068fa879814784c45e0cb2e65dac489e8f5594;p=summerhack diff --git a/src/3dengfx/src/3dengfx/object.hpp b/src/3dengfx/src/3dengfx/object.hpp new file mode 100644 index 0000000..c66d843 --- /dev/null +++ b/src/3dengfx/src/3dengfx/object.hpp @@ -0,0 +1,182 @@ +/* +This file is part of the 3dengfx, realtime visualization system. + +Copyright (c) 2004, 2005 John Tsiombikas + +3dengfx is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +3dengfx is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with 3dengfx; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/* higher level 3d object abstraction + * + * Author: John Tsiombikas 2004 + * Modified: John Tsiombikas 2005 + */ + +#ifndef _OBJECT_HPP_ +#define _OBJECT_HPP_ + +#include +#include "gfx/3dgeom.hpp" +#include "gfx/animation.hpp" +#include "n3dmath2/n3dmath2.hpp" +#include "material.hpp" +#include "3denginefx.hpp" +#include "gfx/bvol.hpp" + +struct RenderParams { + bool billboarded; + bool zwrite; + bool blending; + BlendingFactor src_blend, dest_blend; + bool handle_blending; + GfxProg *gfxprog; + bool auto_cube_maps; + bool hidden; + bool show_normals; + scalar_t show_normals_scale; + bool highlight; + Color highlight_color; + scalar_t highlight_line_width; + bool two_sided; + bool use_vertex_color; + TextureAddressing taddr; + bool auto_normalize; + bool cast_shadows; + + RenderParams(); +}; + +enum { + RMODE_COLOR = 1, // unused + RMODE_LIGHTING = 2, // unused + RMODE_TEXTURES = 4, + RMODE_BLENDING = 8, + RMODE_SHADERS = 16, + RMODE_ALL = 0xffff +}; + +// this bitfield determines which aspects of rendering will actually take place +// it overrides all render parameters. +extern unsigned long master_render_mode; + +class Object : public XFormNode { +private: + Matrix4x4 world_mat; + RenderParams render_params; + BoundingVolume *bvol; + bool bvol_valid; + + void render_hack(unsigned long time); + + void draw_normals(); + void draw_highlight(); + + void setup_bump_light(unsigned long time); + void update_bounding_volume(); + +public: + TriMesh mesh; + Material mat; + + Object(); + Object(const TriMesh &mesh); + ~Object(); + + void set_mesh(const TriMesh &mesh); + TriMesh *get_mesh_ptr(); + TriMesh &get_mesh(); + const TriMesh &get_mesh() const; + + // shortcut functions for accessing the geometry easily + unsigned long get_vertex_count() const; + const Vertex *get_vertex_data() const; + Vertex *get_mod_vertex_data(); + unsigned long get_triangle_count() const; + const Triangle *get_triangle_data() const; + Triangle *get_mod_triangle_data(); + + void set_dynamic(bool enable); + bool get_dynamic() const; + + void set_material(const Material &mat); + Material *get_material_ptr(); + Material get_material() const; + + void set_render_params(const RenderParams &rp); + RenderParams get_render_params() const; + + void set_shading(ShadeMode shading_mode); + void set_billboarding(bool enable); + void set_zwrite(bool enable); + void set_blending(bool enable); + void set_blending_mode(BlendingFactor sblend, BlendingFactor dblend); + void set_handle_blending(bool enable); + void set_wireframe(bool enable); + void set_gfx_program(GfxProg *prog); + void set_auto_cube_maps(bool enable); + void set_hidden(bool enable); + void set_show_normals(bool enable); + void set_show_normals_scale(scalar_t scale); + void set_highlight(bool enable); + void set_highlight_color(const Color &color); + void set_highlight_line_width(scalar_t width); + void set_auto_global(bool enable); + void set_use_vertex_color(bool enable); + void set_texture_addressing(TextureAddressing taddr); + void set_auto_normalize(bool enable); + void set_shadow_casting(bool enable); + + void apply_xform(unsigned long time = XFORM_LOCAL_PRS); + + void calculate_normals(); + void normalize_normals(); + + bool render(unsigned long time = XFORM_LOCAL_PRS); +}; + + +// --- some convinient derived objects for geom. generation --- + +class ObjCube : public Object { +public: + ObjCube(scalar_t sz, int subdiv); +}; + +class ObjPlane : public Object { +public: + ObjPlane(const Vector3 &normal = Vector3(0, 1, 0), const Vector2 &size = Vector2(1, 1), int subdiv = 0); +}; + +class ObjCylinder : public Object { +public: + ObjCylinder(scalar_t rad = 1.0, scalar_t len = 1.0, bool caps = true, int udiv = 12, int vdiv = 0); +}; + +class ObjSphere : public Object { +public: + ObjSphere(scalar_t radius = 1.0, int subdiv = 5); +}; + +class ObjTorus : public Object { +public: + ObjTorus(scalar_t circle_rad = 0.5, scalar_t revolv_rad = 1.0, int subdiv = 5); +}; + +class ObjTeapot : public Object { +public: + ObjTeapot(scalar_t size = 1.0, int subdiv = 5); +}; + +#endif // _OBJECT_HPP_