#ifndef ENGINE_H #define ENGINE_H #include #include #include #include #include #include "OdeWorld/OdeWorld.h" #include "TextureCache/TextureCache.h" #include "FileLoader/FileLoader.h" #include "wfobj/WFObj.h" #include "AV.h" #include "refptr/refptr.h" #include "ftgl.h" #include "PhyObj/PhyObj.h" #include "IDSet.h" class Engine { public: class Object { public: Object(bool is_static, bool is_reference, bool enable_blending, OdeWorld & world, WFObj * wfobj, float scale = 1.0f); Object(bool is_static, bool is_reference, bool enable_blending, OdeWorld & world, OdeWorld::GeomType geom_type, refptr< std::vector > args); Object(const Object & orig); ~Object(); void setPosition(double x, double y, double z); void getPosition(double * x, double * y, double * z); void loadPhy(FileLoader * fl, const FileLoader::Path & path); void instantiatePhy(); void setVisible(bool visible) { m_is_visible = visible; } bool getVisible() { return m_is_visible; } void addForce(dReal fx, dReal fy, dReal fz) { if (m_ode_object != NULL) m_ode_object->addForce(fx, fy, fz); } void addForceRel(dReal fx, dReal fy, dReal fz) { if (m_ode_object != NULL) m_ode_object->addForceRel(fx, fy, fz); } void addTorque(dReal fx, dReal fy, dReal fz) { if (m_ode_object != NULL) m_ode_object->addTorque(fx, fy, fz); } void addTorqueRel(dReal fx, dReal fy, dReal fz) { if (m_ode_object != NULL) m_ode_object->addTorqueRel(fx, fy, fz); } void setRotation(dReal x, dReal y, dReal z) { if (m_ode_object != NULL) m_ode_object->setRotation(x, y, z); } void setColor(float r, float g, float b) { m_color[0] = r; m_color[1] = g; m_color[2] = b; render(); } void setTransparency(float t) { m_color[3] = 1.0f - t; render(); } void setTexture(GLuint tex); void setTextureScale(float scale) { m_texture_scale = scale; render(); } void draw(); dReal getMass() const; void setMass(dReal mass); const float * getAABB() { return m_aabb; } dBodyID getBody() { return (m_ode_object != NULL) ? m_ode_object->getBody() : 0; } void setGravityMode(bool enabled) { m_gravity_mode = enabled; if (m_ode_object != NULL) m_ode_object->setGravityMode(enabled); } void setID(int id) { m_id = id; } int getID() { return m_id; } OdeWorld::Object *getOdeWorldObject() { return m_ode_object; } protected: void createManagedObject(); void render(); OdeWorld::Object * m_ode_object; GLuint m_display_list; bool m_is_visible; float m_scale; bool m_is_scaled; bool m_is_managed; bool m_is_reference; bool m_is_static; float m_aabb[6]; OdeWorld & m_world; refptr m_phy; dReal m_mass; bool m_mass_is_set; bool m_gravity_mode; int m_id; bool m_enable_blending; /* for "pre-loaded" objects */ int * m_display_list_refcnt; /* for "managed" objects */ OdeWorld::GeomType m_geom_type; refptr< std::vector > m_args; float m_color[4]; GLuint m_texture; float m_texture_scale; }; class EngineFileLoader : public FileLoader { public: EngineFileLoader(Engine * engine); virtual int getSize(const Path & path); virtual Buffer load(const Path & path); protected: std::string resolvePath(const Path & path); Engine * m_engine; }; class PickedObject { public: int id; float dist; float pos[3]; float normal[3]; PickedObject(OdeWorld::PickedObjectRef por); }; typedef refptr PickedObjectRef; class Quad { public: Quad(float cx, float cy, float cz, float v1x, float v1y, float v1z, float v2x, float v2y, float v2z); ~Quad(); int render(); void setVisible(bool v) { m_visible = v; } void draw() { if (m_visible && m_dl > 0) glCallList(m_dl); } void setOffset(float f) { m_offset = f; render(); } void setTexture(int t) { m_texture = t; render(); } void setBlending(bool b) { m_enable_blending = b; render(); } protected: dVector3 m_center; dVector3 m_v1, m_v2, m_normal; int m_dl; bool m_visible; float m_offset; int m_texture; bool m_enable_blending; }; Engine(const std::string & path, AV & av); ~Engine(); std::string locateResource(const std::string & shortname); bool load(const char * program); void run(); void reportErrors(int status); OdeWorld & getWorld() { return m_world; } int addObject(WFObj * obj, bool is_static, bool is_reference, bool enable_blending, float scale = 1.0f); int addObject(bool is_static, bool is_reference, bool enable_blending, OdeWorld::GeomType geom_type, refptr< std::vector > args); int addSound(refptr avs); int addAMotor(Object * o1, Object * o2); int addHinge(Object * o1, Object * o2, dReal anchor_x, dReal anchor_y, dReal anchor_z, dReal axis_x, dReal axis_y, dReal axis_z); void setAMotorAxis(int jid, int anum, int rel, dReal x, dReal y, dReal z); void setAMotorNumAxes(int jid, int num_axes); void setAMotorAngle(int jid, int anum, dReal val); void setAMotorLoStop(int jid, dReal val); void setAMotorHiStop(int jid, dReal val); void setAMotorVel(int jid, dReal val); void setAMotorFMax(int jid, dReal val); void setAMotorBounce(int jid, dReal val); void removeObject(int id); int cloneObject(const Object * obj); Object * getObject(int id); refptr getSound(int id); void doPhysics(); void drawObjects(); void setAutoPhysics(bool val) { m_autoPhysics = val; } bool getAutoPhysics() { return m_autoPhysics; } void setAutoStartFrame(bool val) { m_autoStartFrame = val; } bool getAutoStartFrame() { return m_autoStartFrame; } void setAutoEndFrame(bool val) { m_autoEndFrame = val; } bool getAutoEndFrame() { return m_autoEndFrame; } void setAutoDrawObjects(bool val) { m_autoDrawObjects = val; } bool getAutoDrawObjects() { return m_autoDrawObjects; } void startFrame(); void endFrame(); int loadModel(const std::string & name, bool is_static, bool is_reference, bool enable_blending, float scale = 1.0f); int loadSound(const std::string & name); bool isKeyDown(const std::string & key); void exit(); bool import(const char * name); bool importFullPath(const char * path); GLuint loadTexture(const char * name); void debug_hook(lua_Debug * debug); void setGravity(float gx, float gy, float gz) { m_world.setGravity(gx, gy, gz); } GLuint startList(); void endList(); void drawList(GLuint list); void callList(GLuint list); void clearWorld(); void setScriptCursorVisible(bool visible) { m_script_cursor_visible = visible; updateCursorVisibility(); } bool getScriptCursorVisible() { return m_script_cursor_visible; } refptr< std::vector > pickObjects(int x, int y); PickedObjectRef pickOne(int x, int y, Object *obj); void getScreenSize(int * width, int * height); void drawText(const char * text, GLfloat r, GLfloat g, GLfloat b, int ptsize, float x, float y); void getTextSize(const char * text, int ptsize, float * width, float * height); void drawLine(float r, float g, float b, float x1, float y1, float x2, float y2, float width = 1.0f); void drawRect(float r, float g, float b, float width, float height, float x, float y, float rot = 0.0f); void fillRect(float r, float g, float b, float width, float height, float x, float y, float rot = 0.0f); void drawImage(float width, float height, float x, float y, int tex, float rot = 0.0f); void fillArc(float r, float g, float b, float x, float y, float radius, float a1, float a2); void drawArc(float r, float g, float b, float x, float y, float radius, float a1, float a2); void drawPoint(float size, float r, float g, float b, float x, float y, float z); /* lua services */ int setCamera(lua_State * L); int getCamera(lua_State * L); int registerEventHandler(lua_State * L); int clearEventHandler(lua_State * L); protected: static Uint32 updateCallback(Uint32 interval, void * param); Uint32 updateCallback(Uint32 interval); void registerLibraries(); bool fileExists(const std::string & path); void update_event(); void update_overlay_event(); void key_down_event(int keysym); void key_up_event(int keysym); void mousebutton_down_event(int button, int x, int y); void mousebutton_up_event(int button, int x, int y); void mouse_motion_event(int x, int y, int xrel, int yrel); void checkForFunctionFull(const std::string & lua_fn_name, const std::string & event_name, bool & presentFlag); void doRegisterHandlerFull(int index, const std::string & event_name, bool & presentFlag); void reloadProgram(); void checkForAllHandlerFunctions(); void updateCursorVisibility() { m_av.setCursorVisible( m_engine_cursor_visible || m_script_cursor_visible); } bool validatePath(std::string & path); AV & m_av; bool m_engine_cursor_visible; bool m_script_cursor_visible; bool m_input_grabbed; TextureCache m_textureCache; EngineFileLoader * m_fileLoader; lua_State * m_luaState; std::string m_program_path; std::string m_program_directory; std::string m_engine_path; OdeWorld m_world; IDSet m_objects; IDSet< refptr > m_sounds; IDSet m_joints; GLdouble m_eye[3]; GLdouble m_center[3]; GLdouble m_up[3]; bool m_drawing; bool m_autoPhysics; bool m_autoStartFrame; bool m_autoEndFrame; bool m_autoDrawObjects; std::map m_keysDown; SDL_Event m_updateEvent; SDL_Event m_exitEvent; Uint32 m_event_time; FTFont * m_font; double m_screen_dist; bool m_event_init_present; bool m_event_reinit_present; bool m_event_update_present; bool m_event_update_overlay_present; bool m_event_key_down_present; bool m_event_key_up_present; bool m_event_mousebutton_down_present; bool m_event_mousebutton_up_present; bool m_event_mouse_motion_present; }; extern Engine * g_engine; #endif