⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 portal.h

📁 3D游戏开发需要用到BSP树来经行场景渲染的管理。本代码包含完整的BSP及文件生成实现
💻 H
字号:
#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -