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

102 lines
1.9 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 "binaryangle.h"
#include "intvec.h"
2021-03-15 18:05:08 +00:00
class ClipNode
{
friend class Clipper;
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;
binangle visibleStart, visibleEnd;
2021-03-15 18:05:08 +00:00
public:
bool IsRangeVisible(int startangle, int endangle);
void AddClipRange(int startangle, int endangle);
2021-12-19 17:53:53 +00:00
void AddWindowRange(int startangle, int endangle, float topclip, float bottomclip);
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(binangle 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;
}
2021-12-19 17:53:53 +00:00
void RemoveRange(ClipNode* cn);
void InsertRange(ClipNode* prev, ClipNode* node);
public:
2021-03-15 18:05:08 +00:00
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 = bamang(a1 - a2);
visibleEnd = bamang(a1 + a2);
2021-03-15 18:05:08 +00:00
}
else visibleStart = visibleEnd = bamang(0);
2021-03-15 18:05:08 +00:00
}
void RestrictVisibleRange(binangle a1, binangle 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.asbam() - visibleStart.asbam() < visibleEnd.asbam() - visibleStart.asbam()) visibleStart = a1;
if (a2.asbam() - visibleStart.asbam() < visibleEnd.asbam() - visibleStart.asbam()) 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