//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
-// Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
//
#ifndef _SHADOWVOLUME_HXX
#define _SHADOWVOLUME_HXX
+#include <simgear/compiler.h>
+#include <simgear/props/props.hxx>
-#include <plib/sg.h>
#include <vector>
#include <map>
-SG_USING_STD(vector);
-SG_USING_STD(map);
+using std::vector;
+using std::map;
class ssgBranch;
class ssgLeaf;
class SGShadowVolume {
public:
- SGShadowVolume();
+ SGShadowVolume( ssgBranch *root );
~SGShadowVolume();
typedef enum {
void setupShadows(double lon, double lat,
double gst, double SunRightAscension, double SunDeclination, double sunAngle );
void endOfFrame(void);
-
+ static int ACpostTravCB( ssgEntity *entity, int traversal_mask );
private:
bool isFacingLight;
} triData;
- ssgBranch *geometry_leaf;
- ssgBranch *scenery_object;
- ssgBranch *lib_object;
- ssgBranch *first_select;
+ ssgSharedPtr<ssgBranch> geometry_leaf;
+ ssgSharedPtr<ssgBranch> scenery_object;
+ ssgSharedPtr<ssgBranch> lib_object;
+ ssgSharedPtr<ssgBranch> first_select;
sgVec3 last_lightpos;
+ sgMat4 last_transform;
int frameNumber;
int *indices;
sgVec4 * vertices;
GLushort *silhouetteEdgeIndices;
int lastSilhouetteIndicesCount;
-
+ bool isTranslucent;
ShadowCaster( int _num_tri, ssgBranch * _geometry_leaf );
~ShadowCaster();
void SetConnectivity();
void CalculateSilhouetteEdges(sgVec3 lightPosition);
void DrawInfiniteShadowVolume(sgVec3 lightPosition, bool drawCaps);
- void computeShadows(sgMat4 rotation, sgMat4 rotation_translation);
+ void computeShadows(sgMat4 rotation, sgMat4 rotation_translation, OccluderType occluder_type);
void getNetTransform ( ssgBranch * branch, sgMat4 xform );
- bool isSelected ( ssgBranch * branch );
+ bool isSelected ( ssgBranch * branch, float dist);
bool sameVertex(int edge1, int edge2);
};
void computeShadows(void);
void traverseTree(ssgBranch *branch);
void find_trans(void);
- ssgBranch *scenery_object;
- ssgBranch *lib_object;
- ssgBranch *pending_object;
- ssgBranch *tile;
+ ssgSharedPtr<ssgBranch> scenery_object;
+ ssgSharedPtr<ssgBranch> lib_object;
+ ssgSharedPtr<ssgBranch> pending_object;
+ ssgSharedPtr<ssgBranch> tile;
ShadowCaster_list parts;
OccluderType occluder_type;
};
- typedef map<ssgBranch *, SceneryObject *> SceneryObject_map;
+ typedef map<ssgSharedPtr<ssgBranch>, SceneryObject *> SceneryObject_map;
private:
void update_light_view(void);
void computeShadows(void);
+ void cull ( ssgBranch *b, sgFrustum *f, sgMat4 m, int test_needed );
- bool init_done;
bool shadows_enabled;
bool shadowsAC_enabled, shadowsAI_enabled, shadowsTO_enabled, shadowsDebug_enabled;
+ bool shadowsAC_transp_enabled;
bool use_alpha;
bool canDoAlpha, canDoStencil;
- SGPropertyNode *sim_rendering;
+ SGPropertyNode_ptr sim_rendering;
sgVec3 sunPos;
int frameNumber;
int lastTraverseTreeFrame;
sgMat4 CameraViewM;
- sgMat4 invViewAngle;
double sun_angle;
SceneryObject_map sceneryObjects;
- /** this sphere contains the visible scene and is used to cull shadow casters */
- sgSphere frustumSphere;
- /** this sphere contains the near clip plane and is used to check the need of a zfail */
- sgSphere nearClipSphere;
-
+ ssgSharedPtr<ssgBranch> ssg_root;
+ bool shadows_rendered;
};
#endif // _SHADOWVOLUME_HXX