portal.h

来自「3D游戏开发需要用到BSP树来经行场景渲染的管理。本代码包含完整的BSP及文件生」· C头文件 代码 · 共 83 行

H
83
字号
#pragma once

#include "bspconv.h"
#include "portaldata.h"

#define BINARY_PORTAL_FILE

struct sPortal {
	CWinding	winding;
	_CBSPNode*	nodes[2];
	int			plane;
};

class CPortalBuilder : public IBSPTreeVisitor {
public:
	// visitor interface
	void				VisitNodeBegin(_CBSPSplitNode *n);
	void				VisitNodeEnd(_CBSPSplitNode *n) {};
	void				VisitLeaf(_CBSPLeafNode *l) {};

	// public interface
	void				BuildPortals(_CBSPTree *tree);
	void				RebuildPortals();
	void				MarkNodeReachability();
	bool				IsMapClosed();
	void				CalcBounds();
	void				SaveToFile(char *filename);
	CVector<sPortal>*	GetPortals();
private:
	void				CreateNodePortal(_CBSPSplitNode *node);
	void				SplitNodePortals(_CBSPSplitNode *node);
	void				CreateHeadPortals();
	
	void				FloodReachability(_CBSPLeafNode *leaf);

	void				RemovePortalReference(_CBSPNode *n, int portal);

	CVector<sPortal>	portals;
	_CBSPLeafNode		outside;	// virtual leaf, outside map
	_CBSPTree			*tree;
	int					nLeafs;
};

inline void CPortalBuilder::RebuildPortals() {
	outside.portals.Clear();
	outside.flags = NODE_OPAQUE;
	portals.Clear();
	BuildPortals(tree);
}

inline void CPortalBuilder::VisitNodeBegin(_CBSPSplitNode *n) {
	CreateNodePortal(n);
	SplitNodePortals(n);
}

inline CVector<sPortal>* CPortalBuilder::GetPortals() {
	return &portals;
}

class CNodeBoundsCalc : public IBSPTreeVisitor {
public:
	// visitor interface
	void	VisitNodeBegin(_CBSPSplitNode *n) {};
	void	VisitNodeEnd(_CBSPSplitNode *n);
	void	VisitLeaf(_CBSPLeafNode *l);

	void	CalcBounds(_CBSPTree *tree, CVector<sPortal>* portals);
private:
	CVector<sPortal>*	portals;
};

inline void CNodeBoundsCalc::CalcBounds(_CBSPTree *tree, CVector<sPortal>* p) {
	portals = p;
	tree->Traverse(this);
}

inline void CPortalBuilder::CalcBounds() {
	CNodeBoundsCalc bc;
	bc.CalcBounds(tree, &portals);
}


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?