38#include <visp3/core/vpConfig.h>
40#ifndef DOXYGEN_SHOULD_SKIP_THIS
56static View_parameters stack[STACKSIZE] = { vpDEFAULT_VIEW };
57static View_parameters *sp = stack;
67void fprintf_vwstack(FILE *fp,
char *argv)
69 if (argv == NULL || strcmp(argv,
"type") == 0) {
77 typetoa =
"perspective";
83 fprintf(fp,
"(type\t%s)\n", typetoa);
87 if (argv == NULL || strcmp(argv,
"cop") == 0) {
88 fprintf(fp,
"(cop\t%.3f\t%.3f\t%.3f)\n", sp->cop.x, sp->cop.y, sp->cop.z);
92 if (argv == NULL || strcmp(argv,
"vrp") == 0) {
93 fprintf(fp,
"(vrp\t%.3f\t%.3f\t%.3f)\n", sp->vrp.x, sp->vrp.y, sp->vrp.z);
97 if (argv == NULL || strcmp(argv,
"vpn") == 0) {
98 fprintf(fp,
"(vpn\t%.3f\t%.3f\t%.3f)\n", sp->vpn.x, sp->vpn.y, sp->vpn.z);
102 if (argv == NULL || strcmp(argv,
"vup") == 0) {
103 fprintf(fp,
"(vup\t%.3f\t%.3f\t%.3f)\n", sp->vup.x, sp->vup.y, sp->vup.z);
107 if (argv == NULL || strcmp(argv,
"window") == 0) {
108 fprintf(fp,
"(window\t%.3f\t%.3f\t%.3f\t%.3f)\n", sp->vwd.umin, sp->vwd.umax, sp->vwd.vmin, sp->vwd.vmax);
112 if (argv == NULL || strcmp(argv,
"depth") == 0) {
113 fprintf(fp,
"(depth\t%.3f\t%.3f)\n", sp->depth.front, sp->depth.back);
118 static char proc_name[] =
"fprintf_vwstack";
119 fprintf(stderr,
"%s: argument unknown\n", proc_name);
129View_parameters *get_vwstack(
void) {
return (sp); }
137void load_vwstack(View_parameters *vp) { *sp = *vp; }
143void pop_vwstack(
void)
146 static char proc_name[] =
"pop_vwstack";
147 fprintf(stderr,
"%s: stack underflow\n", proc_name);
158void push_vwstack(
void)
160 if (sp == stack + STACKSIZE - 1) {
161 static char proc_name[] =
"push_vwstack";
162 fprintf(stderr,
"%s: stack overflow\n", proc_name);
173void swap_vwstack(
void)
175 View_parameters *vp, tmp;
177 vp = (sp == stack) ? sp + 1 : sp - 1;
188void add_vwstack(
const char *path, ...)
196 argv = va_arg(ap,
char *);
197 if (strcmp(argv,
"cop") == 0) {
199 SET_COORD3(sp->cop,
static_cast<float>(va_arg(ap,
double)),
static_cast<float>(va_arg(ap,
double)),
static_cast<float>(va_arg(ap,
double)));
201 else if (strcmp(argv,
"depth") == 0) {
203 sp->depth.front =
static_cast<float>(va_arg(ap,
double));
204 sp->depth.back =
static_cast<float>(va_arg(ap,
double));
206 else if (strcmp(argv,
"type") == 0) {
208 sp->type = (Type)va_arg(ap,
int);
210 else if (strcmp(argv,
"vpn") == 0) {
212 float x =
static_cast<float>(va_arg(ap,
double));
213 float y =
static_cast<float>(va_arg(ap,
double));
214 float z =
static_cast<float>(va_arg(ap,
double));
217 if (std::fabs(x) <= std::numeric_limits<double>::epsilon() &&
218 std::fabs(y) <= std::numeric_limits<double>::epsilon() &&
219 std::fabs(z) <= std::numeric_limits<double>::epsilon()) {
220 static char proc_name[] =
"add_vwstack";
221 fprintf(stderr,
"%s: bad vpn\n", proc_name);
224 SET_COORD3(sp->vpn, x, y, z);
227 else if (strcmp(argv,
"vrp") == 0) {
229 SET_COORD3(sp->vrp,
static_cast<float>(va_arg(ap,
double)),
static_cast<float>(va_arg(ap,
double)),
static_cast<float>(va_arg(ap,
double)));
231 else if (strcmp(argv,
"vup") == 0) {
233 float x =
static_cast<float>(va_arg(ap,
double));
234 float y =
static_cast<float>(va_arg(ap,
double));
235 float z =
static_cast<float>(va_arg(ap,
double));
238 if (std::fabs(x) <= std::numeric_limits<double>::epsilon() &&
239 std::fabs(y) <= std::numeric_limits<double>::epsilon() &&
240 std::fabs(z) <= std::numeric_limits<double>::epsilon()) {
241 static char proc_name[] =
"add_vwstack";
242 fprintf(stderr,
"%s: bad vup\n", proc_name);
245 SET_COORD3(sp->vup, x, y, z);
248 else if (strcmp(argv,
"window") == 0) {
250 sp->vwd.umin =
static_cast<float>(va_arg(ap,
double));
251 sp->vwd.umax =
static_cast<float>(va_arg(ap,
double));
252 sp->vwd.vmin =
static_cast<float>(va_arg(ap,
double));
253 sp->vwd.vmax =
static_cast<float>(va_arg(ap,
double));
256 static char proc_name[] =
"add_vwstack";
257 fprintf(stderr,
"%s: bad argument\n", proc_name);