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
|
/* 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.
*/
/* MeshFragSceneNode:
* Encapsulates information for rendering a mesh fragment
* (a collection of faces with the same material properties).
* Does not support level of detail.
*/
#pragma once
// Inherits from
#include "WallSceneNode.h"
// Global headers
#include "BzMaterial.h"
//
// NOTES:
//
// - Make sure that "noPlane" is set to true, for Mesh Fragments can not be
// used as occluders, and can not be culled as a simple plane
//
// - The lists are all GL_TRIANGLE lists
//
class MeshFace;
class MeshFragSceneNode : public WallSceneNode
{
public:
MeshFragSceneNode(int faceCount, const MeshFace** faces);
~MeshFragSceneNode();
// virtual functions from SceneNode
const GLfloat* getPlane() const override;
bool cull(const ViewFrustum&) const override;
void addShadowNodes(SceneRenderer&) override;
void addRenderNodes(SceneRenderer&) override;
void renderRadar() override;
// virtual functions from WallSceneNode
bool inAxisBox(const Extents& exts) const override;
void getRenderNodes(std::vector<RenderSet>& rnodes) override;
protected:
class Geometry : public RenderNode
{
public:
Geometry(MeshFragSceneNode &node);
~Geometry();
void init();
void setStyle(int style);
void render() override;
void renderShadow() override;
const GLfloat* getPosition() const override;
private:
void drawV() const; // draw with just vertices
void drawVT() const; // draw with texcoords
void drawVN() const; // draw with normals
void drawVTN() const; // draw with texcoords and normals
void initDisplayList();
void freeDisplayList();
static void initContext(void *data);
static void freeContext(void *data);
private:
int style;
GLuint list;
MeshFragSceneNode &sceneNode;
};
private:
Geometry renderNode;
GLint faceCount;
const MeshFace** faces;
bool noRadar;
bool noShadow;
GLint arrayCount;
GLfloat* vertices;
GLfloat* normals;
GLfloat* texcoords;
friend class MeshFragSceneNode::Geometry;
};
// Local Variables: ***
// mode: C++ ***
// tab-width: 4 ***
// c-basic-offset: 4 ***
// indent-tabs-mode: nil ***
// End: ***
// ex: shiftwidth=4 tabstop=4
|