historical/toontown-classic.git/panda/include/meshDrawer2D.I
2024-01-16 11:20:27 -06:00

183 lines
3.9 KiB
Text

/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file meshDrawer2D.I
* @author treeform
* @date 2008-12-19
*/
#include "lpoint2.h"
/**
* Creates the MeshDrawer2D low level system.
*/
INLINE MeshDrawer2D::
MeshDrawer2D() {
_root = NodePath("MeshDrawer");
_bv = nullptr;
_vertex = nullptr;
_uv = nullptr;
_color = nullptr;
_budget = 5000;
_clip_x = -1000000;
_clip_y = -1000000;
_clip_w = 1000000;
_clip_h = 1000000;
}
/**
* Destroys the MeshDrawer2D low level system.
*/
INLINE MeshDrawer2D::
~MeshDrawer2D() {
_root.remove_node();
if (_vertex != nullptr) delete _vertex;
if (_uv != nullptr) delete _uv;
if (_color != nullptr) delete _color;
}
/**
* Returns the root NodePath.
*/
INLINE NodePath MeshDrawer2D::
get_root() {
return _root;
}
/**
* Sets the total triangle budget of the drawer.
*/
INLINE void MeshDrawer2D::
set_budget(int total_budget) {
_budget = total_budget;
generator(_budget);
}
/**
* Gets the total triangle budget of the drawer
*/
INLINE int MeshDrawer2D::
get_budget() {
return _budget;
}
/**
* Sets clipping rectangle
*/
INLINE void MeshDrawer2D::
set_clip(PN_stdfloat x, PN_stdfloat y, PN_stdfloat w, PN_stdfloat h) {
_clip_x = x;
_clip_y = y;
_clip_w = w;
_clip_h = h;
}
/**
* Draws a 2d rectangle. Ignores the cliping rectangle
*/
INLINE void MeshDrawer2D::
quad_raw(const LVector3 &v1, const LVector4 &c1, const LVector2 &uv1,
const LVector3 &v2, const LVector4 &c2, const LVector2 &uv2,
const LVector3 &v3, const LVector4 &c3, const LVector2 &uv3,
const LVector3 &v4, const LVector4 &c4, const LVector2 &uv4
) {
if( _clear_index > _end_clear_index) return;
_vertex->add_data3(v1);
_color->add_data4(c1);
_uv->add_data2(uv1);
_vertex->add_data3(v2);
_color->add_data4(c2);
_uv->add_data2(uv2);
_vertex->add_data3(v3);
_color->add_data4(c3);
_uv->add_data2(uv3);
_vertex->add_data3(v4);
_color->add_data4(c4);
_uv->add_data2(uv4);
_clear_index += 1;
}
INLINE void MeshDrawer2D::
rectangle_raw(PN_stdfloat x, PN_stdfloat y, PN_stdfloat w, PN_stdfloat h,
PN_stdfloat u, PN_stdfloat v, PN_stdfloat us, PN_stdfloat vs,
const LVector4 &color
) {
quad_raw(
LVector3(x, 0, y), color, LVector2(u , v),
LVector3(x, 0, y+h), color, LVector2(u , v+vs),
LVector3(x+w, 0, y), color, LVector2(u+us, v),
LVector3(x+w, 0, y+h), color, LVector2(u+us, v+vs)
);
}
/**
* Draws a 2d rectangle, that can be cliped
*/
INLINE void MeshDrawer2D::
rectangle(PN_stdfloat x, PN_stdfloat y, PN_stdfloat w, PN_stdfloat h,
PN_stdfloat u, PN_stdfloat v, PN_stdfloat us, PN_stdfloat vs,
const LVector4 &color
) {
if( w == 0 && h == 0 ) return; // no size return
if (x > _clip_x+_clip_w) return; // we are left of the clip
if (y > _clip_y+_clip_h) return; // we are above of the clip
if (x+w < _clip_x) return; // we are right of the clip
if (y+h < _clip_y) return; // we are bellow clip
// the rectange fits but it might need to be cliped
PN_stdfloat x_uv_ratio = us/w;
PN_stdfloat y_uv_ratio = vs/h;
PN_stdfloat dt = 0;
if (x < _clip_x){
// clip right
dt = _clip_x-x;
x += dt;
w -= dt;
u += dt*x_uv_ratio;
us -= dt*x_uv_ratio;
}
if (y < _clip_y){
// clip bottom
dt = _clip_y-y;
y += dt;
h -= dt;
v += dt*y_uv_ratio;
vs -= dt*y_uv_ratio;
}
if (x+w > _clip_x+_clip_w){
// clip left
dt = x+w - (_clip_x+_clip_w);
w -= dt;
us -= dt*x_uv_ratio;
}
if (y+h > _clip_y+_clip_h){
// clip top
dt = y+h - (_clip_y+_clip_h);
h -= dt;
vs -= dt*y_uv_ratio;
}
// we made it lets draw the quad
rectangle_raw(x,y,w,h,u,v,us,vs,color);
}