// static void LLHUDObject::updateAll() { LLFastTimer ftm(LLFastTimer::FTM_HUD_UPDATE); LLHUDText::updateAll(); LLHUDIcon::updateAll(); sortObjects(); }
HBB::HBB(std::vector<Object*> objects, int axis) { std::vector<Object*> copy; for(unsigned int i=0; i<objects.size();i++) copy.push_back(objects.at(i)); int n = copy.size(); if (n==1){ left = copy.at(0); right = NULL; box = Cube(left->getMin(),left->getMax()); left_node = NULL; right_node = NULL; } else if(n==2){ left = copy.at(0); right = copy.at(1); box = box.combineCube(left->boundingBox(),right->boundingBox()); left_node = NULL; right_node = NULL; }else{ //ordenar segundo o eixo std::vector<Object*> sort = sortObjects(copy,axis); for(unsigned int i=0; i<sort.size();i++) copy.at(i) = sort.at(i); std::vector<Object*> l; std::vector<Object*> r; for (int i=0;i<n/2;i++){ l.push_back(copy.at(i)); } for (int i=n/2;i<n;i++){ r.push_back(copy.at(i)); } left_node = new HBB(l,(axis+1)%3); right_node = new HBB(r,(axis+1)%3); left = NULL; right = NULL; box = box.combineCube(left_node->box,right_node->box); } }
void Renderer::renderArea(const FixedRect& area, CairoLayer layers[], double width, double height, RenderAttributes& map, AssetCache& cache) { // sort objects into acroding to z-index std::vector<NodeId> nodes; std::vector<WayId> ways; std::vector<RelId> relations; sortObjects(map, nodes, ways, relations); // transform Mercator to tile coordinates Cairo::Matrix trans = Cairo::scaling_matrix(width / (double) area.getWidth(), height / (double) area.getHeight()); trans.translate(-area.minX, -area.minY); std::list<shared_ptr<Label> > labels; std::list<shared_ptr<Shield> > shields; // render objects and collect label positions renderObjects(layers, map, trans, nodes, ways, relations, labels, shields, cache); // sort, place and render shields std::vector<shared_ptr<Shield> > placedShields; placedShields.reserve(10); shields.sort(&CompareLabels<Shield>); placeShields(shields, placedShields); renderShields(layers[LAYER_LABELS].cr, placedShields); renderLabels<Shield>(layers[LAYER_LABELS].cr, placedShields, cache); // sort, place and render labels std::vector<shared_ptr<Label> > placedLabels; placedLabels.reserve(labels.size()); labels.sort(&CompareLabels<Label>); placeLabels(labels, placedLabels); renderLabels<Label>(layers[LAYER_LABELS].cr, placedLabels, cache); compositeLayers(layers); }
void Game::redrawObjects() { sortObjects(); int previousObject = -1; for (int i = 0; i < _sceneObjectsCount; ++i) { SceneObject *so = _sortedSceneObjectsTable[i]; if (so->state == 1 || so->state == 2) { if (previousObject >= 0) { redrawObjectBoxes(previousObject, i); } previousObject = i; _sceneObjectFramesTable[so->frameNum].decode(_sceneObjectFramesTable[so->frameNum].data, _tempDecodeBuffer); if (_isDemo && _sceneNumber == 1 && i == 14) { // FIXME fixes wrong overlapping icon in the first scene of the demo // object 13 pos 582,423 frame 1885 - should be displayed // object 14 pos 582,423 frame 1884 - shouldn't be displayed continue; } if (so->flip == 2) { int16_t y = _bitmapBuffer1.h + 1 - so->y - _sceneObjectFramesTable[so->frameNum].hdr.h; drawObjectVerticalFlip(so->x, y, _tempDecodeBuffer, &_bitmapBuffer1); } else { int16_t y = _bitmapBuffer1.h + 1 - so->y - _sceneObjectFramesTable[so->frameNum].hdr.h; drawObject(so->x, y, _tempDecodeBuffer, &_bitmapBuffer1); } } } if (previousObject >= 0) { redrawObjectBoxes(previousObject, previousObject); } // no overlay graphics on static screens // // retail data files // PIC0.SCN: SceneNumber -1000 // PIC1.SCN: SceneNumber -1000 // PIC2.SCN: SceneNumber -1000 // PIC3.SCN: SceneNumber -1000 // // demo data files // A01.SCN: SceneNumber -1000 // A02.SCN: SceneNumber -1001 // A03.SCN: SceneNumber -1003 // if (_sceneNumber > -1000 && _sceneObjectsCount != 0) { if (!_isDemo && _gameOver) { decodeLzss(_bermudaOvrData + 2, _tempDecodeBuffer); drawObject(93, _bitmapBuffer1.h - 230, _tempDecodeBuffer, &_bitmapBuffer1); } if (_currentBagObject >= 0 && _currentBagObject < _bagObjectsCount && _currentBagAction == 3) { drawObject(_bagPosX, _bitmapBuffer1.h + 1 - _bagPosY - getBitmapHeight(_iconBackgroundImage), _iconBackgroundImage, &_bitmapBuffer1); int invW = getBitmapWidth(_iconBackgroundImage); int invH = getBitmapHeight(_iconBackgroundImage); int bagObjW = getBitmapWidth(_bagObjectsTable[_currentBagObject].data); int bagObjH = getBitmapHeight(_bagObjectsTable[_currentBagObject].data); int y = _bitmapBuffer1.h + 1 - _bagPosY - (invH - bagObjH) / 2 - bagObjH; int x = _bagPosX + (invW - bagObjW) / 2; drawObject(x, y, _bagObjectsTable[_currentBagObject].data, &_bitmapBuffer1); } if (_lifeBarDisplayed) { drawObject(386, _bitmapBuffer1.h - 18 - getBitmapHeight(_lifeBarImage), _lifeBarImage, &_bitmapBuffer1); if (_varsTable[1] == 1) { drawObject(150, _bitmapBuffer1.h - 18 - getBitmapHeight(_lifeBarImage), _lifeBarImage, &_bitmapBuffer1); if (_swordIconImage) { drawObject(173, _bitmapBuffer1.h - 18 - getBitmapHeight(_swordIconImage), _swordIconImage, &_bitmapBuffer1); } } else if (_varsTable[2] == 1) { drawObject(150, _bitmapBuffer1.h - 18 - getBitmapHeight(_lifeBarImage), _lifeBarImage, &_bitmapBuffer1); int index = MIN(13, 13 - _varsTable[4]); drawObject(173, _bitmapBuffer1.h - 31 - getBitmapHeight(_weaponIconImageTable[index]), _weaponIconImageTable[index], &_bitmapBuffer1); if (_varsTable[3] < 5) { index = (_varsTable[4] <= 0) ? 0 : 1; uint8_t *p = _ammoIconImageTable[index][_varsTable[3]]; drawObject(184, _bitmapBuffer1.h - 41 - getBitmapHeight(p), p, &_bitmapBuffer1); } } int index = (_varsTable[0] >= 10) ? 10 : _varsTable[0]; uint8_t *lifeBarFrame = _lifeBarImageTable[index][_lifeBarCurrentFrame]; drawObject(409, _bitmapBuffer1.h - 36 - getBitmapHeight(lifeBarFrame), lifeBarFrame, &_bitmapBuffer1); ++_lifeBarCurrentFrame; if (_lifeBarCurrentFrame >= 12) { _lifeBarCurrentFrame = 0; } } #if 0 if (_lifeBarDisplayed || _lifeBarDisplayed2) { if (_varsTable[2] == 1 || _varsTable[1] == 1) { win16_stretchBits(&_bitmapBuffer1, getBitmapHeight(_lifeBarImage), getBitmapWidth(_lifeBarImage), _bitmapBuffer1.h - 18 - getBitmapHeight(_lifeBarImage), 150, getBitmapHeight(_lifeBarImage), getBitmapWidth(_lifeBarImage), 19, 150 ); } win16_stretchBits(&_bitmapBuffer1, getBitmapHeight(_lifeBarImage), getBitmapWidth(_lifeBarImage), _bitmapBuffer1.h - 18 - getBitmapHeight(_lifeBarImage), 386, getBitmapHeight(_lifeBarImage), getBitmapWidth(_lifeBarImage), 19, 386 ); _lifeBarDisplayed2 = _lifeBarDisplayed; } if (_previousBagAction == kActionUseObject || _currentBagAction == kActionUseObject) { if (_currentBagObject != _previousBagObject || _previousBagAction != _currentBagAction) { win16_stretchBits(&_bitmapBuffer1, getBitmapHeight(_iconBackgroundImage), getBitmapWidth(_iconBackgroundImage), _bitmapBuffer1.h + 1 - _bagPosY - getBitmapHeight(_iconBackgroundImage), _bagPosX, getBitmapHeight(_iconBackgroundImage), getBitmapWidth(_iconBackgroundImage), _bagPosY, _bagPosX ); } } #endif } win16_stretchBits(&_bitmapBuffer1, _bitmapBuffer1.h + 1, _bitmapBuffer1.w + 1, 0, 0, _bitmapBuffer1.h + 1, _bitmapBuffer1.w + 1, 0, 0); memcpy(_bitmapBuffer1.bits, _bitmapBuffer3.bits, kGameScreenWidth * kGameScreenHeight); if (_lifeBarDisplayed) { copyBufferToBuffer(386, _bitmapBuffer1.h + 1 - 19 - getBitmapHeight(_lifeBarImage), getBitmapWidth(_lifeBarImage), getBitmapHeight(_lifeBarImage), &_bitmapBuffer3, &_bitmapBuffer1 ); copyBufferToBuffer(150, _bitmapBuffer1.h + 1 - 19 - getBitmapHeight(_lifeBarImage), getBitmapWidth(_lifeBarImage), getBitmapHeight(_lifeBarImage), &_bitmapBuffer3, &_bitmapBuffer1 ); } _previousBagAction = _currentBagAction; }
// Find median point of objects. void Octree::findMedian() { register OctObject *o, *o2; std::list<OctObject *>::iterator itr; float d, m; if (load == 0) { median.x = (bounds.xmax - bounds.xmin) / 2.0f; median.y = (bounds.ymax - bounds.ymin) / 2.0f; median.z = (bounds.zmax - bounds.zmin) / 2.0f; return; } // Get X median. sortObjects(XSORT); d = 0.0f; m = ((float)load - 1.0f) / 2.0f; for (itr = objects.begin(), o2 = NULL; itr != objects.end(); itr++, o2 = o) { o = *itr; if (d >= m) { break; } d += 1.0f; } if (d > m) { median.x = (o2->position.x + o->position.x) / 2.0f; } else { median.x = o->position.x; } // Get Y median. sortObjects(YSORT); d = 0.0f; for (itr = objects.begin(), o2 = NULL; itr != objects.end(); itr++, o2 = o) { o = *itr; if (d >= m) { break; } d += 1.0f; } if (d > m) { median.y = (o2->position.y + o->position.y) / 2.0f; } else { median.y = o->position.y; } // Get Z median. sortObjects(ZSORT); d = 0.0f; for (itr = objects.begin(), o2 = NULL; itr != objects.end(); itr++, o2 = o) { o = *itr; if (d >= m) { break; } d += 1.0f; } if (d > m) { median.z = (o2->position.z + o->position.z) / 2.0f; } else { median.z = o->position.z; } }