38 #include "Core-Level-JR.h"
56 _outline =
laOutline(M_TRUE, laColor(), 0.8);
57 _color = laColor(255,255,255);
62 laObject::~laObject(
void)
72 void laObject::respawn()
78 if( _ai.isActive() ) _ai.reset();
85 void laObject::create(laPoint3 pos)
89 _ptPivot.size = _pTSObject->getPoint(
"bounding-box");
100 ASSERT(_pTileset,
"Nil tileset");
102 laEnvironment_win32* pCE = ((laEnvironment_win32*)::laSystemIntegrator::getEnvironment());
107 _pTSObject = _pTileset->getElement(_nTSIndex);
111 fp->readUnsigned(&seg);
112 fp->readObj(&offset, M_FALSE);
115 _ptPivot.y( offset.y()*
M_UNIT );
120 _texShadow.load(
"particle_generic.png",
M_TEX_TMAP);
124 if( _pTSObject->getModelCnt() )
126 _ptPivot.size = _pTSObject->getPoint(
"bounding-box");
135 try{ _color = this->getObject()->getColor(
"color"); }
136 catch(laError_PropertyNotDefined&){
137 _color = laColor(255,255,255,255);
143 char* strAI = getObject()->getText(
"ai-type");
147 if(_pLevel->getObjCnt())
148 _ai.controllers(
this, (
aiController*)(_pLevel->getPlayer()), _pLevel->getGlobalPercepts() );
150 _ai.controllers(
this,
this, _pLevel->getGlobalPercepts() );
155 catch(laError_PropertyNotDefined& p){
156 _ai.activate(M_FALSE);
161 _ptPivot.projectShadow();
168 void laObject::_offset(
laRenderer *r, laPoint3 ptBasePos)
171 PROFILE_REN(laObject__offset);
179 double dTileOffset = _pLevel->terrainZOffset_atPixel(_ptPivot.x());
181 laPoint3 pos(0,0,dTileOffset);
182 pos += ptBasePos + _ptPivot;
186 r->transTranslate( pos + _ptPivot.ptGeometryOffset );
194 PROFILE_REN(laObject__rotation);
202 double dTileAngle = _pLevel->terrainAngle_atPixel(_ptPivot.x());
206 r->transRotate(dTileAngle + _ptPivot.angleY, laPoint3(0,1,0));
207 r->transRotate(_ptPivot.angleX, laPoint3(1,0,0));
208 r->transRotate(_ptPivot.angleZ, laPoint3(0,0,1));
213 void laObject::_offset_and_rotation(
laRenderer *r, laPoint3 ptBasePos) {
214 PROFILE_REN(laObject__offset_and_rotation);
215 _offset(r, ptBasePos);
220 PROFILE_REN(laObject__set_style);
228 void laObject::drawGeometry(
laRenderer *r, laPoint3 ptBasePos)
233 _offset(r, ptBasePos);
234 this->_draw_positioned(r);
237 this->_draw_positioned_rotated(r);
240 this->_draw_notrans(r, ptBasePos);
243 void laObject::_draw_positioned(
laRenderer *r) {
246 void laObject::_draw_positioned_rotated(
laRenderer *r) {
247 _pTSObject->drawGeometry( r );
250 void laObject::_draw_notrans(
laRenderer *r, laPoint3 ptBasePos) {
251 _nested_draw(r, ptBasePos);
257 void laObject::drawFx(
laRenderer *r, laPoint3 ptBasePos)
260 _offset(r, ptBasePos);
261 this->_drawFx_positioned(r);
268 this->_drawFx_notrans(r, ptBasePos);
271 void laObject::_drawFx_positioned(
laRenderer *r) {
272 _draw_shadow_fx( r );
273 _pTSObject->drawFx( r );
276 void laObject::_drawFx_positioned_rotated(
laRenderer *r) {
279 void laObject::_drawFx_notrans(
laRenderer *r, laPoint3 ptBasePos) {
280 _nested_draw_fx(r, ptBasePos);
285 void laObject::drawInterface(
laRenderer *r, laPoint3 ptBasePos) {
286 _nested_draw_interface(r, ptBasePos);
294 PROFILE_REN(laObject__draw_shadow_fx);
298 double w = M_MIN(
M_UNIT, _ptPivot.size.x() * 0.9);
299 laPoint3 pt1( -w/2.0, _ptPivot.dShadowY - _ptPivot.y(), -w/2.0 );
301 double distance = M_MIN(1,
M_ABS(_ptPivot.dShadowY - _ptPivot.y())/(
M_UNIT*6.0) );
302 unsigned alpha = (1-distance) * 220;
306 static laPoint3 p[3] = { laPoint3(w,0,0), laPoint3(w,0,w), laPoint3(0,0,w) };
307 static laPoint2 uv[4] = { laPoint3(0,0), laPoint3(0,1), laPoint3(1,1), laPoint3(1,0) };
311 *(pquad++) = pt1 + p[0];
312 *(pquad++) = pt1 + p[1];
313 *(pquad++) = pt1 + p[2];
315 r->styleSet(laColor(0,0,0,alpha));
325 fxMessages.draw(r, laPoint3(0, -1.1*_ptPivot.size.y(), 0) );
329 void laObject::_execute_ai(laTimer &t)
332 PROFILE_ANIM(laObject__execute_ai);
337 laLine2 ln(pPlayer->getPosition(), _ptPivot);
338 double dPlayer = ln.lenght();
340 _ai.perceive(P__PLAYER_DISTANCE, aiPerceptData(dPlayer));
351 void laObject::animate(laTimer &t)
354 PROFILE_ANIM(laObject_animate);
362 if(_ai.isActive()) this->_execute_ai(t);
373 void laObject::_nested_draw(
laRenderer *r, laPoint3 ptBasePos)
376 std::map<unsigned, laObject*>::iterator i;
378 for(i = _mNestedObjects.begin(); i != _mNestedObjects.end(); i++){
379 (*i).second->drawGeometry(r, ptBasePos);
385 void laObject::_nested_draw_fx(
laRenderer *r, laPoint3 ptBasePos)
388 std::map<unsigned, laObject*>::iterator i;
390 for(i = _mNestedObjects.begin(); i != _mNestedObjects.end(); i++){
391 (*i).second->drawFx(r, ptBasePos);
397 void laObject::_nested_draw_interface(
laRenderer *r, laPoint3 ptBasePos)
400 std::map<unsigned, laObject*>::iterator i;
402 for(i = _mNestedObjects.begin(); i != _mNestedObjects.end(); i++){
403 (*i).second->drawInterface(r, ptBasePos);
409 void laObject::_nested_animate(laTimer &t)
412 std::map<unsigned, laObject*>::iterator i;
414 for(i = _mNestedObjects.begin(); i != _mNestedObjects.end(); i++){
415 (*i).second->animate(t);
421 void laObject::_nested_destroy()
424 std::map<unsigned, laObject*>::iterator i;
426 for(i = _mNestedObjects.begin(); i != _mNestedObjects.end(); i++){
429 _mNestedObjects.clear();
#define M_UNIT
Unit of 1 meter.
Object outline properties.
#define M_ABS(a)
Return abs(a)
virtual void vquadsDraw(unsigned nQuads, laPoint2 *ar_uv=NULL, laColor *ar_color=NULL, M_BOOL bBillboards=M_FALSE, M_BOOL bUseColorArrays=M_FALSE)=0
Draw an array of VQ, starting with the psecified pointers (or the first VQ if null) ...
virtual void modeOutline(const laOutline &outline)
Set outline parameters.
Class aiController is an abstract class for behaviours which can be performed by objects.
Virtual interface for the Engine graphics renderer.
laPoint3 * vquadsData(unsigned nQuad, unsigned nCount=1)
Get a pointer to VQ vertex data.
#define M_TEX_TMAP
Transparent texture with an alpha channel.