i still have problems displaying billboards. i still do not understand how to use the mode when displaying images. ill try to explain what is happening.
i changed the example code "06 - Pathfind.cpp".
Code:
/******************************************************************************/
#include "stdafx.h"
#include "../../../../../data/enum/_enums.h"
/******************************************************************************/
Image* testImg;
struct StaticObj : Game::Static
{
virtual void create(Game::ObjParams &obj)
{
Game::Static::create(obj);
}
virtual UInt drawPrepare()
{
//first way
/*
UInt modes = IndexToFlag(RM_SOLID);
Game::Static::drawPrepare();
return modes;
*/
//second way
UInt modes = 0;
Game::Static::drawPrepare();
return modes;
}
virtual void drawSolid()
{
drawTest();
}
virtual void drawTest()
{
if(Frustum(mesh->box, matrixScaled()))
{
testImg->draw3D(Color(255, 255, 255, 255), 1.0, 0, pos() + Vec(0,1.0,0));
}
}
};
Game::ObjMemx<Game::Chr > Chrs ;
Game::ObjMemx<StaticObj> Statics;
Decal decal; // decal pointing character destination target
/******************************************************************************/
void InitPre()
{
App.name("Pathfind");
App.flag=APP_ALLOW_SINGLE_PASS|APP_FULL_TOGGLE;
IOPath("../data");
Paks.add("engine.pak");
D.full(false).sync(true).hpRt(true);
ViewportFull.range=50;
Cam.dist = 10;
Cam.yaw =-PI_4;
Cam.pitch=-PI_3;
}
/******************************************************************************/
Bool Init()
{
Physics.create();
Sky .atmospheric();
Sun.image=Images("gfx/sky/sun.gfx"); Sun.light_color=1-D.ambColor();
testImg = Images("gfx/test.gfx");
decal.terrain_only=true;
decal.color.set(1,1,0,1);
decal.material(Materials("Decal/star.mtrl"));
Game::World.init ( )
.setObjType(Chrs ,OBJ_PLAYER)
.setObjType(Statics,OBJ_STATIC)
.New ("world/path.world")
.update (Cam.at );
return true;
}
/******************************************************************************/
void Shut()
{
}
/******************************************************************************/
Bool Update()
{
if(Kb.bp(KB_ESC))return false;
Game::World.update(Cam.at);
// move player
if(Ms.bp(0) && Chrs.elms()) // on LMB pressed
{
// convert screen mouse position to world position and direction
Vec pos,dir ; ScreenToPosDir(Ms.pos,pos,dir);
PhysHit phys_hit;
if(Physics.ray(pos,dir*ViewportActive.range,&phys_hit)) // if ray-test hit something
{
Chrs[0].actionMoveTo(phys_hit.plane.pos); // order character to move to that location
decal.matrix.setPosDir(phys_hit.plane.pos,Vec(0,1,0));
}
}
// rotate camera
if(Ms.b(1))
{
Cam.yaw -=Ms.dir_d.x;
Cam.pitch+=Ms.dir_d.y;
}
if(Chrs.elms())Cam.setSpherical(Chrs[0].pos(),Cam.yaw,Cam.pitch,0,Cam.dist*ScaleFactor(Ms.wheel()*-0.2)).
updateVelocities().set();
// rotate decal around its z axis
decal.matrix.orn.rotateZVec(Time.d());
return true;
}
/******************************************************************************/
void Render()
{
Game::World.draw();
switch(Renderer())
{
case RM_BLEND:
{
if(Chrs.elms())
if(Chrs[0].action==Game::ACTION_MOVE_TO)decal.drawStatic();
}break;
}
}
void Draw()
{
Renderer(Render);
//Where to call a method Image3D????????
FREP(Statics.elms())
{
StaticObj& obj = Statics[i];
obj.drawTest();
}
// show blocked places
if(Kb.b(KB_SPACE)) // if space pressed
if(Chrs.elms()) // if at least one character is available
{
Vec pos =Chrs[0].pos(); // get character position
VecI2 area_pos=Game::World.worldToAreaPos(pos); // convert from world position to area coordinates
if(Game::AreaPath *path=Game::World.pathGet(area_pos)) // if found paths at given coordinates
{
D.clearZ (); // clear Z Buffer
SetMatrix(); // reset drawing matrix
Vec world_pos=Game::World.areaToWorldPos(area_pos).x0y(); // convert 2D Area Coordinates to 3D World Position
Flt cell_size=(1.0f/Game::World.pathRes())*Game::World.areaSize(); // get size of a single path cell
VI.color(ColorAlpha(RED,0.5f)); // set drawing color to transparent RED
REPD(y,Game::World.pathRes())
REPD(x,Game::World.pathRes())if(!path->walkable(x,y)) // if current cell isn't walkable
{
Vec pos=world_pos+Vec(x,0,y)*cell_size; // get world position of a single path cell
VI.quad(pos+Vec( 0,0,cell_size), // draw a quad which extends 'pos' to right and forward by 'cell_size'
pos+Vec(cell_size,0,cell_size),
pos+Vec(cell_size,0, 0),
pos+Vec( 0,0, 0));
}
VI.end();
}
}
// informations
D.text(0,0.9,"Press LMB to move player, RMB to rotate camera");
D.text(0,0.8,"Press Space to show blocked places at character position");
}
/******************************************************************************/
and i changed the Access (in Default) for all rock objects in the path.world.
Billboards are not displayed correctly when the player moves. see screenshots.
in my game they were not displayed correctly when i start to use mesh-> drawBlend () for some objects.