An Axes Scene Node

Post those lines of code you feel like sharing or find what you require for your project here; or simply use them as tutorials.
Post Reply
smartwhiz
Posts: 120
Joined: Wed Jan 14, 2004 6:03 pm
Location: India

An Axes Scene Node

Post by smartwhiz »

Just a simple Axes Scene Node with X axis in RED , Y axis in GREEN and Z axis in BLUE.... hope it would be useful for someone...

Code: Select all

class AxesSceneNode : public scene::ISceneNode
{
	scene::SMeshBuffer ZMeshBuffer;
	scene::SMeshBuffer YMeshBuffer;
	scene::SMeshBuffer XMeshBuffer;
	
	video::SColor ZColor;
	video::SColor YColor;
	video::SColor XColor;

public:
	AxesSceneNode(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id): ISceneNode(parent, mgr, id)
	{
		#ifdef _DEBUG
		setDebugName("AxesSceneNode");
		#endif

		u16 u[36] = { 0,2,1,   0,3,2,   1,5,4,   1,2,5,   4,6,7,   4,5,6,	7,3,0,   7,6,3,   3,5,2,   3,6,5,   0,1,4,   0,4,7,};
		ZMeshBuffer.Indices.set_used(36);
		YMeshBuffer.Indices.set_used(36);
		XMeshBuffer.Indices.set_used(36);
		// Color Settings
		ZColor = video::SColor(255,0,0,255);
		YColor = video::SColor(255,0,255,0);
		XColor = video::SColor(255,255,0,0);
		for (s32 i=0; i<36; ++i)
		{
			ZMeshBuffer.Indices[i] = u[i];
			YMeshBuffer.Indices[i] = u[i];
			XMeshBuffer.Indices[i] = u[i];
		}
		// Default Position, Rotation and Scale
		this->setPosition(core::vector3df(0,0,0));
		this->setRotation(core::vector3df(0,0,0));
		this->setScale(core::vector3df(1,1,1));
		// Axes Box Coordinates Settings
		setAxesCoordinates();
	}

	virtual ~AxesSceneNode(){}

	virtual void OnRegisterSceneNode()
	{
		if (IsVisible)
		{
			SceneManager->registerNodeForRendering(this);
			ISceneNode::OnRegisterSceneNode();
		}
	}

	virtual void render()
	{
		video::IVideoDriver* driver = SceneManager->getVideoDriver();
		driver->setMaterial(ZMeshBuffer.Material);
		driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
		driver->drawMeshBuffer(&ZMeshBuffer);

		driver->setMaterial(YMeshBuffer.Material);
		driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
		driver->drawMeshBuffer(&YMeshBuffer);

		driver->setMaterial(XMeshBuffer.Material);
		driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
		driver->drawMeshBuffer(&XMeshBuffer);
	}

	void setAxesCoordinates()
	{
		ZMeshBuffer.Vertices.set_used(8);
		ZMeshBuffer.Material.Wireframe = false;
        ZMeshBuffer.Material.Lighting = false;
		ZMeshBuffer.Vertices[0]  = video::S3DVertex(-0.25,-0.25,0, -1,-1,-1, ZColor, 0, 1); 
		ZMeshBuffer.Vertices[1]  = video::S3DVertex(0.25,-0.25,0,  1,-1,-1, ZColor, 1, 1); 
		ZMeshBuffer.Vertices[2]  = video::S3DVertex(0.25,0.25,0,  1, 1,-1, ZColor, 1, 0); 
		ZMeshBuffer.Vertices[3]  = video::S3DVertex(-0.25,0.25,0, -1, 1,-1, ZColor, 0, 0); 
		ZMeshBuffer.Vertices[4]  = video::S3DVertex(0.25,-0.25,25,  1,-1, 1, ZColor, 0, 1); 
		ZMeshBuffer.Vertices[5]  = video::S3DVertex(0.25,0.25,25,  1, 1, 1, ZColor, 0, 0); 
		ZMeshBuffer.Vertices[6]  = video::S3DVertex(-0.25,0.25,25, -1, 1, 1, ZColor, 1, 0); 
		ZMeshBuffer.Vertices[7]  = video::S3DVertex(-0.25,-0.25,25, -1,-1, 1, ZColor, 1, 1); 
		ZMeshBuffer.BoundingBox.reset(0,0,0); 

		YMeshBuffer.Vertices.set_used(8);
		YMeshBuffer.Material.Wireframe = false;
        YMeshBuffer.Material.Lighting = false;
		YMeshBuffer.Vertices[0]  = video::S3DVertex(-0.25,0,0.25, -1,-1,-1, YColor, 0, 1); 
		YMeshBuffer.Vertices[1]  = video::S3DVertex(0.25,0,0.25,  1,-1,-1, YColor, 1, 1); 
		YMeshBuffer.Vertices[2]  = video::S3DVertex(0.25,0,-0.25,  1, 1,-1, YColor, 1, 0); 
		YMeshBuffer.Vertices[3]  = video::S3DVertex(-0.25,0,-0.25, -1, 1,-1, YColor, 0, 0); 
		YMeshBuffer.Vertices[4]  = video::S3DVertex(0.25,25,0.25,  1,-1, 1, YColor, 0, 1); 
		YMeshBuffer.Vertices[5]  = video::S3DVertex(0.25,25,-0.25,  1, 1, 1, YColor, 0, 0); 
		YMeshBuffer.Vertices[6]  = video::S3DVertex(-0.25,25,-0.25, -1, 1, 1, YColor, 1, 0); 
		YMeshBuffer.Vertices[7]  = video::S3DVertex(-0.25,25,0.25, -1,-1, 1, YColor, 1, 1); 
		YMeshBuffer.BoundingBox.reset(0,0,0); 

		XMeshBuffer.Vertices.set_used(8);
		XMeshBuffer.Material.Wireframe = false;
        XMeshBuffer.Material.Lighting = false;
		XMeshBuffer.Vertices[0]  = video::S3DVertex(0,-0.25,0.25, -1,-1,-1, XColor, 0, 1); 
		XMeshBuffer.Vertices[1]  = video::S3DVertex(0,-0.25,-0.25,  1,-1,-1, XColor, 1, 1); 
		XMeshBuffer.Vertices[2]  = video::S3DVertex(0,0.25,-0.25,  1, 1,-1, XColor, 1, 0); 
		XMeshBuffer.Vertices[3]  = video::S3DVertex(0,0.25,0.25, -1, 1,-1, XColor, 0, 0); 
		XMeshBuffer.Vertices[4]  = video::S3DVertex(25,-0.25,-0.25,  1,-1, 1, XColor, 0, 1); 
		XMeshBuffer.Vertices[5]  = video::S3DVertex(25,0.25,-0.25,  1, 1, 1, XColor, 0, 0); 
		XMeshBuffer.Vertices[6]  = video::S3DVertex(25,0.25,0.25, -1, 1, 1, XColor, 1, 0); 
		XMeshBuffer.Vertices[7]  = video::S3DVertex(25,-0.25,0.25, -1,-1, 1, XColor, 1, 1); 
		XMeshBuffer.BoundingBox.reset(0,0,0);
	}

	virtual const core::aabbox3d<f32>& getBoundingBox() const{return ZMeshBuffer.BoundingBox;}

	void setAxesScale(f32 scale)
	{
		ZMeshBuffer.Vertices.set_used(8);
		ZMeshBuffer.Material.Wireframe = false;
        ZMeshBuffer.Material.Lighting = false;
		ZMeshBuffer.Vertices[0]  = video::S3DVertex(-0.25,-0.25,0, -1,-1,-1, ZColor, 0, 1); 
		ZMeshBuffer.Vertices[1]  = video::S3DVertex(0.25,-0.25,0,  1,-1,-1, ZColor, 1, 1); 
		ZMeshBuffer.Vertices[2]  = video::S3DVertex(0.25,0.25,0,  1, 1,-1, ZColor, 1, 0); 
		ZMeshBuffer.Vertices[3]  = video::S3DVertex(-0.25,0.25,0, -1, 1,-1, ZColor, 0, 0); 
		ZMeshBuffer.Vertices[4]  = video::S3DVertex(0.25,-0.25,scale,  1,-1, 1, ZColor, 0, 1); 
		ZMeshBuffer.Vertices[5]  = video::S3DVertex(0.25,0.25,scale,  1, 1, 1, ZColor, 0, 0); 
		ZMeshBuffer.Vertices[6]  = video::S3DVertex(-0.25,0.25,scale, -1, 1, 1, ZColor, 1, 0); 
		ZMeshBuffer.Vertices[7]  = video::S3DVertex(-0.25,-0.25,scale, -1,-1, 1, ZColor, 1, 1); 
		ZMeshBuffer.BoundingBox.reset(0,0,0); 

		YMeshBuffer.Vertices.set_used(8);
		YMeshBuffer.Material.Wireframe = false;
        YMeshBuffer.Material.Lighting = false;
		YMeshBuffer.Vertices[0]  = video::S3DVertex(-0.25,0,0.25, -1,-1,-1, YColor, 0, 1); 
		YMeshBuffer.Vertices[1]  = video::S3DVertex(0.25,0,0.25,  1,-1,-1, YColor, 1, 1); 
		YMeshBuffer.Vertices[2]  = video::S3DVertex(0.25,0,-0.25,  1, 1,-1, YColor, 1, 0); 
		YMeshBuffer.Vertices[3]  = video::S3DVertex(-0.25,0,-0.25, -1, 1,-1, YColor, 0, 0); 
		YMeshBuffer.Vertices[4]  = video::S3DVertex(0.25,scale,0.25,  1,-1, 1, YColor, 0, 1); 
		YMeshBuffer.Vertices[5]  = video::S3DVertex(0.25,scale,-0.25,  1, 1, 1, YColor, 0, 0); 
		YMeshBuffer.Vertices[6]  = video::S3DVertex(-0.25,scale,-0.25, -1, 1, 1, YColor, 1, 0); 
		YMeshBuffer.Vertices[7]  = video::S3DVertex(-0.25,scale,0.25, -1,-1, 1, YColor, 1, 1); 
		YMeshBuffer.BoundingBox.reset(0,0,0); 

		XMeshBuffer.Vertices.set_used(8);
		XMeshBuffer.Material.Wireframe = false;
        XMeshBuffer.Material.Lighting = false;
		XMeshBuffer.Vertices[0]  = video::S3DVertex(0,-0.25,0.25, -1,-1,-1, XColor, 0, 1); 
		XMeshBuffer.Vertices[1]  = video::S3DVertex(0,-0.25,-0.25,  1,-1,-1, XColor, 1, 1); 
		XMeshBuffer.Vertices[2]  = video::S3DVertex(0,0.25,-0.25,  1, 1,-1, XColor, 1, 0); 
		XMeshBuffer.Vertices[3]  = video::S3DVertex(0,0.25,0.25, -1, 1,-1, XColor, 0, 0); 
		XMeshBuffer.Vertices[4]  = video::S3DVertex(scale,-0.25,-0.25,  1,-1, 1, XColor, 0, 1); 
		XMeshBuffer.Vertices[5]  = video::S3DVertex(scale,0.25,-0.25,  1, 1, 1, XColor, 0, 0); 
		XMeshBuffer.Vertices[6]  = video::S3DVertex(scale,0.25,0.25, -1, 1, 1, XColor, 1, 0); 
		XMeshBuffer.Vertices[7]  = video::S3DVertex(scale,-0.25,0.25, -1,-1, 1, XColor, 1, 1); 
		XMeshBuffer.BoundingBox.reset(0,0,0);
	}

};
the bounding box return function i am workin on getting the axes bounding box itself... for currently just the ZAxis mesh bounding box is thrown...

this is the code in the main loop..

Code: Select all

	AxesSceneNode* axis = new AxesSceneNode(parent,smgr,-1);
	axis->setAxesScale(50); //  for the length of the axes
	axis->drop();
comments pls..
Thanks and With Regards
Smartwhiz
vitek
Bug Slayer
Posts: 3919
Joined: Mon Jan 16, 2006 10:52 am
Location: Corvallis, OR

Post by vitek »

I wrote something similar a while back. You can find it here..

Travis
smartwhiz
Posts: 120
Joined: Wed Jan 14, 2004 6:03 pm
Location: India

Post by smartwhiz »

wow.. thats something i didn't see... kool man.. well i just wrote it down so if anyone's plannin an editor programmin can use it as if the bounding box for it is also coded in ... u wud be able to get collision to...
Thanks and With Regards
Smartwhiz
Post Reply