Panda3D

coordinateSystem.cxx
Go to the documentation of this file.
1 /**
2 * PANDA 3D SOFTWARE
3 * Copyright (c) Carnegie Mellon University. All rights reserved.
4 *
5 * All use of this software is subject to the terms of the revised BSD
6 * license. You should have received a copy of this license along
7 * with this source code in a file named "LICENSE."
8 *
9 * @file coordinateSystem.cxx
10 * @author drose
11 * @date 1999-09-24
12 */
13
14 #include "coordinateSystem.h"
15 #include "config_linmath.h"
16 #include "configVariableEnum.h"
17 #include "string_utils.h"
18
19 #include "dconfig.h"
20 #include "pnotify.h"
21
22 #include <ctype.h>
23
24 using std::istream;
25 using std::ostream;
26 using std::ostringstream;
27 using std::string;
28
29 static ConfigVariableEnum<CoordinateSystem> default_cs
30 ("coordinate-system", CS_zup_right,
31 PRC_DESC("The default coordinate system to use throughout Panda for "
32 "rendering, user input, and matrix operations, unless specified "
33 "otherwise."));
34
35
36 CoordinateSystem
37 get_default_coordinate_system() {
38 CoordinateSystem cs = default_cs;
39 return (cs == CS_default || cs == CS_invalid) ? CS_zup_right : cs;
40 }
41
42
43 CoordinateSystem
44 parse_coordinate_system_string(const string &str) {
45 if (cmp_nocase_uh(str, "default") == 0) {
46 return CS_default;
47
48 } else if (cmp_nocase_uh(str, "zup") == 0 ||
49 cmp_nocase_uh(str, "zup-right") == 0 ||
50 cmp_nocase_uh(str, "z-up") == 0 ||
51 cmp_nocase_uh(str, "z-up-right") == 0) {
52 return CS_zup_right;
53
54 } else if (cmp_nocase_uh(str, "yup") == 0 ||
55 cmp_nocase_uh(str, "yup-right") == 0 ||
56 cmp_nocase_uh(str, "y-up") == 0 ||
57 cmp_nocase_uh(str, "y-up-right") == 0) {
58 return CS_yup_right;
59
60 } else if (cmp_nocase_uh(str, "z-up-left") == 0 ||
61 cmp_nocase_uh(str, "zup-left") == 0) {
62 return CS_zup_left;
63
64 } else if (cmp_nocase_uh(str, "y-up-left") == 0 ||
65 cmp_nocase_uh(str, "yup-left") == 0) {
66 return CS_yup_left;
67 }
68
69 return CS_invalid;
70 }
71
72 string
73 format_coordinate_system(CoordinateSystem cs) {
74 ostringstream strm;
75 strm << cs;
76 return strm.str();
77 }
78
79 bool
80 is_right_handed(CoordinateSystem cs) {
81 if (cs == CS_default) {
82 cs = get_default_coordinate_system();
83 }
84 switch (cs) {
85 case CS_zup_right:
86 case CS_yup_right:
87 return true;
88
89 case CS_zup_left:
90 case CS_yup_left:
91 return false;
92
93 default:
94 linmath_cat.error()
95 << "Invalid coordinate system value: " << (int)cs << "\n";
96 nassertr(false, false);
97 return false;
98 }
99 }
100
101 ostream &
102 operator << (ostream &out, CoordinateSystem cs) {
103 switch (cs) {
104 case CS_default:
105 return out << "default";
106
107 case CS_zup_right:
108 return out << "zup_right";
109
110 case CS_yup_right:
111 return out << "yup_right";
112
113 case CS_zup_left:
114 return out << "zup_left";
115
116 case CS_yup_left:
117 return out << "yup_left";
118
119 case CS_invalid:
120 return out << "invalid";
121 }
122
123 linmath_cat->error()
124 << "Invalid coordinate_system value: " << (int)cs << "\n";
125 nassertr(false, out);
126 return out;
127 }
128
129 istream &
130 operator >> (istream &in, CoordinateSystem &cs) {
131 string word;
132 in >> word;
133 cs = parse_coordinate_system_string(word);
134 if (cs == CS_invalid) {
135 linmath_cat->error()
136 << "Invalid coordinate_system string: " << word << "\n";
137 }
138 return in;
139 }
ConfigVariableEnum
This class specializes ConfigVariable as an enumerated type.
Definition: configVariableEnum.h:31
configVariableEnum.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
config_linmath.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
coordinateSystem.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
dconfig.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pnotify.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
string_utils.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.