|
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.
|