Files
geant4/source/analysis/g4tools/include/tools/glprims
T
2019-12-06 15:12:28 +01:00

452 lines
9.7 KiB
Plaintext

// Copyright (C) 2010, Guy Barrand. All rights reserved.
// See the file tools.license for terms.
#ifndef tools_glprims
#define tools_glprims
//same as OpenGL GL_[POINTS,etc...], but for the case we don't have OpenGL.
#include <cstddef> //size_t
namespace tools {
namespace gl {
typedef unsigned char mode_t;
inline mode_t points() {return 0x0000;}
inline mode_t lines() {return 0x0001;} //segments
inline mode_t line_loop() {return 0x0002;}
inline mode_t line_strip() {return 0x0003;} //polyline
inline mode_t triangles() {return 0x0004;}
inline mode_t triangle_strip() {return 0x0005;}
inline mode_t triangle_fan() {return 0x0006;}
//inline mode_t quads() {return 0x0007;}
//inline mode_t quad_strip() {return 0x0008;}
//inline mode_t polygon() {return 0x0009;}
inline bool is_mode(mode_t a_mode) {
return a_mode<=0x006?true:false;
}
inline bool is_line(mode_t a_mode) {
if(a_mode==points()) return true; //0 sz line !
if(a_mode==lines()) return true;
if(a_mode==line_loop()) return true;
if(a_mode==line_strip()) return true;
return false;
}
inline void cvt_2to3(size_t a_npt,const float* a_xys,float*& a_xyzs) {
const float* vpos = a_xys;
float x,y;
for(size_t i=0;i<a_npt;i++) {
x = *vpos;vpos++;
y = *vpos;vpos++;
*a_xyzs = x;a_xyzs++;
*a_xyzs = y;a_xyzs++;
*a_xyzs = 0;a_xyzs++;
}
}
inline void triangle_fan_to_triangles(size_t a_npt,const float* a_fxyzs,float*& a_xyzs) {
// a_xyzs = (a_npt-2)*3*3
const float* vpos = a_fxyzs;
float x1 = *vpos;vpos++;
float y1 = *vpos;vpos++;
float z1 = *vpos;vpos++;
float x2 = *vpos;vpos++;
float y2 = *vpos;vpos++;
float z2 = *vpos;vpos++;
float x3,y3,z3;
for(size_t i=2;i<a_npt;i++) {
x3 = *vpos;vpos++;
y3 = *vpos;vpos++;
z3 = *vpos;vpos++;
*a_xyzs = x1;a_xyzs++;
*a_xyzs = y1;a_xyzs++;
*a_xyzs = z1;a_xyzs++;
*a_xyzs = x2;a_xyzs++;
*a_xyzs = y2;a_xyzs++;
*a_xyzs = z2;a_xyzs++;
*a_xyzs = x3;a_xyzs++;
*a_xyzs = y3;a_xyzs++;
*a_xyzs = z3;a_xyzs++;
x2 = x3;
y2 = y3;
z2 = z3;
}
}
inline void triangle_strip_to_triangles(size_t a_npt,const float* a_fxyzs,float*& a_xyzs) {
// a_xyzs = (a_npt-2)*3*3
const float* vpos = a_fxyzs;
float x1 = *vpos;vpos++;
float y1 = *vpos;vpos++;
float z1 = *vpos;vpos++;
float x2 = *vpos;vpos++;
float y2 = *vpos;vpos++;
float z2 = *vpos;vpos++;
float x3,y3,z3;
bool flip = false;
for(size_t i=2;i<a_npt;i++) {
x3 = *vpos;vpos++;
y3 = *vpos;vpos++;
z3 = *vpos;vpos++;
if(flip) {
*a_xyzs = x1;a_xyzs++;
*a_xyzs = y1;a_xyzs++;
*a_xyzs = z1;a_xyzs++;
*a_xyzs = x3;a_xyzs++;
*a_xyzs = y3;a_xyzs++;
*a_xyzs = z3;a_xyzs++;
*a_xyzs = x2;a_xyzs++;
*a_xyzs = y2;a_xyzs++;
*a_xyzs = z2;a_xyzs++;
} else {
*a_xyzs = x1;a_xyzs++;
*a_xyzs = y1;a_xyzs++;
*a_xyzs = z1;a_xyzs++;
*a_xyzs = x2;a_xyzs++;
*a_xyzs = y2;a_xyzs++;
*a_xyzs = z2;a_xyzs++;
*a_xyzs = x3;a_xyzs++;
*a_xyzs = y3;a_xyzs++;
*a_xyzs = z3;a_xyzs++;
}
x1 = x2;
y1 = y2;
z1 = z2;
x2 = x3;
y2 = y3;
z2 = z3;
flip = flip?false:true;
}
}
inline void triangle_fan_to_triangles(size_t a_npt,
const float* a_fxyzs,const float* a_fnms,
float*& a_xyzs,float*& a_nms) {
triangle_fan_to_triangles(a_npt,a_fxyzs,a_xyzs);
triangle_fan_to_triangles(a_npt,a_fnms,a_nms);
}
inline void triangle_strip_to_triangles(size_t a_npt,
const float* a_fxyzs,const float* a_fnms,
float*& a_xyzs,float*& a_nms) {
// a_xyzs, a_nms = (a_npt-2)*3*3
triangle_strip_to_triangles(a_npt,a_fxyzs,a_xyzs);
triangle_strip_to_triangles(a_npt,a_fnms,a_nms);
}
inline void triangle_fan_to_triangles_2to3(size_t a_npt,const float* a_xys,float*& a_xyzs) {
const float* vpos = a_xys;
float x1 = *vpos;vpos++;
float y1 = *vpos;vpos++;
float x2 = *vpos;vpos++;
float y2 = *vpos;vpos++;
float x3,y3;
for(size_t i=2;i<a_npt;i++) {
x3 = *vpos;vpos++;
y3 = *vpos;vpos++;
*a_xyzs = x1;a_xyzs++;
*a_xyzs = y1;a_xyzs++;
*a_xyzs = 0;a_xyzs++;
*a_xyzs = x2;a_xyzs++;
*a_xyzs = y2;a_xyzs++;
*a_xyzs = 0;a_xyzs++;
*a_xyzs = x3;a_xyzs++;
*a_xyzs = y3;a_xyzs++;
*a_xyzs = 0;a_xyzs++;
x2 = x3;
y2 = y3;
}
}
inline void triangle_strip_to_triangles_2to3(size_t a_npt,const float* a_xys,float*& a_xyzs) {
const float* vpos = a_xys;
float x1 = *vpos;vpos++;
float y1 = *vpos;vpos++;
float x2 = *vpos;vpos++;
float y2 = *vpos;vpos++;
float x3,y3;
bool flip = false;
for(size_t i=2;i<a_npt;i++) {
x3 = *vpos;vpos++;
y3 = *vpos;vpos++;
if(flip) {
*a_xyzs = x1;a_xyzs++;
*a_xyzs = y1;a_xyzs++;
*a_xyzs = 0;a_xyzs++;
*a_xyzs = x3;a_xyzs++;
*a_xyzs = y3;a_xyzs++;
*a_xyzs = 0;a_xyzs++;
*a_xyzs = x2;a_xyzs++;
*a_xyzs = y2;a_xyzs++;
*a_xyzs = 0;a_xyzs++;
} else {
*a_xyzs = x1;a_xyzs++;
*a_xyzs = y1;a_xyzs++;
*a_xyzs = 0;a_xyzs++;
*a_xyzs = x2;a_xyzs++;
*a_xyzs = y2;a_xyzs++;
*a_xyzs = 0;a_xyzs++;
*a_xyzs = x3;a_xyzs++;
*a_xyzs = y3;a_xyzs++;
*a_xyzs = 0;a_xyzs++;
}
x1 = x2;
y1 = y2;
x2 = x3;
y2 = y3;
flip = flip?false:true;
}
}
inline void line_strip_to_lines_2to3(size_t a_npt,const float* a_xys,float*& a_xyzs) {
const float* vpos = a_xys;
float x1 = *vpos;vpos++;
float y1 = *vpos;vpos++;
float x2,y2;
for(size_t i=1;i<a_npt;i++) {
x2 = *vpos;vpos++;
y2 = *vpos;vpos++;
*a_xyzs = x1;a_xyzs++;
*a_xyzs = y1;a_xyzs++;
*a_xyzs = 0;a_xyzs++;
*a_xyzs = x2;a_xyzs++;
*a_xyzs = y2;a_xyzs++;
*a_xyzs = 0;a_xyzs++;
x1 = x2;
y1 = y2;
}
}
inline void line_strip_to_lines(size_t a_npt,const float* a_xys,float*& a_xyzs) {
// a_xyzs = (a_npt-1)*2*3
const float* vpos = a_xys;
float x1 = *vpos;vpos++;
float y1 = *vpos;vpos++;
float z1 = *vpos;vpos++;
float x2,y2,z2;
for(size_t i=1;i<a_npt;i++) {
x2 = *vpos;vpos++;
y2 = *vpos;vpos++;
z2 = *vpos;vpos++;
*a_xyzs = x1;a_xyzs++;
*a_xyzs = y1;a_xyzs++;
*a_xyzs = z1;a_xyzs++;
*a_xyzs = x2;a_xyzs++;
*a_xyzs = y2;a_xyzs++;
*a_xyzs = z2;a_xyzs++;
x1 = x2;
y1 = y2;
z1 = z2;
}
}
inline void line_loop_to_lines(size_t a_npt,const float* a_xys,float*& a_xyzs) {
// a_xyzs = a_npt*2*3
const float* vpos = a_xys;
float x1 = *vpos;vpos++;
float y1 = *vpos;vpos++;
float z1 = *vpos;vpos++;
float x0 = x1;
float y0 = y1;
float z0 = z1;
float x2,y2,z2;
for(size_t i=1;i<a_npt;i++) {
x2 = *vpos;vpos++;
y2 = *vpos;vpos++;
z2 = *vpos;vpos++;
*a_xyzs = x1;a_xyzs++;
*a_xyzs = y1;a_xyzs++;
*a_xyzs = z1;a_xyzs++;
*a_xyzs = x2;a_xyzs++;
*a_xyzs = y2;a_xyzs++;
*a_xyzs = z2;a_xyzs++;
x1 = x2;
y1 = y2;
z1 = z2;
}
*a_xyzs = x1;a_xyzs++;
*a_xyzs = y1;a_xyzs++;
*a_xyzs = z1;a_xyzs++;
*a_xyzs = x0;a_xyzs++;
*a_xyzs = y0;a_xyzs++;
*a_xyzs = z0;a_xyzs++;
}
/// for DirectX_action :
inline void triangle_fan_to_triangles_2to3(size_t a_npt,const float* a_xys,
float a_r,float a_g,float a_b,float a_a,
float*& a_xyz_rgbas) {
const float* vpos = a_xys;
float x1 = *vpos;vpos++;
float y1 = *vpos;vpos++;
float x2 = *vpos;vpos++;
float y2 = *vpos;vpos++;
float x3,y3;
for(size_t i=2;i<a_npt;i++) {
x3 = *vpos;vpos++;
y3 = *vpos;vpos++;
*a_xyz_rgbas = x1;a_xyz_rgbas++;
*a_xyz_rgbas = y1;a_xyz_rgbas++;
*a_xyz_rgbas = 0;a_xyz_rgbas++;
*a_xyz_rgbas = a_r;a_xyz_rgbas++;
*a_xyz_rgbas = a_g;a_xyz_rgbas++;
*a_xyz_rgbas = a_b;a_xyz_rgbas++;
*a_xyz_rgbas = a_a;a_xyz_rgbas++;
*a_xyz_rgbas = x2;a_xyz_rgbas++;
*a_xyz_rgbas = y2;a_xyz_rgbas++;
*a_xyz_rgbas = 0;a_xyz_rgbas++;
*a_xyz_rgbas = a_r;a_xyz_rgbas++;
*a_xyz_rgbas = a_g;a_xyz_rgbas++;
*a_xyz_rgbas = a_b;a_xyz_rgbas++;
*a_xyz_rgbas = a_a;a_xyz_rgbas++;
*a_xyz_rgbas = x3;a_xyz_rgbas++;
*a_xyz_rgbas = y3;a_xyz_rgbas++;
*a_xyz_rgbas = 0;a_xyz_rgbas++;
*a_xyz_rgbas = a_r;a_xyz_rgbas++;
*a_xyz_rgbas = a_g;a_xyz_rgbas++;
*a_xyz_rgbas = a_b;a_xyz_rgbas++;
*a_xyz_rgbas = a_a;a_xyz_rgbas++;
x2 = x3;
y2 = y3;
}
}
inline void triangle_fan_to_triangles(size_t a_npt,const float* a_xyzs,
float a_r,float a_g,float a_b,float a_a,
float*& a_xyz_rgbas) {
const float* vpos = a_xyzs;
float x1 = *vpos;vpos++;
float y1 = *vpos;vpos++;
float z1 = *vpos;vpos++;
float x2 = *vpos;vpos++;
float y2 = *vpos;vpos++;
float z2 = *vpos;vpos++;
float x3,y3,z3;
for(size_t i=2;i<a_npt;i++) {
x3 = *vpos;vpos++;
y3 = *vpos;vpos++;
z3 = *vpos;vpos++;
*a_xyz_rgbas = x1;a_xyz_rgbas++;
*a_xyz_rgbas = y1;a_xyz_rgbas++;
*a_xyz_rgbas = z1;a_xyz_rgbas++;
*a_xyz_rgbas = a_r;a_xyz_rgbas++;
*a_xyz_rgbas = a_g;a_xyz_rgbas++;
*a_xyz_rgbas = a_b;a_xyz_rgbas++;
*a_xyz_rgbas = a_a;a_xyz_rgbas++;
*a_xyz_rgbas = x2;a_xyz_rgbas++;
*a_xyz_rgbas = y2;a_xyz_rgbas++;
*a_xyz_rgbas = z2;a_xyz_rgbas++;
*a_xyz_rgbas = a_r;a_xyz_rgbas++;
*a_xyz_rgbas = a_g;a_xyz_rgbas++;
*a_xyz_rgbas = a_b;a_xyz_rgbas++;
*a_xyz_rgbas = a_a;a_xyz_rgbas++;
*a_xyz_rgbas = x3;a_xyz_rgbas++;
*a_xyz_rgbas = y3;a_xyz_rgbas++;
*a_xyz_rgbas = z3;a_xyz_rgbas++;
*a_xyz_rgbas = a_r;a_xyz_rgbas++;
*a_xyz_rgbas = a_g;a_xyz_rgbas++;
*a_xyz_rgbas = a_b;a_xyz_rgbas++;
*a_xyz_rgbas = a_a;a_xyz_rgbas++;
x2 = x3;
y2 = y3;
z2 = z3;
}
}
}}
#endif