From: <axl...@us...> - 2009-06-04 01:22:34
|
Revision: 305 http://hgengine.svn.sourceforge.net/hgengine/?rev=305&view=rev Author: axlecrusher Date: 2009-06-04 00:34:24 +0000 (Thu, 04 Jun 2009) Log Message: ----------- billboarding works Modified Paths: -------------- Mercury2/modules/BillboardNode.cpp Mercury2/modules/BillboardNode.h Mercury2/scenegraph.xml Modified: Mercury2/modules/BillboardNode.cpp =================================================================== --- Mercury2/modules/BillboardNode.cpp 2009-06-04 00:29:27 UTC (rev 304) +++ Mercury2/modules/BillboardNode.cpp 2009-06-04 00:34:24 UTC (rev 305) @@ -6,8 +6,6 @@ MercuryMatrix BillboardNode::ManipulateMatrix(const MercuryMatrix& matrix) { - MercuryMatrix m = RenderableNode::ManipulateMatrix( matrix ); - //Compute the object's center point (position?) in world space MercuryVertex center(0,0,0,1); center = matrix * center; @@ -18,29 +16,22 @@ //vector from object to eye projected on XZ objToEyeProj[1] = 0; objToEyeProj.NormalizeSelf(); -// MercuryVector objLookAt(0,0,1); //origional look vector of object -// objLookAt = matrix * objLookAt; //convert to world space -// objLookAt.NormalizeSelf(); + MercuryVector objLookAt(0,0,-1); //origional look vector of object -// objLookAt.Print(); - -// MercuryVector up = (objLookAt.CrossProduct( objToEyeProj )).Normalize(); -// up = objLookAt; -// up.Print(); - - MercuryVector up(0,0,1); //we wan't the camera's up - - float angleCos = LOOKAT.DotProduct(objToEyeProj); + MercuryVector up = objLookAt.CrossProduct(objToEyeProj); + float angleCos = objLookAt.DotProduct(objToEyeProj); - if ((angleCos < 0.99990) && (angleCos > -0.9999)) - { - float f = ACOS(angleCos)*RADDEG; - MercuryMatrix mtmp; - mtmp.RotateAngAxis(f, up[0], up[1], up[2]); - m = m * mtmp; - } + float f = ACOS(angleCos);//*RADDEG; + if (up[1] < 0) f *= -1; - //spherical below + //needs to be the local axis to rotate around + MercuryMatrix global(matrix); + MQuaternion mtmp = MQuaternion::CreateFromAxisAngle(MercuryVector(0,0,1), f); + global.Rotate( mtmp ); + + MercuryMatrix m = RenderableNode::ManipulateMatrix( global ); + +/* //spherical below objToEye.NormalizeSelf(); angleCos = objToEyeProj.DotProduct( objToEye ); if ((angleCos < 0.99990) && (angleCos > -0.9999)) @@ -53,15 +44,23 @@ else mtmp.RotateAngAxis(f, -1, 0, 0); // m.Print(); - m = m * mtmp; +// m = m * mtmp; // m.Print(); printf("********************\n"); // mtmp.Print(); } - +*/ return m; } +void BillboardNode::LoadFromXML(const XMLNode& node) +{ + RenderableNode::LoadFromXML(node); + + if ( !node.Attribute("billboardaxis").empty() ) + m_billboardAxis = MercuryVector::CreateFromString( node.Attribute("billboardaxis") ); +} + /**************************************************************************** * Copyright (C) 2009 by Joshua Allen * * * Modified: Mercury2/modules/BillboardNode.h =================================================================== --- Mercury2/modules/BillboardNode.h 2009-06-04 00:29:27 UTC (rev 304) +++ Mercury2/modules/BillboardNode.h 2009-06-04 00:34:24 UTC (rev 305) @@ -2,13 +2,16 @@ #define BILLBOARDNODE_H #include <RenderableNode.h> +#include <MercuryVertex.h> class BillboardNode : public RenderableNode { public: virtual MercuryMatrix ManipulateMatrix(const MercuryMatrix& matrix); + virtual void LoadFromXML(const XMLNode& node); private: + MercuryVector m_billboardAxis; }; #endif Modified: Mercury2/scenegraph.xml =================================================================== --- Mercury2/scenegraph.xml 2009-06-04 00:29:27 UTC (rev 304) +++ Mercury2/scenegraph.xml 2009-06-04 00:34:24 UTC (rev 305) @@ -16,7 +16,7 @@ <asset type="texture" file="lamp.png"/> <node type="transformnode" movz="-5" movx="0" movy="0" name="lamprow" > <node type="transformnode" rotx="-90" name="lamp"> - <node type="renderablenode" > + <node type="billboardnode" billboardaxis="0,0,1" > <asset type="hgmdlmodel" file="lamp.hgmdl" /> </node> </node> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |