Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
29 changed files
with
1,720 additions
and
2,889 deletions.
There are no files selected for viewing
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,202 @@ | ||
// Copyright (C) 2002-2010 Nikolaus Gebhardt | ||
// This file is part of the "Irrlicht Engine". | ||
// For conditions of distribution and use, see copyright notice in irrlicht.h | ||
|
||
#include "MyBillboardSceneNode.h" | ||
#include "IVideoDriver.h" | ||
#include "ISceneManager.h" | ||
#include "ICameraSceneNode.h" | ||
|
||
namespace irr | ||
{ | ||
namespace scene | ||
{ | ||
|
||
//! constructor | ||
MyBillboardSceneNode::MyBillboardSceneNode(ISceneNode* parent, | ||
ISceneManager* mgr, s32 id, | ||
const core::vector3df& position, const core::dimension2d<f32>& size) | ||
: IBillboardSceneNode(parent, mgr, id, position) | ||
{ | ||
#ifdef _DEBUG | ||
setDebugName("MyBillboardSceneNode"); | ||
#endif | ||
|
||
setSize(size); | ||
|
||
indices[0] = 0; | ||
indices[1] = 2; | ||
indices[2] = 1; | ||
indices[3] = 0; | ||
indices[4] = 3; | ||
indices[5] = 2; | ||
|
||
video::SColor colorTop = video::SColor(0xFFFFFFFF); | ||
video::SColor colorBottom = video::SColor(0xFFFFFFFF); | ||
|
||
vertices[0].TCoords.set(1.0f, 1.0f); | ||
vertices[0].Color = colorBottom; | ||
|
||
vertices[1].TCoords.set(1.0f, 0.0f); | ||
vertices[1].Color = colorTop; | ||
|
||
vertices[2].TCoords.set(0.0f, 0.0f); | ||
vertices[2].Color = colorTop; | ||
|
||
vertices[3].TCoords.set(0.0f, 1.0f); | ||
vertices[3].Color = colorBottom; | ||
} | ||
|
||
|
||
//! pre render event | ||
void MyBillboardSceneNode::OnRegisterSceneNode() | ||
{ | ||
if (IsVisible) | ||
SceneManager->registerNodeForRendering(this); | ||
|
||
ISceneNode::OnRegisterSceneNode(); | ||
} | ||
|
||
|
||
//! render | ||
void MyBillboardSceneNode::render() | ||
{ | ||
video::IVideoDriver* driver = SceneManager->getVideoDriver(); | ||
ICameraSceneNode* camera = SceneManager->getActiveCamera(); | ||
|
||
if (!camera || !driver) | ||
return; | ||
|
||
// make billboard look to camera | ||
|
||
core::vector3df pos = getAbsolutePosition(); | ||
|
||
core::vector3df campos = camera->getAbsolutePosition(); | ||
core::vector3df target = camera->getTarget(); | ||
core::vector3df up = camera->getUpVector(); | ||
core::vector3df view = target - campos; | ||
view.normalize(); | ||
|
||
core::vector3df horizontal = up.crossProduct(view); | ||
if ( horizontal.getLength() == 0 ) | ||
{ | ||
horizontal.set(up.Y,up.X,up.Z); | ||
} | ||
horizontal.normalize(); | ||
horizontal *= 0.5f * Size.Width; | ||
|
||
core::vector3df vertical = horizontal.crossProduct(view); | ||
vertical.normalize(); | ||
vertical *= 0.5f * Size.Height; | ||
|
||
view *= -1.0f; | ||
|
||
for (s32 i=0; i<4; ++i) | ||
vertices[i].Normal = view; | ||
|
||
vertices[0].Pos = pos + horizontal + vertical; | ||
vertices[1].Pos = pos + horizontal - vertical; | ||
vertices[2].Pos = pos - horizontal - vertical; | ||
vertices[3].Pos = pos - horizontal + vertical; | ||
|
||
// draw | ||
|
||
if ( DebugDataVisible & scene::EDS_BBOX ) | ||
{ | ||
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation); | ||
video::SMaterial m; | ||
m.Lighting = false; | ||
driver->setMaterial(m); | ||
driver->draw3DBox(BBox, video::SColor(0,208,195,152)); | ||
} | ||
|
||
driver->setTransform(video::ETS_WORLD, core::IdentityMatrix); | ||
|
||
driver->setMaterial(Material); | ||
|
||
driver->drawIndexedTriangleList(vertices, 4, indices, 2); | ||
} | ||
|
||
|
||
//! returns the axis aligned bounding box of this node | ||
const core::aabbox3d<f32>& MyBillboardSceneNode::getBoundingBox() const | ||
{ | ||
return BBox; | ||
} | ||
|
||
|
||
//! sets the size of the billboard | ||
void MyBillboardSceneNode::setSize(const core::dimension2d<f32>& size) | ||
{ | ||
Size = size; | ||
|
||
if (Size.Width == 0.0f) | ||
Size.Width = 1.0f; | ||
|
||
if (Size.Height == 0.0f ) | ||
Size.Height = 1.0f; | ||
|
||
f32 avg = (size.Width + size.Height)/6; | ||
BBox.MinEdge.set(-avg,-avg,-avg); | ||
BBox.MaxEdge.set(avg,avg,avg); | ||
} | ||
|
||
|
||
video::SMaterial& MyBillboardSceneNode::getMaterial(u32 i) | ||
{ | ||
return Material; | ||
} | ||
|
||
|
||
//! returns amount of materials used by this scene node. | ||
u32 MyBillboardSceneNode::getMaterialCount() const | ||
{ | ||
return 1; | ||
} | ||
|
||
|
||
//! gets the size of the billboard | ||
const core::dimension2d<f32>& MyBillboardSceneNode::getSize() const | ||
{ | ||
return Size; | ||
} | ||
|
||
|
||
//! Set the color of all vertices of the billboard | ||
//! \param overallColor: the color to set | ||
void MyBillboardSceneNode::setColor(const video::SColor & overallColor) | ||
{ | ||
for(u32 vertex = 0; vertex < 4; ++vertex) | ||
vertices[vertex].Color = overallColor; | ||
} | ||
|
||
|
||
//! Set the color of the top and bottom vertices of the billboard | ||
//! \param topColor: the color to set the top vertices | ||
//! \param bottomColor: the color to set the bottom vertices | ||
void MyBillboardSceneNode::setColor(const video::SColor & topColor, const video::SColor & bottomColor) | ||
{ | ||
vertices[0].Color = bottomColor; | ||
vertices[1].Color = topColor; | ||
vertices[2].Color = topColor; | ||
vertices[3].Color = bottomColor; | ||
} | ||
|
||
|
||
//! Gets the color of the top and bottom vertices of the billboard | ||
//! \param[out] topColor: stores the color of the top vertices | ||
//! \param[out] bottomColor: stores the color of the bottom vertices | ||
void MyBillboardSceneNode::getColor(video::SColor & topColor, video::SColor & bottomColor) const | ||
{ | ||
bottomColor = vertices[0].Color; | ||
topColor = vertices[1].Color; | ||
} | ||
|
||
void MyBillboardSceneNode::setTCoords(u32 i, core::vector2d<f32> c) | ||
{ | ||
vertices[i].TCoords = c; | ||
} | ||
|
||
} // end namespace scene | ||
} // end namespace irr | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
// Copyright (C) 2002-2010 Nikolaus Gebhardt | ||
// This file is part of the "Irrlicht Engine". | ||
// For conditions of distribution and use, see copyright notice in irrlicht.h | ||
|
||
#ifndef __C_BILLBOARD_SCENE_NODE_H_INCLUDED__ | ||
#define __C_BILLBOARD_SCENE_NODE_H_INCLUDED__ | ||
|
||
#include "IBillboardSceneNode.h" | ||
#include "S3DVertex.h" | ||
|
||
namespace irr | ||
{ | ||
namespace scene | ||
{ | ||
|
||
//! Scene node which is a billboard. A billboard is like a 3d sprite: A 2d element, | ||
//! which always looks to the camera. | ||
class MyBillboardSceneNode : virtual public IBillboardSceneNode | ||
{ | ||
public: | ||
|
||
//! constructor | ||
MyBillboardSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id, | ||
const core::vector3df& position, const core::dimension2d<f32>& size); | ||
|
||
//! pre render event | ||
virtual void OnRegisterSceneNode(); | ||
|
||
//! render | ||
virtual void render(); | ||
|
||
//! returns the axis aligned bounding box of this node | ||
virtual const core::aabbox3d<f32>& getBoundingBox() const; | ||
|
||
//! sets the size of the billboard | ||
virtual void setSize(const core::dimension2d<f32>& size); | ||
|
||
//! gets the size of the billboard | ||
virtual const core::dimension2d<f32>& getSize() const; | ||
|
||
virtual video::SMaterial& getMaterial(u32 i); | ||
|
||
//! returns amount of materials used by this scene node. | ||
virtual u32 getMaterialCount() const; | ||
|
||
//! Set the color of all vertices of the billboard | ||
//! \param overallColor: the color to set | ||
virtual void setColor(const video::SColor & overallColor); | ||
|
||
//! Set the color of the top and bottom vertices of the billboard | ||
//! \param topColor: the color to set the top vertices | ||
//! \param bottomColor: the color to set the bottom vertices | ||
virtual void setColor(const video::SColor & topColor, const video::SColor & bottomColor); | ||
|
||
//! Gets the color of the top and bottom vertices of the billboard | ||
//! \param[out] topColor: stores the color of the top vertices | ||
//! \param[out] bottomColor: stores the color of the bottom vertices | ||
virtual void getColor(video::SColor& topColor, video::SColor& bottomColor) const; | ||
|
||
virtual void setTCoords(u32 i, core::vector2d<f32> c); | ||
|
||
private: | ||
|
||
core::dimension2d<f32> Size; | ||
core::aabbox3d<f32> BBox; | ||
video::SMaterial Material; | ||
|
||
video::S3DVertex vertices[4]; | ||
u16 indices[6]; | ||
}; | ||
|
||
|
||
} // end namespace scene | ||
} // end namespace irr | ||
|
||
#endif | ||
|
Oops, something went wrong.