File: MeshSceneNode.h

package info (click to toggle)
bzflag 2.4.30-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 26,488 kB
  • sloc: cpp: 150,376; ansic: 3,463; sh: 2,535; makefile: 2,194; perl: 486; python: 260; objc: 246; php: 206
file content (142 lines) | stat: -rw-r--r-- 3,183 bytes parent folder | download
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