raze/source/core/rendering/scene/hw_clipper.h

104 lines
2 KiB
C
Raw Normal View History

2021-03-15 18:05:08 +00:00
#ifndef __GL_CLIPPER
#define __GL_CLIPPER
#include "xs_Float.h"
#include "memarena.h"
#include "basics.h"
#include "vectors.h"
#include "intvec.h"
2021-03-15 18:05:08 +00:00
class ClipNode
{
friend class Clipper;
2021-03-15 18:05:08 +00:00
ClipNode *prev, *next;
int start, end;
2021-12-19 17:53:53 +00:00
float topclip, bottomclip;
2021-03-15 18:05:08 +00:00
};
class Clipper
{
FMemArena nodearena;
ClipNode * freelist = nullptr;
ClipNode * cliphead = nullptr;
angle_t visibleStart, visibleEnd;
2021-03-15 18:05:08 +00:00
public:
bool IsRangeVisible(int startangle, int endangle);
void AddClipRange(int startangle, int endangle);
void AddWindowRange(int startangle, int endangle, float topclip, float bottomclip, float viewz);
void RemoveClipRange(int startangle, int endangle);
2021-03-15 18:05:08 +00:00
public:
2021-03-15 18:05:08 +00:00
void Clear(angle_t rangestart);
2021-03-15 18:05:08 +00:00
void Free(ClipNode *node)
{
node->next = freelist;
freelist = node;
}
private:
2021-03-15 18:05:08 +00:00
ClipNode * GetNew()
{
if (freelist)
{
ClipNode * p = freelist;
freelist = p->next;
return p;
}
else return (ClipNode*)nodearena.Alloc(sizeof(ClipNode));
}
2021-12-19 17:53:53 +00:00
ClipNode * NewRange(int start, int end, float top, float bottom)
2021-03-15 18:05:08 +00:00
{
ClipNode * c = GetNew();
c->start = start;
c->end = end;
2021-12-19 17:53:53 +00:00
c->topclip = top;
c->bottomclip = bottom;
2021-03-15 18:05:08 +00:00
c->next = c->prev = NULL;
return c;
}
void RemoveRange(ClipNode* cn, bool free = true);
bool InsertRange(ClipNode* prev, ClipNode* node);
bool InsertBlockingRange(ClipNode* prev, ClipNode* node, int start, int end);
void SplitRange(ClipNode* node, int start, int end, float topclip, float bottomclip);
void ValidateList();
2021-12-19 17:53:53 +00:00
public:
void SetVisibleRange(angle_t a1, angle_t a2)
2021-03-15 18:05:08 +00:00
{
if (a2 != 0xffffffff)
2021-03-15 18:05:08 +00:00
{
visibleStart = a1 - a2;
visibleEnd = a1 + a2;
2021-03-15 18:05:08 +00:00
}
else visibleStart = visibleEnd = 0;
2021-03-15 18:05:08 +00:00
}
void RestrictVisibleRange(angle_t a1, angle_t a2)
2021-03-15 18:05:08 +00:00
{
if (visibleStart == visibleEnd)
2021-03-15 18:05:08 +00:00
{
visibleStart = a1;
visibleEnd = a2;
2021-03-15 18:05:08 +00:00
}
else
{
if (a1 - visibleStart < visibleEnd - visibleStart) visibleStart = a1;
if (a2 - visibleStart < visibleEnd - visibleStart) visibleStart = a2;
2021-03-15 18:05:08 +00:00
}
}
2021-03-23 20:23:49 +00:00
void DumpClipper();
2021-03-15 18:05:08 +00:00
};
#endif