/** * Method is used to compose result solid. * @param faceStatus1 is face status. * @param faceStatus2 is face status. * @param faceStatus3 is face status. * @return pointer to result solid. */ Solid* GeoModifier::composeSolid(int faceStatus1, int faceStatus2, int faceStatus3) { VertexSet* vertices = new VertexSet(); IntSet* indices = new IntSet(); groupObjectComponents(*firstObject, *vertices, *indices, faceStatus1, faceStatus2); groupObjectComponents(*secondObject, *vertices, *indices, faceStatus3, faceStatus3); VectorSet * vectors = new VectorSet(); for(int i = 0; i < vertices->GetNumVertices(); i++) { Vertex * pVertex = vertices->GetVertex(i); vectors->push_back(pVertex->getPosition()); } Solid* result = new Solid(); result->indices = *indices; result->vertices = *vectors; delete indices; delete vertices; delete vectors; return result; }
/** * Accessor to vertices. * @return pointer to vertices collection. */ VectorSet* getVertices() { VectorSet* newVertices = new VectorSet(); for(unsigned i = 0; i < vertices.size(); i++) newVertices->push_back(vertices[i]); return newVertices; }
inline void SchoolFish::applyAvoidance(Vector &accumulator) { // only avoid the player if not in the background if (this->layer < LR_ELEMENTS10) { if ((dsq->game->avatar->position - this->position).isLength2DIn(128)) { avoid(accumulator, dsq->game->avatar->position); } } //return; if (avoidTime>0) return; VectorSet closestObs; VectorSet obsPos; //Vector closestObs; int range = 10; int radius = range*TILE_SIZE; Vector p; TileVector t0(position); TileVector t; for (int x = -range; x <= range; x++) { for (int y = -range; y <= range; y++) { TileVector t = t0; t.x+=x; t.y+=y; if (dsq->game->isObstructed(t)) { p = t.worldVector(); closestObs.push_back(this->position - p); obsPos.push_back(p); /* std::ostringstream os; os << "tile(" << t.x << ", " << t.y << ") p(" << p.x << ", " << p.y << ")"; debugLog(os.str()); */ /* int len = (p - this->position).getSquaredLength2D(); if (len < sqr(radius)) { closestObs.push_back(this->position - p); obsPos.push_back(p); } */ } } } if (!closestObs.empty()) { //avoid (accumulator, this->averageVectors(closestObs)); //accumulator = Vector(0,0,0); Vector change; change = averageVectors(closestObs); //change |= 200; float dist = (this->position - averageVectors(obsPos)).getLength2D(); float ratio = dist / radius; if (ratio < minUrgency) ratio = minUrgency; else if (ratio > maxUrgency) ratio = maxUrgency; change.setLength2D(ratio + lastVel.getLength2D()/10); accumulator += change; } if (this->range!=0) { if (!((position - startPos).isLength2DIn(this->range))) { Vector diff = startPos - position; diff.setLength2D(lastVel.getLength2D()); accumulator += diff; } } }