Ejemplo n.º 1
0
// static
void LLHUDObject::updateAll()
{
	LLFastTimer ftm(LLFastTimer::FTM_HUD_UPDATE);
	LLHUDText::updateAll();
	LLHUDIcon::updateAll();
	sortObjects();
}
Ejemplo n.º 2
0
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);
    }

}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
// 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;
   }
}