1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
/* bzflag
* Copyright (c) 1993-2025 Tim Riker
*
* This package is free software; you can redistribute it and/or
* modify it under the terms of the license found in the file
* named COPYING that should have accompanied this file.
*
* THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
/* MeshSceneNode:
* Encapsulates information for rendering a mesh fragment
* (a collection of faces with the same material properties).
* Does not support level of detail.
*/
#ifndef BZF_MESH_SCENE_NODE_H
#define BZF_MESH_SCENE_NODE_H
// Inherits
#include "SceneNode.h"
// Common headers
#include "bzfgl.h"
//
// NOTES:
//
// - Make sure that "noPlane" is set to true, for Mesh can not be
// used as occluders, and can not be culled as a simple plane
//
// - All accesses are done through indices
//
class MeshObstacle;
class MeshDrawInfo;
class MeshDrawMgr;
class BzMaterial;
class OpenGLGState;
class SceneRenderer;
class ViewFrustum;
class RenderNode;
class MeshSceneNode : public SceneNode
{
public:
MeshSceneNode(const MeshObstacle* mesh);
~MeshSceneNode();
// virtual functions from SceneNode
void notifyStyleChange();
bool cull(const ViewFrustum&) const;
bool inAxisBox(const Extents& exts) const;
void addShadowNodes(SceneRenderer&);
void addRenderNodes(SceneRenderer&);
void renderRadar();
void getRenderNodes(std::vector<RenderSet>& rnodes);
void makeXFormList();
static void initContext(void* data);
static void freeContext(void* data);
static void setLodScale(int pixelsX, float fovx,
int pixelsY, float fovy);
static void setRadarLodScale(float lengthPerPixel);
private:
const MeshObstacle* mesh;
MeshDrawMgr* drawMgr;
const MeshDrawInfo* drawInfo;
bool animRepos;
// transform display list
GLfloat xformMatrix[16];
struct MeshMaterial
{
const BzMaterial* bzmat;
OpenGLGState gstate;
GLfloat color[4];
const GLfloat* colorPtr;
bool drawRadar;
bool drawShadow;
bool needsSorting;
bool animRepos;
};
struct SetNode
{
int set;
MeshMaterial meshMat;
// basic render nodes
RenderNode* node;
RenderNode* radarNode;
};
struct LodNode
{
int count;
SetNode* sets;
};
// Level Of Detail (LOD) information
int lodCount;
LodNode* lods;
float* lodLengths;
// Radar LODs
int radarCount;
LodNode* radarLods;
float* radarLengths;
static float LodScale;
static float RadarLodScale;
private:
void updateMaterial(MeshMaterial* mat);
const BzMaterial* convertMaterial(const BzMaterial* bzmat);
int calcNormalLod(const ViewFrustum&);
int calcRadarLod();
friend class MeshSceneNodeMgr;
};
#endif // BZF_MESH_SCENE_NODE_H
// Local Variables: ***
// mode: C++ ***
// tab-width: 4 ***
// c-basic-offset: 4 ***
// indent-tabs-mode: nil ***
// End: ***
// ex: shiftwidth=4 tabstop=4
|