/* -------------------- Program: ESQUI Info and Bugs: {marf,rsantana}@ctm.ulpgc.es ------------------------------------------- Copyright (c) 2006, Center for Technology in Medicine, University of Las Palmas de Gran Canaria (Canary Islands, Spain). All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the Creative Commons' "by-attribution" license (http://creativecommons.org/licenses/by/2.5). Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1) Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. =============================================================================*/ #ifndef _VTKCCOLLISION_v10B_ #define _VTKCCOLLISION_v10B_ ////////////////////////////////////////////// /// Aqui los ficheros de inclusion necesarios //Libreria generica sin implementacion #include "vtkLibGenerica.h" #include "vtkesquiColisionWin32Header.h" ////////////////////////////////////////////// /// Eleccion de la libreria de Deteccion de /// Colisiones que se va a utilizar // Definicion de cada libreria que se utiliza. // Poner una linea nueva por cada libreria y // comentar todas menos la que se desee utilzar. #define COLDETECT //*************************************Se añade el identificador de la otra libreria************* //*********************************************************************************************** #ifdef COLDETECT #include "vtkColDetect.h" #endif //COLDETECT #ifdef OTRALIBRERIA #include "vtkBioEngInterface.h" #endif class vtkInfoColisionCollection; ////////////////////////////////////////////// #define MAX_DEFORMABLES 10 #define MAX_HERRAMIENTAS 2 #define MAX_ESTATICOS 10 #define MAX_COLISIONES 3000 #define MAX_PARESCOLISIONABLES 3000 #define MAX_BOLAS 30 //! Implementacion del sistema de deteccion de colisiones. class VTK_ESQUI_COLISION_EXPORT vtkColision: public vtkObject { // ***** Atributos protected: vtkLibGenerica* Libreria; //BTX //! Vectores para los distintos tipos de objetos con los que habra que calcular colision //! Vector de modelos deformables std::vector VectorDeDeformables; //! Vector de herramientas std::vector VectorDeHerramientas; //! Vector de elementos estaticos del escenario std::vector VectorDeEstaticos; //! Vector de esferas std::vector VectorDeBolas; //! Vector de Colisiones vtkInfoColisionCollection *VectorDeColisiones; //! Vector de identificadores de colisiones std::vector VectorDeIdColisiones; //ETX //! Libreria inicializada? bool Inicializado; vtkColision(); ~vtkColision(); //***** Metodos Publicos public: vtkTypeRevisionMacro(vtkColision, vtkObject); static vtkColision *New() { return new vtkColision; }; const char *GetClassName() {return "vtkColision";}; /// ---------- Constructor / Destructor ----------- void SetRenderer(vtkRenderer *ren) {this->Libreria->Renderer = ren;} //Description: //! Inicializacion de la libreria de colisiones. Devuelve 1 si se ha inicializado correctamente int Iniciar(); //! Inicializacion de la libreria de colisiones bool inicializar(); //! Crea los modelos internos para la deteccion de colisiones void InitCollisions(); void idPosiblesColisiones(); void crearArbolesColision(); vtkInfoColisionCollection *GetVectorDeColisiones(); //******* Gestion de los objetos que intervienen en la detecci� de colisiones // ======================================== //! Anadir objetos colisiones /*! Devuelven la posicion en los vectores que sera el identificador para ese modelo. */ int anadirDeformable(vtkModeloDeformable* pDeformable); //! Anadir objetos colisiones /*! Devuelven la posicion en los vectores que sera el identificador para ese modelo. */ int anadirHerramienta(vtkModeloHerramienta* pHerramienta); //! Anadir objetos colisiones /*! Devuelven la posicion en los vectores que sera el identificador para ese modelo. */ int anadirEstatico(vtkModeloEstatico* pEstatico); //! Anadir objetos colisiones /*! Devuelven la posicion en los vectores que sera el identificador para ese modelo. */ int anadirBola(vtkEsfera* pEsfera); // =============================================== // Borrar objetos colisiones // Solo lo borra del vector, no libera la memoria // Devuelve false si no se ha podido borrar // =============================================== //! Borrar objetos colisiones /*! Solo lo borra del vector, no libera la memoria Devuelve false si no se ha podido borrar */ bool eliminarDeformable(int pos); //! Borrar objetos colisiones /*! Solo lo borra del vector, no libera la memoria Devuelve false si no se ha podido borrar */ bool eliminarHerramienta(int pos); //! Borrar objetos colisiones /*! Solo lo borra del vector, no libera la memoria Devuelve false si no se ha podido borrar */ bool eliminarEstatico(int pos); //! Borrar objetos colisiones /*! Solo lo borra del vector, no libera la memoria Devuelve false si no se ha podido borrar */ bool eliminarBola(int pos); // ======================================== // =============================================== // Inserta en una posicion objetos colisiones // Si existia, sustituye el objeto anterior // Devuelve false si no se ha podido insertar // =============================================== //! Inserta en una posicion objetos colisiones /*! Si existia, sustituye el objeto anterior Devuelve false si no se ha podido insertar */ bool insertarDeformable(int pos,vtkModeloDeformable* pDeformable); //! Inserta en una posicion objetos colisiones /*! Si existia, sustituye el objeto anterior Devuelve false si no se ha podido insertar */ bool insertarHerramienta(int pos,vtkModeloHerramienta* pHerramienta, bool bNueva = false); int insertarHerramienta(int pos,vtkModeloHerramienta* pHerramienta, int bnueva = 0); //! Inserta en una posicion objetos colisiones /*! Si existia, sustituye el objeto anterior Devuelve false si no se ha podido insertar */ bool insertarEstatico(int pos,vtkModeloEstatico* pEstatico); // ======================================== //******* Deteccion de las colisiones // =============================================== // Realiza la deteccion de colisiones // Devuelve el nmero de colisiones encontradas (0 si no hay), // y la lista de colisiones en el vector vCollisions // =============================================== //BTX //! Deteccion de las colisiones // =============================================== /*! Realiza la deteccion de colisiones Devuelve el numero de colisiones encontradas (0 si no hay), y la lista de colisiones en el vector vCollisions */ // =============================================== int detectarColision(vtkInfoColisionCollection *vColisiones); //ETX // =============================================== double* obtenerMatriz(unsigned id); //***** Metodos Privados private: // Description: //! Busca las colisiones entre organos deformables y herramientas /*! Almacena todos los resultados en la variable local _vColisiones No hacer borrados generales !!! se usa en otros metodos */ void colisionesOrganoHerramienta(); // Description: //! Busca las colisiones entre herramientas /*! Almacena todos los resultados en la variable local _vColisiones No hacer borrados generales !!! se usa en otros metodos */ void colisionesHerramientas(); // Description: //! Busca las colisiones entre herramientas y bolas /*! Almacena todos los resultados en la variable local _vColisiones No hacer borrados generales !!! se usa en otros metodos */ void colisionesHerramientasBolas(); private: vtkColision(const vtkColision &); //NotImplemented void operator =(const vtkColision &); //Not Implemented }; #endif