![]() |
TAPs 0.7.7.3
|
00001 /****************************************************************************** 00002 TAPsModelDeformableGLSL_Visualization_RTGenMesh.cpp 00003 ******************************************************************************/ 00008 /****************************************************************************** 00009 SUKITTI PUNAK (05/28/2007) 00010 UPDATE (09/29/2007) 00011 ******************************************************************************/ 00012 #include "TAPsModelDeformableGLSL_Visualization_RTGenMesh.hpp" 00013 // Using Inclusion Model (i.e. definitions are included in declarations) 00014 // (this name.cpp is included in name.hpp) 00015 // Each friend is defined directly inside its declaration. 00016 00017 BEGIN_NAMESPACE_TAPs__OpenGL 00018 //============================================================================= 00019 // START: STATIC MEMBER(S) AND FUNCTION(S) 00020 //=============================================================== 00021 template <typename T> unsigned short 00022 ModelDeformableGLSL_Visualization_RTGenMesh<T>::g_iNumOfCreatedVisualDefModel = 0; 00023 //--------------------------------------------------------------- 00024 // Marching Cube Tables (EdgeTable & TriTable) 00025 //--------------------------------------------------------------- 00026 // Adapted from "Polygonising a scalar field" by Paul Bourke (1994) 00027 // http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/ 00028 //--------------------------------------------------------------- 00029 //----------------------------------------------------------------------------- 00030 // Vertex & Edge Index 00031 // 3------2------2 00032 // /| /| 00033 // 11 | 10 | 00034 // / 3 / 1 00035 // 7------6------6 | 00036 // | | | | 00037 // | 0------0--|---1 00038 // 7 / 5 / 00039 // | 8 | 9 00040 // |/ |/ 00041 // 4------4------5 00042 //--------------------------------- 00043 // Edge Table [256] & Triangle Table [256][16] 00051 // V = V1 + (isovalue - s1) (V2 - V1) / (s2 - s1) 00052 //----------------------------------------------------------------------------- 00053 template <typename T> unsigned short 00054 ModelDeformableGLSL_Visualization_RTGenMesh<T>::EdgeTable[256] = { 00055 // 0-127 00056 0x0 , 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c, 00057 0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00, 00058 0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c, 00059 0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90, 00060 0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c, 00061 0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30, 00062 0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac, 00063 0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0, 00064 0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c, 00065 0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60, 00066 0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc, 00067 0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0, 00068 0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c, 00069 0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950, 00070 0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc , 00071 0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0, 00072 00073 // 128-255 00074 0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc, 00075 0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0, 00076 0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c, 00077 0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650, 00078 0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc, 00079 0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0, 00080 0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c, 00081 0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460, 00082 0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac, 00083 0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0, 00084 0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c, 00085 0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230, 00086 0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c, 00087 0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190, 00088 0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c, 00089 0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0 00090 }; 00091 //------------------------------------------------------------------- 00092 template <typename T> char 00093 ModelDeformableGLSL_Visualization_RTGenMesh<T>::TriTable[256][16] = { 00094 // 0-9 00095 {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00096 {0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00097 {0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00098 {1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00099 {1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00100 {0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00101 {9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00102 {2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1}, 00103 {3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00104 {0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00105 // 10-19 00106 {1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00107 {1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1}, 00108 {3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00109 {0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1}, 00110 {3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1}, 00111 {9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00112 {4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00113 {4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00114 {0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00115 {4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1}, 00116 // 20-29 00117 {1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00118 {3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1}, 00119 {9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1}, 00120 {2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1}, 00121 {8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00122 {11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1}, 00123 {9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1}, 00124 {4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1}, 00125 {3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1}, 00126 {1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1}, 00127 // 30-39 00128 {4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1}, 00129 {4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1}, 00130 {9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00131 {9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00132 {0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00133 {8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1}, 00134 {1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00135 {3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, 00136 {5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1}, 00137 {2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1}, 00138 // 40-49 00139 {9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00140 {0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, 00141 {0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1}, 00142 {2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1}, 00143 {10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1}, 00144 {4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1}, 00145 {5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1}, 00146 {5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1}, 00147 {9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00148 {9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1}, 00149 // 50-59 00150 {0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1}, 00151 {1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00152 {9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1}, 00153 {10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1}, 00154 {8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1}, 00155 {2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1}, 00156 {7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1}, 00157 {9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1}, 00158 {2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1}, 00159 {11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1}, 00160 // 60-69 00161 {9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1}, 00162 {5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1}, 00163 {11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1}, 00164 {11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00165 {10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00166 {0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00167 {9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00168 {1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1}, 00169 {1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00170 {1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1}, 00171 // 70-79 00172 {9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1}, 00173 {5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1}, 00174 {2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00175 {11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1}, 00176 {0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1}, 00177 {5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1}, 00178 {6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1}, 00179 {0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1}, 00180 {3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1}, 00181 {6, 5, 9, 6, 9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1}, 00182 // 80-89 00183 {5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00184 {4, 3, 0, 4, 7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1}, 00185 {1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1}, 00186 {10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1}, 00187 {6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1}, 00188 {1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, -1, -1, -1, -1}, 00189 {8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1}, 00190 {7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, -1}, 00191 {3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1}, 00192 {5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1, -1, -1}, 00193 // 90-99 00194 {0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1}, 00195 {9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1}, 00196 {8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1}, 00197 {5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1}, 00198 {0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1}, 00199 {6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1}, 00200 {10, 4, 9, 6, 4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00201 {4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1}, 00202 {10, 0, 1, 10, 6, 0, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1}, 00203 {8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1}, 00204 // 100-109 00205 {1, 4, 9, 1, 2, 4, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1}, 00206 {3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1}, 00207 {0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00208 {8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1}, 00209 {10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1, -1, -1, -1}, 00210 {0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1}, 00211 {3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1, -1}, 00212 {6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1}, 00213 {9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1}, 00214 {8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1}, 00215 // 110-119 00216 {3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1}, 00217 {6, 4, 8, 11, 6, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00218 {7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1}, 00219 {0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1}, 00220 {10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, -1, -1, -1, -1}, 00221 {10, 6, 7, 10, 7, 1, 1, 7, 3, -1, -1, -1, -1, -1, -1, -1}, 00222 {1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1}, 00223 {2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1}, 00224 {7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1}, 00225 {7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00226 // 120-129 00227 {2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1}, 00228 {2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1}, 00229 {1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1}, 00230 {11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1}, 00231 {8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1}, 00232 {0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00233 {7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1}, 00234 {7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00235 {7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00236 {3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00237 // 130-139 00238 {0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00239 {8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1}, 00240 {10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00241 {1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1}, 00242 {2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1}, 00243 {6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1}, 00244 {7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00245 {7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1}, 00246 {2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1}, 00247 {1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1}, 00248 // 140-149 00249 {10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1}, 00250 {10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1}, 00251 {0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1}, 00252 {7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1}, 00253 {6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00254 {3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1}, 00255 {8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1}, 00256 {9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1}, 00257 {6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1}, 00258 {1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1}, 00259 // 150-159 00260 {4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1}, 00261 {10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1}, 00262 {8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1}, 00263 {0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00264 {1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1}, 00265 {1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1}, 00266 {8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1}, 00267 {10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1}, 00268 {4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1}, 00269 {10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00270 // 160-169 00271 {4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00272 {0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1}, 00273 {5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1}, 00274 {11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1}, 00275 {9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1}, 00276 {6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1}, 00277 {7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1}, 00278 {3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1}, 00279 {7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1}, 00280 {9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1}, 00281 // 170-179 00282 {3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1}, 00283 {6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1}, 00284 {9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1}, 00285 {1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1}, 00286 {4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1}, 00287 {7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1}, 00288 {6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1}, 00289 {3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1}, 00290 {0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1}, 00291 {6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1}, 00292 // 180-189 00293 {1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1}, 00294 {0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1}, 00295 {11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1}, 00296 {6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1}, 00297 {5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1}, 00298 {9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1}, 00299 {1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1}, 00300 {1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00301 {1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1}, 00302 {10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1}, 00303 // 190-199 00304 {0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00305 {10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00306 {11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00307 {11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1}, 00308 {5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1}, 00309 {10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1}, 00310 {11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1}, 00311 {0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1}, 00312 {9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1}, 00313 {7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1}, 00314 // 200-209 00315 {2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1}, 00316 {8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1}, 00317 {9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1}, 00318 {9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1}, 00319 {1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00320 {0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1}, 00321 {9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1}, 00322 {9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00323 {5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1}, 00324 {5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1}, 00325 // 210-219 00326 {0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1}, 00327 {10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1}, 00328 {2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1}, 00329 {0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1}, 00330 {0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1}, 00331 {9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00332 {2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1}, 00333 {5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1}, 00334 {3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1}, 00335 {5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1}, 00336 // 220-229 00337 {8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1}, 00338 {0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00339 {8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1}, 00340 {9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00341 {4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1}, 00342 {0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1}, 00343 {1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1}, 00344 {3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1}, 00345 {4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1}, 00346 {9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1}, 00347 // 230-239 00348 {11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1}, 00349 {11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1}, 00350 {2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1}, 00351 {9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1}, 00352 {3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1}, 00353 {1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00354 {4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1}, 00355 {4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1}, 00356 {4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00357 {4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00358 // 240-249 00359 {9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00360 {3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1}, 00361 {0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1}, 00362 {3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00363 {1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1}, 00364 {3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1}, 00365 {0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00366 {3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00367 {2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1}, 00368 {9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00369 // 250-255 00370 {2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1}, 00371 {1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00372 {1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00373 {0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00374 {0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, 00375 {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1} 00376 }; 00377 //------------------------------------------------------------------- 00378 template <typename T> GLuint 00379 ModelDeformableGLSL_Visualization_RTGenMesh<T>::EdgeTableTexture = 0; 00380 template <typename T> GLuint 00381 ModelDeformableGLSL_Visualization_RTGenMesh<T>::TriTableTexture = 0; 00382 //template <typename T> GLuint 00383 //ModelDeformableGLSL_Visualization_RTGenMesh<T>::TriAndEdgeTableTexture = 0; 00384 //------------------------------------------------------------------- 00385 //template <typename T> 00386 //bool ModelDeformableGLSL_Visualization_RTGenMesh<T>::SetupEdgeAndTriTablesOnGPUToo () 00387 //{ 00388 // //----------------------------------------------------- 00389 // /** 00390 // * Setup Tri and Edge Tables together on one 2D Texture 00391 // * 00392 // * Triangle Table Texture 00393 // * 00394 // * The value from the edge table is mapped to the triangle table 00395 // * for generating triangles. Each generated triangle has its vertices 00396 // * intersect an edge of the cube. 00397 // * 00398 // * Edge Table Texture 00399 // * 00400 // * An integer 2D texture of size 16x256 (width and height of GPU texture) 00401 // * for TriTable[256][16] -- height and width of CPU memory 00402 // * This texture stores the 256 configurations of the marching cube. 00403 // * Its 12-bit are set/unset by the eight cube vertices using a bitfield operation. 00404 // */ 00405 // // An integer 2D texture of size 16x(256+16) 00406 // glGenTextures( 1, &TriAndEdgeTableTexture ); 00407 // glEnable( GL_TEXTURE_2D ); 00408 // glBindTexture( GL_TEXTURE_2D, TriAndEdgeTableTexture ); 00409 // // Integer textures must use nearest filter 00410 // glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); 00411 // glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); 00412 // glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP ); 00413 // glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP ); 00414 // { 00415 // int idx = 0; 00416 // GLint TriAndEdgeTableData[(256+16)*16]; 00417 // for ( int i = 0; i < 256; ++i ) { 00418 // for ( int j = 0; j < 16; ++j ) { 00419 // TriAndEdgeTableData[idx] = static_cast<GLint>( TriTable[i][j] ); 00420 // ++idx; 00421 // } 00422 // } 00423 // for ( int i = 0; i < 256; ++i ) { 00424 // TriAndEdgeTableData[idx] = static_cast<GLint>( EdgeTable[i] ); 00425 // ++idx; 00426 // } 00427 // glTexImage2D( 00428 // GL_TEXTURE_2D, 0, GL_ALPHA16I_EXT, 16, 256+16, 00429 // 0, GL_ALPHA_INTEGER_EXT, GL_INT, &TriAndEdgeTableData ); 00430 // } 00431 // //--------------------------------- 00432 // // DEBUG: CHECK THE CREATED TEXTURE 00433 // //#ifdef TAPs_DEBUG_MODE 00434 // { 00435 // GLint data[(256+16)*16]; 00436 // glBindBuffer( GL_PIXEL_PACK_BUFFER, 0 ); 00437 // glBindTexture( GL_TEXTURE_2D, TriAndEdgeTableTexture ); 00438 // glGetTexImage( GL_TEXTURE_2D, 0, GL_ALPHA_INTEGER_EXT, GL_INT, data ); 00439 // TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 00440 // 00441 // std::cout << "---------\n"; 00442 // std::cout << "EdgeTable\n"; 00443 // std::cout << "---------\n"; 00444 // for ( int i = 0; i < 256; ++i ) { 00445 // std::cout /*<< std::setbase( 16 )*/ << "(" << EdgeTable[i] << ") "; 00446 // std::cout /*<< std::setbase( 16 )*/ << data[256*16+i] << "\t"; 00447 // if ( (i+1) % 8 == 0 ) { 00448 // std::cout << "\n"; 00449 // } 00450 // } 00451 // std::cout << "---------\n"; 00452 // 00453 // std::cout << "---------\n"; 00454 // std::cout << "TriTable\n"; 00455 // std::cout << "---------\n"; 00456 // int count = 0; 00457 // for ( int i = 0; i < 256; ++i ) { 00458 // for ( int j = 0; j < 16; ++j ) { 00459 // std::cout << "(" << static_cast<GLint>( TriTable[i][j] ) << ") "; 00460 // std::cout << data[i*16+j] << "\t"; 00461 // if ( ++count % 16 == 0 ) { 00462 // std::cout << "\n"; 00463 // } 00464 // } 00465 // } 00466 // std::cout << "---------\n"; 00467 // } 00468 // //#endif // #ifdef TAPs_DEBUG_MODE 00469 // //--------------------------------- 00470 // //----------------------------------------------------- 00471 // glDisable( GL_TEXTURE_2D ); 00472 // glBindTexture( GL_TEXTURE_2D, 0 ); 00473 // //----------------------------------------------------- 00474 // return true; 00475 //} 00476 //------------------------------------------------------------------- 00477 template <typename T> 00478 bool ModelDeformableGLSL_Visualization_RTGenMesh<T>::SetupEdgeAndTriTablesOnGPU () 00479 { 00480 // if already generated 00481 if ( EdgeTableTexture && TriTableTexture ) return true; 00482 //----------------------------------------------------- 00489 // An integer 2D texture of size 256x1 00490 glGenTextures( 1, &EdgeTableTexture ); 00491 glEnable( GL_TEXTURE_2D ); 00492 glBindTexture( GL_TEXTURE_2D, EdgeTableTexture ); 00493 // Integer textures must use nearest filter 00494 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); 00495 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); 00496 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP ); 00497 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP ); 00498 { 00499 GLint EdgeTableData[256]; 00500 for ( int i = 0; i < 256; ++i ) { 00501 EdgeTableData[i] = static_cast<GLint>( EdgeTable[i] ); 00502 } 00503 glTexImage2D( 00504 GL_TEXTURE_2D, 0, GL_ALPHA16I_EXT, 256, 1, 00505 0, GL_ALPHA_INTEGER_EXT, GL_INT, &EdgeTableData ); 00506 } 00507 //--------------------------------- 00508 // DEBUG: CHECK THE CREATED TEXTURE 00509 #ifdef TAPs_DEBUG_MODE 00510 { 00511 GLint data[256]; 00512 glBindBuffer( GL_PIXEL_PACK_BUFFER, 0 ); 00513 glBindTexture( GL_TEXTURE_2D, EdgeTableTexture ); 00514 glGetTexImage( GL_TEXTURE_2D, 0, GL_ALPHA_INTEGER_EXT, GL_INT, data ); 00515 00516 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 00517 std::cout << "---------\n"; 00518 std::cout << "EdgeTable\n"; 00519 std::cout << "---------\n"; 00520 for ( int i = 0; i < 256; ++i ) { 00521 std::cout /*<< std::setbase( 16 )*/ << "(" << EdgeTable[i] << ") "; 00522 std::cout /*<< std::setbase( 16 )*/ << data[i] << "\t"; 00523 if ( (i+1) % 8 == 0 ) { 00524 std::cout << "\n"; 00525 } 00526 } 00527 std::cout << "---------\n"; 00528 } 00529 #endif // #ifdef TAPs_DEBUG_MODE 00530 //--------------------------------- 00531 //----------------------------------------------------- 00539 // An integer 2D texture of size 16x256 (width and height of GPU texture) 00540 // for TriTable[256][16] -- height and width of CPU memory 00541 glGenTextures( 1, &TriTableTexture ); 00542 glEnable( GL_TEXTURE_2D ); 00543 glBindTexture( GL_TEXTURE_2D, TriTableTexture ); 00544 // Integer textures must use nearest filter 00545 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); 00546 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); 00547 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP ); 00548 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP ); 00549 { 00550 GLint TriTableData[256][16]; 00551 for ( int i = 0; i < 256; ++i ) { 00552 for ( int j = 0; j < 16; ++j ) { 00553 TriTableData[i][j] = static_cast<GLint>( TriTable[i][j] ); 00554 } 00555 } 00556 glTexImage2D( 00557 GL_TEXTURE_2D, 0, GL_ALPHA16I_EXT, 16, 256, 00558 0, GL_ALPHA_INTEGER_EXT, GL_INT, &TriTableData ); 00559 } 00560 //--------------------------------- 00561 // DEBUG: CHECK THE CREATED TEXTURE 00562 #ifdef TAPs_DEBUG_MODE 00563 { 00564 GLint data[256][16]; 00565 glBindBuffer( GL_PIXEL_PACK_BUFFER, 0 ); 00566 glBindTexture( GL_TEXTURE_2D, TriTableTexture ); 00567 glGetTexImage( GL_TEXTURE_2D, 0, GL_ALPHA_INTEGER_EXT, GL_INT, data ); 00568 00569 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 00570 std::cout << "---------\n"; 00571 std::cout << "TriTable\n"; 00572 std::cout << "---------\n"; 00573 int count = 0; 00574 for ( int i = 0; i < 256; ++i ) { 00575 for ( int j = 0; j < 16; ++j ) { 00576 std::cout << "(" << static_cast<GLint>( TriTable[i][j] ) << ") "; 00577 std::cout << data[i][j] << "\t"; 00578 if ( ++count % 16 == 0 ) { 00579 std::cout << "\n"; 00580 } 00581 } 00582 } 00583 std::cout << "---------\n"; 00584 } 00585 #endif // #ifdef TAPs_DEBUG_MODE 00586 //--------------------------------- 00587 glDisable( GL_TEXTURE_2D ); 00588 glBindTexture( GL_TEXTURE_2D, 0 ); 00589 //----------------------------------------------------- 00590 return true; 00591 } 00592 00593 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 00594 //------------------------------------------------------------------- 00595 template <typename T> 00596 bool ModelDeformableGLSL_Visualization_RTGenMesh<T>:: 00597 SetupCubeTrackingTexture ( Vector3<int> const & vGridSize ) 00598 { 00599 //----------------------------------------------------- 00606 // An integer 3D texture 00607 glGenTextures( 1, &CubeTrackingTexture ); 00608 glEnable( GL_TEXTURE_3D ); 00609 glBindTexture( GL_TEXTURE_3D, CubeTrackingTexture ); 00610 // Integer textures must use nearest filter 00611 glTexParameteri( GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); 00612 glTexParameteri( GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); 00613 glTexParameteri( GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP ); 00614 glTexParameteri( GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP ); 00615 glTexParameteri( GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP ); 00616 //--------------------------------- 00617 Vector3<int> vCubes( vGridSize[0]-1, vGridSize[1]-1, vGridSize[2]-1 ); 00618 int iTotalCubes = vCubes[0] * vCubes[1] * vCubes[2]; 00619 00620 // Use GLubyte for GL_ALPHA8UI_EXT gives incorrect result. 00621 // It has to be GLuint applied for either GL_ALPHA8UI_EXT or GL_ALPHA16UI_EXT. 00622 // Also the format has to be GL_ALPHA_INTEGER_EXT. 00623 // But the type has to be GL_UNSIGNED_INT. 00624 00625 // NOT WORKING! 00626 //GLubyte * pCubeValData = new GLubyte[ iTotalCubes ]; 00627 00628 //GLuint * pCubeValData = new GLuint[ iTotalCubes ]; 00629 GLint * pCubeValData = new GLint[ iTotalCubes ]; 00630 //GLubyte * pCubeValData = new GLubyte[ iTotalCubes ]; 00631 { 00632 int i = 0; 00633 for ( int z = 0; z < vCubes[2]; ++z ) { 00634 for ( int y = 0; y < vCubes[1]; ++y ) { 00635 for ( int x = 0; x < vCubes[0]; ++x ) { 00636 pCubeValData[i] = i % 256; 00637 //if ( x >= vCubes[0]/2 && y >= vCubes[1]/2 && z >= vCubes[1]/2 ) { 00638 // pCubeValData[i] = 55; 00639 //} 00640 //else { 00641 // pCubeValData[i] = 0; 00642 //} 00643 ++i; 00644 } 00645 } 00646 } 00647 00648 //glTexImage3D( 00649 // GL_TEXTURE_3D, 0, GL_ALPHA8UI_EXT, // This makes its 8-bit unsigned integer 00650 // //GL_TEXTURE_3D, 0, GL_ALPHA16UI_EXT, // This makes its 16-bit unsigned integer 00651 // vCubes[0], vCubes[1], vCubes[2], 00652 // //0, GL_ALPHA_INTEGER_EXT, GL_UNSIGNED_BYTE, pCubeValData ); 00653 // 0, GL_ALPHA_INTEGER_EXT, GL_UNSIGNED_INT, pCubeValData ); 00654 // CURRENTLY 00655 // GL_ALPHA8UI_EXT is not working correctly. 00656 // Due to bugs with unsigned int in geometry shader compiler/driver. 00657 // So GL_ALPHA16I_EXT is used instead! 00658 //glTexImage3D( 00659 // GL_TEXTURE_3D, 0, GL_ALPHA16I_EXT, // This makes its 16-bit integer 00660 // vCubes[0], vCubes[1], vCubes[2], 00661 // 0, GL_ALPHA_INTEGER_EXT, GL_INT, pCubeValData ); 00662 // CURRENTLY 00663 // The GLSL's texture3D( isampler3D sampler, vec3 coords ) 00664 // doesn't return the correct value for integer 00665 // The GLSL's texture3D( usampler3D sampler, vec3 coords ) 00666 // doesn't return the correct value for unsinged integer 00667 // So GL_ALPHA8 is used instead! 00668 //glTexImage3D( 00669 // GL_TEXTURE_3D, 0, GL_ALPHA8, // This makes its 8-bit unsigned byte 00670 // vCubes[0], vCubes[1], vCubes[2], 00671 // 0, GL_ALPHA, GL_UNSIGNED_BYTE, pCubeValData ); 00672 // CURRENTLY 00673 // GL_ALPHA8 DOESN'T WORK EITHER SO BACK TO GL_ALPHA16UI_EXT 00674 glTexImage3D( 00675 GL_TEXTURE_3D, 0, GL_ALPHA16I_EXT, // This makes its 16-bit integer 00676 vCubes[0], vCubes[1], vCubes[2], 00677 0, GL_ALPHA_INTEGER_EXT, GL_INT, pCubeValData ); 00678 } 00679 00680 /* 00681 //--------------------------------- 00682 // DEBUG: CHECK THE CREATED TEXTURE 00683 { 00684 std::cout << "-----------------------------------\n"; 00685 std::cout << "INIT DATA for Cube Tracking Texture\n"; 00686 std::cout << "-----------------------------------\n"; 00687 int i = 0; 00688 for ( int z = 0; z < vCubes[2]; ++z ) { 00689 for ( int y = 0; y < vCubes[1]; ++y ) { 00690 for ( int x = 0; x < vCubes[0]; ++x ) { 00691 std::cout << " "; 00692 if ( pCubeValData[i] < 100 ) std::cout << " "; 00693 if ( pCubeValData[i] < 10 ) std::cout << " "; 00694 std::cout << static_cast<int>( pCubeValData[i] ); 00695 ++i; 00696 } 00697 std::cout << "\n"; 00698 } 00699 std::cout << "\n"; 00700 } 00701 std::cout << "---------------------\n"; 00702 } 00703 { 00704 glBindBuffer( GL_PIXEL_PACK_BUFFER, 0 ); 00705 glBindTexture( GL_TEXTURE_3D, CubeTrackingTexture ); 00706 00707 // NOT WORKING! 00708 //glGetTexImage( GL_TEXTURE_3D, 0, GL_ALPHA_INTEGER_EXT, GL_UNSIGNED_BYTE, pCubeValData ); 00709 00710 // CURRENTLY, GL_ALPHA8UI_EXT is not working correctly. 00711 // Due to bugs with unsigned int in geometry shader compiler/driver. 00712 // So GL_ALPHA16I_EXT is used instead! 00713 //glGetTexImage( GL_TEXTURE_3D, 0, GL_ALPHA_INTEGER_EXT, GL_UNSIGNED_INT, pCubeValData ); 00714 //glGetTexImage( GL_TEXTURE_3D, 0, GL_ALPHA_INTEGER_EXT, GL_INT, pCubeValData ); 00715 // CURRENTLY 00716 // The GLSL's texture3D( isampler3D sampler, vec3 coords ) 00717 // doesn't return the correct value for integer 00718 // The GLSL's texture3D( usampler3D sampler, vec3 coords ) 00719 // doesn't return the correct value for unsinged integer 00720 // So GL_ALPHA8 is used instead! 00721 //glGetTexImage( GL_TEXTURE_3D, 0, GL_ALPHA_INTEGER_EXT, GL_INT, pCubeValData ); 00722 // CURRENTLY 00723 // The GLSL's texture3D( isampler3D sampler, vec3 coords ) 00724 // doesn't return the correct value for integer 00725 // The GLSL's texture3D( usampler3D sampler, vec3 coords ) 00726 // doesn't return the correct value for unsinged integer 00727 // So GL_ALPHA8 is used instead! 00728 //glGetTexImage( GL_TEXTURE_3D, 0, GL_ALPHA, GL_UNSIGNED_BYTE, pCubeValData ); 00729 // CURRENTLY 00730 // GL_ALPHA8 DOESN'T WORK EITHER SO BACK TO GL_ALPHA16UI_EXT 00731 glGetTexImage( GL_TEXTURE_3D, 0, GL_ALPHA_INTEGER_EXT, GL_INT, pCubeValData ); 00732 00733 00734 00735 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 00736 std::cout << "---------------------\n"; 00737 std::cout << "Cube Tracking Texture\n"; 00738 std::cout << "---------------------\n"; 00739 int i = 0; 00740 for ( int z = 0; z < vCubes[2]; ++z ) { 00741 for ( int y = 0; y < vCubes[1]; ++y ) { 00742 for ( int x = 0; x < vCubes[0]; ++x ) { 00743 std::cout << " "; 00744 if ( pCubeValData[i] < 100 ) std::cout << " "; 00745 if ( pCubeValData[i] < 10 ) std::cout << " "; 00746 std::cout << static_cast<int>( pCubeValData[i] ); 00747 ++i; 00748 } 00749 std::cout << "\n"; 00750 } 00751 std::cout << "\n"; 00752 } 00753 std::cout << "-----------------------------------\n"; 00754 } 00755 //*/ 00756 00757 //--------------------------------- 00758 glDisable( GL_TEXTURE_3D ); 00759 glBindTexture( GL_TEXTURE_3D, 0 ); 00760 //----------------------------------------------------- 00761 delete [] pCubeValData; 00762 return true; 00763 } 00764 //------------------------------------------------------------------- 00765 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 00766 00767 //----------------------------------------------------------------------------- 00768 // END: STATIC MEMBER(S) AND FUNCTION(S) 00769 //============================================================================= 00770 //============================================================================= 00771 //----------------------------------------------------------------------------- 00772 // Nondefault Constructor 00773 template <typename T> 00774 ModelDeformableGLSL_Visualization_RTGenMesh<T>:: 00775 ModelDeformableGLSL_Visualization_RTGenMesh ( 00776 ModelDeformableGLSL<T> * simDomain 00777 ) 00778 { 00779 m_SimDomain = simDomain; 00780 //--------------------------------------------------------------- 00781 // Since Microsoft gl.h is version 1.1, 00782 // So this fn calls glewInit() for latest OpenGL version 00783 // and initialize GLSL. 00784 GFnInitGLSL(); 00785 00786 ++g_iNumOfCreatedVisualDefModel; 00787 00788 Default(); 00789 //--------------------------------------------------------------- 00790 #ifdef TAPs_DEBUG_MODE 00791 std::cout << "ModelDeformableGLSL_Visualization_RTGenMesh<" 00792 << typeid(T).name() << "> Constructor\n"; 00793 #endif 00794 } 00795 //----------------------------------------------------------------------------- 00796 // Destructor 00797 template <typename T> 00798 ModelDeformableGLSL_Visualization_RTGenMesh<T>:: 00799 ~ModelDeformableGLSL_Visualization_RTGenMesh () 00800 { 00801 Clear(); 00802 //--------------------------------------------------------------- 00803 // Static Data 00804 --g_iNumOfCreatedVisualDefModel; 00805 if ( g_iNumOfCreatedVisualDefModel == 0 ) { 00806 if ( EdgeTableTexture > 0 ) { 00807 glDeleteTextures( 1, &EdgeTableTexture ); 00808 EdgeTableTexture = 0; 00809 } 00810 if ( TriTableTexture > 0 ) { 00811 glDeleteTextures( 1, &TriTableTexture ); 00812 TriTableTexture = 0; 00813 } 00814 //if ( TriAndEdgeTableTexture > 0 ) { 00815 // glDeleteTextures( 1, &TriAndEdgeTableTexture ); 00816 // TriAndEdgeTableTexture = 0; 00817 //} 00818 } 00819 //--------------------------------------------------------------- 00820 #ifdef TAPs_DEBUG_MODE 00821 std::cout << "ModelDeformableGLSL_Visualization_RTGenMesh<" 00822 << typeid(T).name() << "> Destructor\n"; 00823 #endif 00824 } 00825 //----------------------------------------------------------------------------- 00826 // Default 00827 template <typename T> 00828 void ModelDeformableGLSL_Visualization_RTGenMesh<T>::Default () 00829 { 00830 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_BUFFERS 00831 //------------------------------------------- 00832 // For Rendering 00833 m_uiTotalCubes = 0; 00834 m_vboVerticesAsTexCoords = 0; 00835 00836 //------------------------------------------- 00837 // For Cube Tracking 00838 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 00839 m_vboTexCoordForCubeTracking = 0; 00840 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 00841 00842 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_BUFFERS 00843 00844 //------------------------------------------- 00845 // For GLSL shaders 00846 00847 // Selectable Gradient Computations 00848 //#ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_GRADIENT_SELECTABLE 00849 m_bComputeGradientFaces = true; 00850 m_bComputeGradientVertices = true; 00851 m_bComputeGradientEdges = true; 00852 //#endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_GRADIENT_SELECTABLE 00853 00854 // Interpolation Parameters 00855 m_glslProgramObjectWithGlobalIntpValue = NULL; 00856 m_glslProgramObjectWithTextureIntpValue = NULL; 00857 00858 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_SHADER_FOR_SHADING_SURFACE_FROM_SW 00859 m_glslProgramObjectForShaderSurfaceFromSW = NULL; 00860 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_SHADER_FOR_SHADING_SURFACE_FROM_SW 00861 00862 // Cube Tracking 00863 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 00864 m_glslFBO_CubeTracking = 0; 00865 m_glslProgramObjectUpdateCubeTracking = NULL; 00866 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 00867 00868 //------------------------------------------- 00869 // For Textures 00870 m_3DTexture = 0; 00871 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 00872 CubeTrackingTexture = 0; 00873 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 00874 //------------------------------------------- 00875 // Adjustable Parameters 00876 m_bUseGlobalInterpolationVal = false; 00877 m_tGlobalInterpolationVal = 0.1; 00878 m_bDrawPNTriangle = false; 00879 m_PNTriangleSmoothness = 4; 00880 //------------------------------------------- 00881 } 00882 //----------------------------------------------------------------------------- 00883 // Clear 00884 template <typename T> 00885 void ModelDeformableGLSL_Visualization_RTGenMesh<T>::Clear () 00886 { 00887 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_BUFFERS 00888 //--------------------------------------------------------------- 00889 // Clear Vertex Buffer for Rendering 00890 if ( m_vboVerticesAsTexCoords > 0 ) { 00891 glDeleteBuffers( 1, &m_vboVerticesAsTexCoords ); 00892 } 00893 00894 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 00895 //--------------------------------------------------------------- 00896 // Clear Vertex Buffer for Cube Tracking 00897 if ( m_vboTexCoordForCubeTracking > 0 ) { 00898 glDeleteBuffers( 1, &m_vboTexCoordForCubeTracking ); 00899 } 00900 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 00901 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_BUFFERS 00902 //--------------------------------------------------------------- 00903 // Clear GLSL Shaders 00904 if ( m_glslProgramObjectWithGlobalIntpValue ) { 00905 m_glslShaderManager.Delete( m_glslProgramObjectWithGlobalIntpValue ); 00906 } 00907 if ( m_glslProgramObjectWithTextureIntpValue ) { 00908 m_glslShaderManager.Delete( m_glslProgramObjectWithTextureIntpValue ); 00909 } 00910 00911 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_SHADER_FOR_SHADING_SURFACE_FROM_SW 00912 if ( m_glslProgramObjectForShaderSurfaceFromSW ) { 00913 m_glslShaderManager.Delete( m_glslProgramObjectForShaderSurfaceFromSW ); 00914 } 00915 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_SHADER_FOR_SHADING_SURFACE_FROM_SW 00916 00917 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 00918 // Delete Frame Buffer Object(s) 00919 if ( m_glslFBO_CubeTracking > 0 ) { 00920 glDeleteFramebuffersEXT( 1, &m_glslFBO_CubeTracking ); 00921 } 00922 if ( m_glslProgramObjectUpdateCubeTracking ) { 00923 m_glslShaderManager.Delete( m_glslProgramObjectUpdateCubeTracking ); 00924 } 00925 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 00926 //--------------------------------------------------------------- 00927 // Clear Textures 00928 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 00929 if ( CubeTrackingTexture > 0 ) { 00930 glDeleteTextures( 1, &CubeTrackingTexture ); 00931 } 00932 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 00933 //--------------------------------------------------------------- 00934 Default(); 00935 } 00936 //----------------------------------------------------------------------------- 00937 //============================================================================= 00938 00939 00940 //============================================================================= 00941 // SetupVisualization 00942 //----------------------------------------------------------------------------- 00943 template <typename T> 00944 bool ModelDeformableGLSL_Visualization_RTGenMesh<T>:: 00945 SetupVisualization ( 00946 int resolutionX, int resolutionY, int resolutionZ, 00947 enum GridGenerator<T>::VertexFlag *** pFlagDataForXYZVoxels 00948 ) 00949 { 00950 //--------------------------------------------------------------- 00951 // Setup (static) Edge and Triangle Tables 00952 if ( !SetupEdgeAndTriTablesOnGPU() ) { 00953 std::cout << "SetupEdgeAndTriTablesOnGPU returns false!\n"; 00954 return false; 00955 } 00956 //--------------------------------------------------------------- 00957 00958 //--------------------------------------------------------------- 00959 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_BUFFERS 00960 if ( !GenerateTheVBOForTextureCoordinates( 00961 Vector3<int>( resolutionX, resolutionY, resolutionZ ) ) 00962 ) { 00963 std::cout << "GenerateTheVBOForTextureCoordinates(...) returns false!\n"; 00964 return false; 00965 } 00966 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_BUFFERS 00967 //--------------------------------------------------------------- 00968 00969 //--------------------------------------------------------------- 00970 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_BUFFERS 00971 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 00972 if ( !GenerateTheVBOForTexCoordForCubeTracking( 00973 Vector3<int>( resolutionX, resolutionY, resolutionZ ) ) 00974 ) { 00975 std::cout << "GenerateTheVBOForTexCoordForCubeTracking(...) returns false!\n"; 00976 return false; 00977 } 00978 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 00979 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_BUFFERS 00980 //--------------------------------------------------------------- 00981 00982 //--------------------------------------------------------------- 00983 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_RENDERING 00984 if ( !SetupShadersForDrawing() ) { 00985 std::cout << "SetupShadersForDrawing() returns false!\n"; 00986 return false; 00987 } 00988 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_RENDERING 00989 //--------------------------------------------------------------- 00990 00991 //--------------------------------------------------------------- 00992 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 00993 //----------------------- 00994 if ( !GenerateBufferObjects() ) { 00995 std::cout << "GenerateBufferObjects() returns false!\n"; 00996 return false; 00997 } 00998 //----------------------- 00999 if ( !SetupCubeTrackingTexture( 01000 Vector3<int>( resolutionX, resolutionY, resolutionZ ) ) 01001 ) { 01002 std::cout << "SetupCubeTrackingTexture(...) returns false!\n"; 01003 return false; 01004 } 01005 //----------------------- 01006 if ( !SetupShadersForUpdateCubeTrackingTexture() ) { 01007 std::cout << "SetupShadersForUpdateCubeTrackingTexture() returns false!\n"; 01008 return false; 01009 } 01010 //----------------------- 01011 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 01012 //--------------------------------------------------------------- 01013 01014 return true; 01015 } 01016 //----------------------------------------------------------------------------- 01017 // END: SetupVisualization 01018 //============================================================================= 01019 01020 01021 //============================================================================= 01022 // Setup a 3D Texture for Visualization 01023 //----------------------------------------------------------------------------- 01024 /* 01025 template <typename T> 01026 bool ModelDeformableGLSL_Visualization_RTGenMesh<T>:: 01027 Setup3DTexture ( 01028 // int resolutionX, int resolutionY, int resolutionZ, 01029 // enum GridGenerator<T>::VertexFlag *** pFlagDataForXYZVoxels 01030 ) 01031 { 01032 //--------------------------------------------------------------- 01033 return true; 01034 } 01035 //*/ 01036 //----------------------------------------------------------------------------- 01037 // END: Setup3DTexture 01038 //============================================================================= 01039 01040 01041 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_RENDERING 01042 //============================================================================= 01043 // Setup Shaders for Drawing by Marching Cubes Algorithm 01044 //----------------------------------------------------------------------------- 01045 template <typename T> 01046 bool ModelDeformableGLSL_Visualization_RTGenMesh<T>::SetupShadersForDrawing () 01047 { 01048 //* 01049 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_SHADER_FOR_SHADING_SURFACE_FROM_SW 01050 if ( !m_glslShaderManager.CreateGLSLProgramObject( m_glslProgramObjectForShaderSurfaceFromSW ) ) { 01051 std::cout << "Cannot Create Program Object: m_glslProgramObjectForShaderSurfaceFromSW" << std::endl; 01052 Clear(); 01053 return false; 01054 } 01055 if ( !m_glslShaderManager.AttachShaderFromFile( m_glslProgramObjectForShaderSurfaceFromSW, 01056 "Resource/Shader/DefModelShaderForDrawBySW.vert", GL_VERTEX_SHADER ) ) { 01057 std::cout << "Cannot Load Shader: m_glslProgramObjectForShaderSurfaceFromSW --- Resource/Shader/DefModelShaderForDrawBySW.vert" << std::endl; 01058 Clear(); 01059 return false; 01060 } 01061 if ( !m_glslShaderManager.AttachShaderFromFile( m_glslProgramObjectForShaderSurfaceFromSW, 01062 "Resource/Shader/DefModelShaderForDrawBySW.frag", GL_FRAGMENT_SHADER ) ) { 01063 std::cout << "Cannot Load Shader: m_glslProgramObjectForShaderSurfaceFromSW --- Resource/Shader/DefModelShaderForDrawBySW.frag" << std::endl; 01064 Clear(); 01065 return false; 01066 } 01067 if ( !m_glslShaderManager.Link( m_glslProgramObjectForShaderSurfaceFromSW ) ) { 01068 Clear(); 01069 return false; 01070 } 01071 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_SHADER_FOR_SHADING_SURFACE_FROM_SW 01072 //*/ 01073 01074 //=============================================================== 01075 // START: m_glslProgramObjectWithGlobalIntpValue 01076 //--------------------------------------------------------------- 01077 if ( !m_glslShaderManager.CreateGLSLProgramObject( m_glslProgramObjectWithGlobalIntpValue ) ) { 01078 Clear(); 01079 return false; 01080 } 01081 //--------------------------------------------------------------- 01082 // Vertex Shader 01083 if ( !m_glslShaderManager.AttachShaderFromFile( m_glslProgramObjectWithGlobalIntpValue, 01084 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITHOUT_PNTRI 01085 01086 // WITH 1X1X1 CUBE 01087 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_1X1X1_CUBES 01088 // WITH CUBE TRACKING 01089 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 01090 // WITH GRADIENT TEXTURE 01091 #ifdef TAPs_MODEL_DEFORMABLE_USE_GRADIENT_TEXTURE 01092 //"Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes.vert", GL_VERTEX_SHADER ) ) { 01093 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_RdCubeVerticesOnVertShader.vert", GL_VERTEX_SHADER ) ) { 01094 #endif 01095 // WITHOUT GRADIENT TEXTURE 01096 #ifdef TAPs_MODEL_DEFORMABLE_NOT_USE_GRADIENT_TEXTURE 01097 // WITH SELECTABLE GRADIENT COMPUTATION OPTION 01098 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_GRADIENT_SELECTABLE 01099 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes.vert", GL_VERTEX_SHADER ) ) { 01100 // WITHOUT SELECTABLE GRADIENT COMPUTATION OPTION 01101 #else 01102 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes.vert", GL_VERTEX_SHADER ) ) { 01103 #endif 01104 #endif 01105 #endif 01106 // WITHOUT CUBE TRACKING 01107 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITHOUT_TRACKING_CUBES 01108 // WITH GRADIENT TEXTURE 01109 #ifdef TAPs_MODEL_DEFORMABLE_USE_GRADIENT_TEXTURE 01110 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes.vert", GL_VERTEX_SHADER ) ) { 01111 #endif 01112 // WITHOUT GRADIENT TEXTURE 01113 #ifdef TAPs_MODEL_DEFORMABLE_NOT_USE_GRADIENT_TEXTURE 01114 // WITH SELECTABLE GRADIENT COMPUTATION OPTION 01115 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_GRADIENT_SELECTABLE 01116 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes.vert", GL_VERTEX_SHADER ) ) { 01117 // WITHOUT SELECTABLE GRADIENT COMPUTATION OPTION 01118 #else 01119 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes.vert", GL_VERTEX_SHADER ) ) { 01120 #endif 01121 #endif 01122 #endif 01123 #endif 01124 01125 // WITH 2X2X2 CUBE 01126 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_2X2X2_CUBES 01127 "Resource/Shader/DefModelDrawByGenMesh_2x2x2cubes.vert", GL_VERTEX_SHADER ) ) { 01128 #endif 01129 01130 // WITH 4X4X4 CUBE 01131 //#ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_4X4X4_CUBES 01132 // "Resource/Shader/DefModelDrawByGenMesh_4x4x4cubes.vert", GL_VERTEX_SHADER ) ) { 01133 //#endif 01134 #endif 01135 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_PNTRI 01136 "Resource/Shader/DefModelDrawByGenMeshWithPNTri.vert", GL_VERTEX_SHADER ) ) { 01137 #endif 01138 Clear(); 01139 return false; 01140 } 01141 01142 //* 01144 // DEBUG 01145 { 01146 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITHOUT_PNTRI 01147 // WITH 1X1X1 CUBE 01148 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_1X1X1_CUBES 01149 // WITH CUBE TRACKING 01150 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 01151 // WITH GRADIENT TEXTURE 01152 #ifdef TAPs_MODEL_DEFORMABLE_USE_GRADIENT_TEXTURE 01153 //std::cout << "LOAD: Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wGlobalIntp_wCubeTracking_wGradTex.geom" << std::endl; 01154 std::cout << "LOAD: Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wGlobalIntp_wCubeTracking_wGradTex_RdCubeVerticesOnVertShader.geom" << std::endl; 01155 #endif 01156 // WITHOUT GRADIENT TEXTURE 01157 #ifdef TAPs_MODEL_DEFORMABLE_NOT_USE_GRADIENT_TEXTURE 01158 // WITH SELECTABLE GRADIENT COMPUTATION OPTION 01159 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_GRADIENT_SELECTABLE 01160 std::cout << "LOAD: Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wGlobalIntp_wCubeTracking_wSelectableGradients.geom" << std::endl; 01161 // WITHOUT SELECTABLE GRADIENT COMPUTATION OPTION 01162 #else 01163 std::cout << "LOAD: Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wGlobalIntp_wCubeTracking.geom" << std::endl; 01164 #endif 01165 #endif 01166 #endif 01167 // WITHOUT CUBE TRACKING 01168 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITHOUT_TRACKING_CUBES 01169 // WITH GRADIENT TEXTURE 01170 #ifdef TAPs_MODEL_DEFORMABLE_USE_GRADIENT_TEXTURE 01171 std::cout << "LOAD: Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wGlobalIntp_wGradTex.geom" << std::endl; 01172 #endif 01173 // WITHOUT GRADIENT TEXTURE 01174 #ifdef TAPs_MODEL_DEFORMABLE_NOT_USE_GRADIENT_TEXTURE 01175 // WITH SELECTABLE GRADIENT COMPUTATION OPTION 01176 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_GRADIENT_SELECTABLE 01177 std::cout << "LOAD: Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wGlobalIntp_wSelectableGradients.geom" << std::endl; 01178 // WITHOUT SELECTABLE GRADIENT COMPUTATION OPTION 01179 #else 01180 std::cout << "LOAD: Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wGlobalIntp.geom" << std::endl; 01181 #endif 01182 #endif 01183 #endif 01184 #endif 01185 // WITH 2X2X2 CUBES 01186 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_2X2X2_CUBES 01187 std::cout << "LOAD: Resource/Shader/DefModelDrawByGenMesh_2x2x2cubes.geom" << std::endl; 01188 #endif 01189 #endif 01190 // WITH PN-TRIANGLES 01191 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_PNTRI 01192 std::cout << "LOAD: Resource/Shader/DefModelDrawByGenMeshWithPNTri.geom" << std::endl; 01193 #endif 01194 } 01196 //*/ 01197 01198 //--------------------------------------------------------------- 01199 // Geometry Shader -- WITH GLOBAL INTERPOLATION VALUE 01200 if ( !m_glslShaderManager.AttachShaderFromFile( m_glslProgramObjectWithGlobalIntpValue, 01201 // WITHOUT PN-TRIANGLES 01202 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITHOUT_PNTRI 01203 // WITH 1X1X1 CUBE 01204 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_1X1X1_CUBES 01205 // WITH CUBE TRACKING 01206 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 01207 // WITH GRADIENT TEXTURE 01208 #ifdef TAPs_MODEL_DEFORMABLE_USE_GRADIENT_TEXTURE 01209 //"Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wGlobalIntp_wCubeTracking_wGradTex.geom", GL_GEOMETRY_SHADER_EXT ) ) { 01210 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wGlobalIntp_wCubeTracking_wGradTex_RdCubeVerticesOnVertShader.geom", GL_GEOMETRY_SHADER_EXT ) ) { 01211 #endif 01212 // WITHOUT GRADIENT TEXTURE 01213 #ifdef TAPs_MODEL_DEFORMABLE_NOT_USE_GRADIENT_TEXTURE 01214 // WITH SELECTABLE GRADIENT COMPUTATION OPTION 01215 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_GRADIENT_SELECTABLE 01216 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wGlobalIntp_wCubeTracking_wSelectableGradients.geom", GL_GEOMETRY_SHADER_EXT ) ) { 01217 // WITHOUT SELECTABLE GRADIENT COMPUTATION OPTION 01218 #else 01219 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wGlobalIntp_wCubeTracking.geom", GL_GEOMETRY_SHADER_EXT ) ) { 01220 #endif 01221 #endif 01222 #endif 01223 // WITHOUT CUBE TRACKING 01224 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITHOUT_TRACKING_CUBES 01225 // WITH GRADIENT TEXTURE 01226 #ifdef TAPs_MODEL_DEFORMABLE_USE_GRADIENT_TEXTURE 01227 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wGlobalIntp_wGradTex.geom", GL_GEOMETRY_SHADER_EXT ) ) { 01228 #endif 01229 // WITHOUT GRADIENT TEXTURE 01230 #ifdef TAPs_MODEL_DEFORMABLE_NOT_USE_GRADIENT_TEXTURE 01231 // WITH SELECTABLE GRADIENT COMPUTATION OPTION 01232 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_GRADIENT_SELECTABLE 01233 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wGlobalIntp_wSelectableGradients.geom", GL_GEOMETRY_SHADER_EXT ) ) { 01234 // WITHOUT SELECTABLE GRADIENT COMPUTATION OPTION 01235 #else 01236 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wGlobalIntp.geom", GL_GEOMETRY_SHADER_EXT ) ) { 01237 #endif 01238 #endif 01239 #endif 01240 #endif 01241 // WITH 2X2X2 CUBES 01242 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_2X2X2_CUBES 01243 "Resource/Shader/DefModelDrawByGenMesh_2x2x2cubes.geom", GL_GEOMETRY_SHADER_EXT ) ) { 01244 #endif 01245 #endif 01246 // WITH PN-TRIANGLES 01247 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_PNTRI 01248 "Resource/Shader/DefModelDrawByGenMeshWithPNTri.geom", GL_GEOMETRY_SHADER_EXT ) ) { 01249 #endif 01250 Clear(); 01251 return false; 01252 } 01253 //--------------------------------------------------------------- 01254 // Fragment Shader 01255 if ( !m_glslShaderManager.AttachShaderFromFile( m_glslProgramObjectWithGlobalIntpValue, 01256 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITHOUT_PNTRI 01257 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_1X1X1_CUBES 01258 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes.frag", GL_FRAGMENT_SHADER ) ) { 01259 #endif 01260 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_2X2X2_CUBES 01261 "Resource/Shader/DefModelDrawByGenMesh_2x2x2cubes.frag", GL_FRAGMENT_SHADER ) ) { 01262 #endif 01263 #endif 01264 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_PNTRI 01265 "Resource/Shader/DefModelDrawByGenMeshWithPNTri.frag", GL_FRAGMENT_SHADER ) ) { 01266 #endif 01267 Clear(); 01268 return false; 01269 } 01270 //--------------------------------------------------------------- 01271 // Setup Geometry Shader for Marching Cube 01272 // Since Geometry Shader needs to specify input and output types 01273 // and the number of maximum out/emitted vertices. 01274 { 01275 GLuint progObj = m_glslProgramObjectWithGlobalIntpValue->GetProgramObject(); 01276 glProgramParameteriEXT( progObj, GL_GEOMETRY_INPUT_TYPE_EXT, GL_POINTS ); 01277 glProgramParameteriEXT( progObj, GL_GEOMETRY_OUTPUT_TYPE_EXT, GL_TRIANGLE_STRIP ); 01278 // (At most 5 triangles from Marching Cube) * (PNTriangle Smoothness) 01279 // 5 * 10 (smoothness of 4 = 10 vertices per triangle) 01280 // Setting the smoothness to five (# out vertices = 5*15 = 75) seems to be too much 01281 // for 320MB 8800 GTS to handle -- i.e. too slow. 01282 // In addition, the rendered surface contains several holes. 01283 // Also setting the # out vertices to 50 (or 55 or 60), 01284 // the GLSL shader doesn't render the correct surface. 01285 // It renders a surface with several holes. 01286 // Due to this weird logic error from geometry shader, the # out vertices is set to 64. 01287 01288 // Check max number of vertices that the geometry shader can output 01289 01290 #ifdef TAPs_DEBUG_MODE 01291 GLint maxOutNumVertices; 01292 glGetIntegerv( GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT, &maxOutNumVertices ); 01293 std::cout << "The maximum number of output vertices that the graphics card's geometry shader can output is " << maxOutNumVertices << ".\n"; 01294 // GeForce 8800 GTS's GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT is 1024. 01295 #endif // #ifdef TAPs_DEBUG_MODE 01296 01297 01298 // Without PNTriangles 01299 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITHOUT_PNTRI 01300 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_1X1X1_CUBES 01301 glProgramParameteriEXT( progObj, GL_GEOMETRY_VERTICES_OUT_EXT, 16 /*15*/ ); 01302 #endif 01303 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_2X2X2_CUBES 01304 glProgramParameteriEXT( progObj, GL_GEOMETRY_VERTICES_OUT_EXT, 16*4 /*15x8*/ ); 01305 //glProgramParameteriEXT( progObj, GL_GEOMETRY_VERTICES_OUT_EXT, 256 /*15x8*/ ); 01306 #endif 01307 //#ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_4X4X4_CUBES 01308 //glProgramParameteriEXT( progObj, GL_GEOMETRY_VERTICES_OUT_EXT, 16 /*15x64*/ ); 01309 //#endif 01310 #endif 01311 01312 // With PNTriangles 01313 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_PNTRI 01314 glProgramParameteriEXT( progObj, GL_GEOMETRY_VERTICES_OUT_EXT, 64 /*(15/3)x10*/ ); 01315 #endif 01316 } 01317 //--------------------------------------------------------------- 01318 if ( !m_glslShaderManager.Link( m_glslProgramObjectWithGlobalIntpValue ) ) { 01319 Clear(); 01320 return false; 01321 } 01322 //--------------------------------------------------------------- 01323 // END: m_glslProgramObjectWithGlobalIntpValue 01324 //=============================================================== 01325 01326 01327 //=============================================================== 01328 // START: m_glslProgramObjectWithTextureIntpValue 01329 //--------------------------------------------------------------- 01330 if ( !m_glslShaderManager.CreateGLSLProgramObject( m_glslProgramObjectWithTextureIntpValue ) ) { 01331 Clear(); 01332 return false; 01333 } 01334 //--------------------------------------------------------------- 01335 // Vertex Shader 01336 if ( !m_glslShaderManager.AttachShaderFromFile( m_glslProgramObjectWithTextureIntpValue, 01337 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITHOUT_PNTRI 01338 // WITH 1X1X1 CUBE 01339 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_1X1X1_CUBES 01340 // WITH CUBE TRACKING 01341 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 01342 // WITH GRADIENT TEXTURE 01343 #ifdef TAPs_MODEL_DEFORMABLE_USE_GRADIENT_TEXTURE 01344 //"Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes.vert", GL_VERTEX_SHADER ) ) { 01345 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_RdCubeVerticesOnVertShader.vert", GL_VERTEX_SHADER ) ) { 01346 #endif 01347 // WITHOUT GRADIENT TEXTURE 01348 #ifdef TAPs_MODEL_DEFORMABLE_NOT_USE_GRADIENT_TEXTURE 01349 // WITH SELECTABLE GRADIENT COMPUTATION OPTION 01350 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_GRADIENT_SELECTABLE 01351 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes.vert", GL_VERTEX_SHADER ) ) { 01352 // WITHOUT SELECTABLE GRADIENT COMPUTATION OPTION 01353 #else 01354 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes.vert", GL_VERTEX_SHADER ) ) { 01355 #endif 01356 #endif 01357 #endif 01358 // WITHOUT CUBE TRACKING 01359 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITHOUT_TRACKING_CUBES 01360 // WITH GRADIENT TEXTURE 01361 #ifdef TAPs_MODEL_DEFORMABLE_USE_GRADIENT_TEXTURE 01362 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes.vert", GL_VERTEX_SHADER ) ) { 01363 #endif 01364 // WITHOUT GRADIENT TEXTURE 01365 #ifdef TAPs_MODEL_DEFORMABLE_NOT_USE_GRADIENT_TEXTURE 01366 // WITH SELECTABLE GRADIENT COMPUTATION OPTION 01367 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_GRADIENT_SELECTABLE 01368 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes.vert", GL_VERTEX_SHADER ) ) { 01369 // WITHOUT SELECTABLE GRADIENT COMPUTATION OPTION 01370 #else 01371 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes.vert", GL_VERTEX_SHADER ) ) { 01372 #endif 01373 #endif 01374 #endif 01375 #endif 01376 01377 // WITH 2X2X2 CUBE 01378 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_2X2X2_CUBES 01379 "Resource/Shader/DefModelDrawByGenMesh_2x2x2cubes.vert", GL_VERTEX_SHADER ) ) { 01380 #endif 01381 01382 // WITH 4X4X4 CUBE 01383 //#ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_4X4X4_CUBES 01384 // "Resource/Shader/DefModelDrawByGenMesh_4x4x4cubes.vert", GL_VERTEX_SHADER ) ) { 01385 //#endif 01386 #endif 01387 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_PNTRI 01388 "Resource/Shader/DefModelDrawByGenMeshWithPNTri.vert", GL_VERTEX_SHADER ) ) { 01389 #endif 01390 Clear(); 01391 return false; 01392 } 01393 01394 //* 01396 // DEBUG 01397 { 01398 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITHOUT_PNTRI 01399 // WITH 1X1X1 CUBE 01400 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_1X1X1_CUBES 01401 // WITH CUBE TRACKING 01402 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 01403 // WITH GRADIENT TEXTURE 01404 #ifdef TAPs_MODEL_DEFORMABLE_USE_GRADIENT_TEXTURE 01405 //std::cout << "LOAD: Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wTextureIntp_wCubeTracking_wGradTex.geom" << std::endl; 01406 std::cout << "LOAD: Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wTextureIntp_wCubeTracking_wGradTex_RdCubeVerticesOnVertShader.geom" << std::endl; 01407 #endif 01408 // WITHOUT GRADIENT TEXTURE 01409 #ifdef TAPs_MODEL_DEFORMABLE_NOT_USE_GRADIENT_TEXTURE 01410 // WITH SELECTABLE GRADIENT COMPUTATION OPTION 01411 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_GRADIENT_SELECTABLE 01412 std::cout << "LOAD: Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wTextureIntp_wCubeTracking_wSelectableGradients.geom" << std::endl; 01413 // WITHOUT SELECTABLE GRADIENT COMPUTATION OPTION 01414 #else 01415 std::cout << "LOAD: Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wTextureIntp_wCubeTracking.geom" << std::endl; 01416 #endif 01417 #endif 01418 #endif 01419 // WITHOUT CUBE TRACKING 01420 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITHOUT_TRACKING_CUBES 01421 // WITH GRADIENT TEXTURE 01422 #ifdef TAPs_MODEL_DEFORMABLE_USE_GRADIENT_TEXTURE 01423 std::cout << "LOAD: Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wTextureIntp_wGradTex.geom" << std::endl; 01424 #endif 01425 // WITHOUT GRADIENT TEXTURE 01426 #ifdef TAPs_MODEL_DEFORMABLE_NOT_USE_GRADIENT_TEXTURE 01427 // WITH SELECTABLE GRADIENT COMPUTATION OPTION 01428 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_GRADIENT_SELECTABLE 01429 std::cout << "LOAD: Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wTextureIntp_wSelectableGradients.geom" << std::endl; 01430 // WITHOUT SELECTABLE GRADIENT COMPUTATION OPTION 01431 #else 01432 std::cout << "LOAD: Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wTextureIntp.geom" << std::endl; 01433 #endif 01434 #endif 01435 #endif 01436 #endif 01437 // WITH 2X2X2 CUBES 01438 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_2X2X2_CUBES 01439 std::cout << "LOAD: Resource/Shader/DefModelDrawByGenMesh_2x2x2cubes.geom" << std::endl; 01440 #endif 01441 #endif 01442 // WITH PN-TRIANGLES 01443 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_PNTRI 01444 std::cout << "LOAD: Resource/Shader/DefModelDrawByGenMeshWithPNTri.geom" << std::endl; 01445 #endif 01446 } 01448 //*/ 01449 01450 //--------------------------------------------------------------- 01451 // Geometry Shader -- WITH INTERPOLATION VALUE TEXTURE 01452 if ( !m_glslShaderManager.AttachShaderFromFile( m_glslProgramObjectWithTextureIntpValue, 01453 // WITHOUT PN-TRIANGLES 01454 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITHOUT_PNTRI 01455 // 1X1X1 CUBE 01456 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_1X1X1_CUBES 01457 // WITH CUBE TRACKING OPTION 01458 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 01459 // WITH GRADIENT TEXTURE 01460 #ifdef TAPs_MODEL_DEFORMABLE_USE_GRADIENT_TEXTURE 01461 //"Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wTextureIntp_wCubeTracking_wGradTex.geom", GL_GEOMETRY_SHADER_EXT ) ) { 01462 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wTextureIntp_wCubeTracking_wGradTex_RdCubeVerticesOnVertShader.geom", GL_GEOMETRY_SHADER_EXT ) ) { 01463 #endif 01464 // WITHOUT GRADIENT TEXTURE 01465 #ifdef TAPs_MODEL_DEFORMABLE_NOT_USE_GRADIENT_TEXTURE 01466 // WITH SELECTABLE GRADIENT COMPUTATION OPTION 01467 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_GRADIENT_SELECTABLE 01468 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wTextureIntp_wCubeTracking_wSelectableGradients.geom", GL_GEOMETRY_SHADER_EXT ) ) { 01469 // WITHOUT SELECTABLE GRADIENT COMPUTATION OPTION 01470 #else 01471 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wTextureIntp_wCubeTracking.geom", GL_GEOMETRY_SHADER_EXT ) ) { 01472 #endif 01473 #endif 01474 #endif 01475 // WITHOUT CUBE TRACKING OPTION 01476 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITHOUT_TRACKING_CUBES 01477 // WITH GRADIENT TEXTURE 01478 #ifdef TAPs_MODEL_DEFORMABLE_USE_GRADIENT_TEXTURE 01479 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wTextureIntp_wGradTex.geom", GL_GEOMETRY_SHADER_EXT ) ) { 01480 #endif 01481 // WITHOUT GRADIENT TEXTURE 01482 #ifdef TAPs_MODEL_DEFORMABLE_NOT_USE_GRADIENT_TEXTURE 01483 // WITH SELECTABLE GRADIENT COMPUTATION OPTION 01484 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_GRADIENT_SELECTABLE 01485 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wTextureIntp_wSelectableGradients.geom", GL_GEOMETRY_SHADER_EXT ) ) { 01486 // WITHOUT SELECTABLE GRADIENT COMPUTATION OPTION 01487 #else 01488 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes_wTextureIntp.geom", GL_GEOMETRY_SHADER_EXT ) ) { 01489 #endif 01490 #endif 01491 #endif 01492 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_1X1X1_CUBES 01493 // 2X2X2 CUBES 01494 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_2X2X2_CUBES 01495 "Resource/Shader/DefModelDrawByGenMesh_2x2x2cubes.geom", GL_GEOMETRY_SHADER_EXT ) ) { 01496 #endif 01497 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITHOUT_PNTRI 01498 // WITH PN-TRIANGLES 01499 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_PNTRI 01500 "Resource/Shader/DefModelDrawByGenMeshWithPNTri.geom", GL_GEOMETRY_SHADER_EXT ) ) { 01501 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_PNTRI 01502 Clear(); 01503 return false; 01504 } 01505 //--------------------------------------------------------------- 01506 // Fragment Shader 01507 if ( !m_glslShaderManager.AttachShaderFromFile( m_glslProgramObjectWithTextureIntpValue, 01508 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITHOUT_PNTRI 01509 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_1X1X1_CUBES 01510 "Resource/Shader/DefModelDrawByGenMesh_1x1x1cubes.frag", GL_FRAGMENT_SHADER ) ) { 01511 #endif 01512 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_2X2X2_CUBES 01513 "Resource/Shader/DefModelDrawByGenMesh_2x2x2cubes.frag", GL_FRAGMENT_SHADER ) ) { 01514 #endif 01515 //#ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_4X4X4_CUBES 01516 // "Resource/Shader/DefModelDrawByGenMesh_4x4x4cubes.frag", GL_FRAGMENT_SHADER ) ) { 01517 //#endif 01518 #endif 01519 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_PNTRI 01520 "Resource/Shader/DefModelDrawByGenMeshWithPNTri.frag", GL_FRAGMENT_SHADER ) ) { 01521 #endif 01522 Clear(); 01523 return false; 01524 } 01525 //--------------------------------------------------------------- 01526 // Setup Geometry Shader for Marching Cube 01527 // Since Geometry Shader needs to specify input and output types 01528 // and the number of maximum out/emitted vertices. 01529 { 01530 GLuint progObj = m_glslProgramObjectWithTextureIntpValue->GetProgramObject(); 01531 glProgramParameteriEXT( progObj, GL_GEOMETRY_INPUT_TYPE_EXT, GL_POINTS ); 01532 glProgramParameteriEXT( progObj, GL_GEOMETRY_OUTPUT_TYPE_EXT, GL_TRIANGLE_STRIP ); 01533 // (At most 5 triangles from Marching Cube) * (PNTriangle Smoothness) 01534 // 5 * 10 (smoothness of 4 = 10 vertices per triangle) 01535 // Setting the smoothness to five (# out vertices = 5*15 = 75) seems to be too much 01536 // for 320MB 8800 GTS to handle -- i.e. too slow. 01537 // In addition, the rendered surface contains several holes. 01538 // Also setting the # out vertices to 50 (or 55 or 60), 01539 // the GLSL shader doesn't render the correct surface. 01540 // It renders a surface with several holes. 01541 // Due to this weird logic error from geometry shader, the # out vertices is set to 64. 01542 01543 // Check max number of vertices that the geometry shader can output 01544 01545 #ifdef TAPs_DEBUG_MODE 01546 GLint maxOutNumVertices; 01547 glGetIntegerv( GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT, &maxOutNumVertices ); 01548 std::cout << "The maximum number of output vertices that the graphics card's geometry shader can output is " << maxOutNumVertices << ".\n"; 01549 // GeForce 8800 GTS's GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT is 1024. 01550 #endif // #ifdef TAPs_DEBUG_MODE 01551 01552 01553 // Without PNTriangles 01554 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITHOUT_PNTRI 01555 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_1X1X1_CUBES 01556 glProgramParameteriEXT( progObj, GL_GEOMETRY_VERTICES_OUT_EXT, 16 /*15*/ ); 01557 #endif 01558 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_2X2X2_CUBES 01559 glProgramParameteriEXT( progObj, GL_GEOMETRY_VERTICES_OUT_EXT, 16*4 /*15x8*/ ); 01560 //glProgramParameteriEXT( progObj, GL_GEOMETRY_VERTICES_OUT_EXT, 256 /*15x8*/ ); 01561 #endif 01562 //#ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_4X4X4_CUBES 01563 //glProgramParameteriEXT( progObj, GL_GEOMETRY_VERTICES_OUT_EXT, 16 /*15x64*/ ); 01564 //#endif 01565 #endif 01566 01567 // With PNTriangles 01568 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_PNTRI 01569 glProgramParameteriEXT( progObj, GL_GEOMETRY_VERTICES_OUT_EXT, 64 /*(15/3)x10*/ ); 01570 #endif 01571 } 01572 //--------------------------------------------------------------- 01573 if ( !m_glslShaderManager.Link( m_glslProgramObjectWithTextureIntpValue ) ) { 01574 Clear(); 01575 return false; 01576 } 01577 //--------------------------------------------------------------- 01578 // END: m_glslProgramObjectWithTextureIntpValue 01579 //=============================================================== 01580 01581 return true; 01582 } 01583 //----------------------------------------------------------------------------- 01584 // END: SetupShadersForDrawing 01585 //============================================================================= 01586 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_RENDERING 01587 01588 01589 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 01590 //============================================================================= 01591 // Setup Shaders for Update Cube Tracking Texture 01592 //----------------------------------------------------------------------------- 01593 template <typename T> 01594 bool ModelDeformableGLSL_Visualization_RTGenMesh<T>:: 01595 SetupShadersForUpdateCubeTrackingTexture () 01596 { 01597 //--------------------------------------------------------------- 01598 if ( !m_glslShaderManager.CreateGLSLProgramObject( m_glslProgramObjectUpdateCubeTracking ) ) { 01599 Clear(); 01600 return false; 01601 } 01602 //--------------------------------------------------------------- 01603 // Fragment Shader 01604 if ( !m_glslShaderManager.AttachShaderFromFile( m_glslProgramObjectUpdateCubeTracking, 01605 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_1X1X1_CUBES 01606 "Resource/Shader/DefModelDrawByGenMesh_UpdateCubeTracking_1x1x1cubes.frag", GL_FRAGMENT_SHADER ) ) { 01607 #endif 01608 Clear(); 01609 return false; 01610 } 01611 //--------------------------------------------------------------- 01612 if ( !m_glslShaderManager.Link( m_glslProgramObjectUpdateCubeTracking ) ) { 01613 Clear(); 01614 return false; 01615 } 01616 //--------------------------------------------------------------- 01617 return true; 01618 } 01619 //----------------------------------------------------------------------------- 01620 // END: SetupShadersForUpdateCubeTrackingTexture 01621 //============================================================================= 01622 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 01623 01624 01625 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_BUFFERS 01626 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_1X1X1_CUBES 01627 #ifdef TAPs_DEFORMABLE_MODEL_VISUALIZATION_GPU_MARCHING_CUBES_SUBCUBE_BY_TWO 01628 //============================================================================= 01629 // Vertex Buffer for Rendering 01630 //----------------------------------------------------------------------------- 01631 template <typename T> 01632 bool ModelDeformableGLSL_Visualization_RTGenMesh<T>:: 01633 GenerateTheVBOForTextureCoordinates ( Vector3<int> const & vGridSize ) 01634 { 01635 std::cout << "TAPs_DEFORMABLE_MODEL_VISUALIZATION_GPU_MARCHING_CUBES_SUBCUBE_BY_TWO" << std::endl; 01636 01637 assert( m_vboVerticesAsTexCoords == 0 ); 01638 //------------------------------------------- 01639 // Reduce the grid size by one, 01640 // since needed only the # of cubes for marching cube. 01641 //------------------------------------------- 01642 // Process 1x1x1 Cubes as a group 01643 Vector3<int> newGridSize( vGridSize[0]*2, vGridSize[1]*2, vGridSize[2]*2 ); 01644 Vector3<int> v1x1x1NumBlocks( newGridSize[0]*2 - 1, newGridSize[1]*2 - 1, newGridSize[2]*2 - 1 ); 01645 m_uiTotalCubes = v1x1x1NumBlocks[0] * v1x1x1NumBlocks[1] * v1x1x1NumBlocks[2]; 01646 glGenBuffers( 1, &m_vboVerticesAsTexCoords ); 01647 if ( m_vboVerticesAsTexCoords == 0 ) return false; 01648 //----------------------------------------------------- 01649 glBindBuffer( GL_ARRAY_BUFFER, m_vboVerticesAsTexCoords ); 01650 glBufferData( GL_ARRAY_BUFFER, sizeof( GLfloat)*m_uiTotalCubes*3, NULL, GL_STATIC_DRAW ); 01651 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 01652 float * vertices = static_cast<float *>( glMapBuffer( GL_ARRAY_BUFFER, GL_WRITE_ONLY ) ); 01653 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 01654 //----------------------------------------------------- 01655 // Grid size is #ofBlocks + 1 01656 // Divided by vGridSize so that the texture coordinates is of 01657 // the first vertex (#0) of the cube 01658 Vector3<float> texCoordStep( 01659 1.0 / newGridSize[0], 1.0 / newGridSize[1], 1.0 / newGridSize[2] ); 01660 Vector3<float> minTexCoord( 01661 texCoordStep[0] / 2.0, texCoordStep[1] / 2.0, texCoordStep[2] / 2.0 ); 01662 int idx = 0; 01663 float Z = minTexCoord[2]; 01664 01665 //* 01666 //------------------------------------------- 01667 for ( int z = 0; z < v1x1x1NumBlocks[2]; ++z ) { 01668 float Y = minTexCoord[1]; 01669 for ( int y = 0; y < v1x1x1NumBlocks[1]; ++y ) { 01670 float X = minTexCoord[0]; 01671 for ( int x = 0; x < v1x1x1NumBlocks[0]; ++x ) { 01672 vertices[ idx++ ] = X; 01673 vertices[ idx++ ] = Y; 01674 vertices[ idx++ ] = Z; 01675 //std::cout << "VBO for Rendering: " 01676 // << X << ", " 01677 // << Y << ", " 01678 // << Z << "\n"; 01679 X += texCoordStep[0]; 01680 } 01681 Y += texCoordStep[1]; 01682 } 01683 Z += texCoordStep[2]; 01684 } 01685 //----------------------------------------------------- 01686 //*/ 01687 01688 /* 01689 //----------------------------------------------------- 01690 // Swizzled Walk 01691 // 01692 // +---+---+---+---+---+ 01693 // | 0 | 0 | 0 | 0 | 0 | 01694 // --+---+---+---+---+---+ 01695 // | 1 | 2 | 1 | 2 | 0 | 01696 // +---+---+---+---+---+ 01697 // | 0 | 3 | 0 | 3 | 0 | 01698 // --+---+---+---+---+---+ 01699 // | 1 | 2 | 1 | 2 | 0 | 01700 // +---+---+---+---+---+ 01701 // | 0 | 3 | 0 | 3 | 0 | 01702 // --+---+---+---+---+---+ 01703 // | | | 01704 // 01705 for ( int z = 0; z < v1x1x1NumBlocks[2]; ++z ) { 01706 float Y = minTexCoord[1]; 01707 for ( int y = 0; y < v1x1x1NumBlocks[1]; y+=2 ) { 01708 float X = minTexCoord[0]; 01709 for ( int x = 0; x < v1x1x1NumBlocks[0]; x+=2 ) { 01710 if ( x < v1x1x1NumBlocks[0]-1 && y < v1x1x1NumBlocks[1]-1 ) 01711 { 01712 T X1 = X + texCoordStep[0]; 01713 T Y1 = Y + texCoordStep[1]; 01714 // 0 01715 vertices[ idx++ ] = X; 01716 vertices[ idx++ ] = Y; 01717 vertices[ idx++ ] = Z; 01718 // 1 01719 vertices[ idx++ ] = X; 01720 vertices[ idx++ ] = Y1; 01721 vertices[ idx++ ] = Z; 01722 // 2 01723 vertices[ idx++ ] = X1; 01724 vertices[ idx++ ] = Y1; 01725 vertices[ idx++ ] = Z; 01726 // 3 01727 vertices[ idx++ ] = X1; 01728 vertices[ idx++ ] = Y; 01729 vertices[ idx++ ] = Z; 01730 } 01731 else { 01732 vertices[ idx++ ] = X; 01733 vertices[ idx++ ] = Y; 01734 vertices[ idx++ ] = Z; 01735 } 01736 X += texCoordStep[0] + texCoordStep[0]; 01737 } 01738 Y += texCoordStep[1] * texCoordStep[1]; 01739 } 01740 Z += texCoordStep[2]; 01741 } 01742 //----------------------------------------------------- 01743 //*/ 01744 01745 //----------------------------------------------------- 01746 glUnmapBuffer( GL_ARRAY_BUFFER ); 01747 glBindBuffer( GL_ARRAY_BUFFER, 0 ); 01748 //----------------------------------------------------- 01749 return true; 01750 } 01751 //----------------------------------------------------------------------------- 01752 // END: GenerateTheVBOForTextureCoordinates 01753 //============================================================================= 01754 01755 #else // TAPs_DEFORMABLE_MODEL_VISUALIZATION_GPU_MARCHING_CUBES_SUBCUBE_BY_TWO is not defined 01756 01757 //============================================================================= 01758 // Vertex Buffer for Rendering 01759 //----------------------------------------------------------------------------- 01760 template <typename T> 01761 bool ModelDeformableGLSL_Visualization_RTGenMesh<T>:: 01762 GenerateTheVBOForTextureCoordinates ( Vector3<int> const & vGridSize ) 01763 { 01764 assert( m_vboVerticesAsTexCoords == 0 ); 01765 01766 const int iNumComps = 4; 01767 //------------------------------------------- 01768 // Reduce the grid size by one, 01769 // since needed only the # of cubes for marching cube. 01770 //------------------------------------------- 01771 // Process 1x1x1 Cubes as a group 01772 Vector3<int> v1x1x1NumBlocks( 01773 vGridSize[0]-1, 01774 vGridSize[1]-1, 01775 vGridSize[2]-1 01776 ); 01777 m_uiTotalCubes = v1x1x1NumBlocks[0] * v1x1x1NumBlocks[1] * v1x1x1NumBlocks[2]; 01778 glGenBuffers( 1, &m_vboVerticesAsTexCoords ); 01779 if ( m_vboVerticesAsTexCoords == 0 ) return false; 01780 //----------------------------------------------------- 01781 glBindBuffer( GL_ARRAY_BUFFER, m_vboVerticesAsTexCoords ); 01782 glBufferData( GL_ARRAY_BUFFER, sizeof( GLfloat)*m_uiTotalCubes*iNumComps, NULL, GL_STATIC_DRAW ); 01783 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 01784 float * vertices = static_cast<float *>( glMapBuffer( GL_ARRAY_BUFFER, GL_WRITE_ONLY ) ); 01785 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 01786 //----------------------------------------------------- 01787 // Grid size is #ofBlocks + 1 01788 // Divided by vGridSize so that the texture coordinates is of 01789 // the first vertex (#0) of the cube 01790 Vector3<float> texCoordStep( 01791 1.0 / vGridSize[0], 1.0 / vGridSize[1], 1.0 / vGridSize[2] ); 01792 Vector3<float> minTexCoord( 01793 texCoordStep[0] / 2.0, texCoordStep[1] / 2.0, texCoordStep[2] / 2.0 ); 01794 int idx = 0; 01795 float Z = minTexCoord[2]; 01796 01797 //* 01798 //------------------------------------------- 01799 for ( int z = 0; z < v1x1x1NumBlocks[2]; ++z ) { 01800 float Y = minTexCoord[1]; 01801 for ( int y = 0; y < v1x1x1NumBlocks[1]; ++y ) { 01802 float X = minTexCoord[0]; 01803 for ( int x = 0; x < v1x1x1NumBlocks[0]; ++x ) { 01804 vertices[ idx++ ] = X; 01805 vertices[ idx++ ] = Y; 01806 vertices[ idx++ ] = Z; 01807 if ( iNumComps == 4 ) { 01808 if ( z > v1x1x1NumBlocks[2] / 2 ) { 01809 vertices[ idx++ ] = 0.0; 01810 } 01811 else { 01812 vertices[ idx++ ] = 1.0; 01813 } 01814 } 01815 //std::cout << "VBO for Rendering: " 01816 // << X << ", " 01817 // << Y << ", " 01818 // << Z << "\n"; 01819 X += texCoordStep[0]; 01820 } 01821 Y += texCoordStep[1]; 01822 } 01823 Z += texCoordStep[2]; 01824 } 01825 //----------------------------------------------------- 01826 //*/ 01827 01828 /* 01829 //----------------------------------------------------- 01830 // Swizzled Walk 01831 // 01832 // +---+---+---+---+---+ 01833 // | 0 | 0 | 0 | 0 | 0 | 01834 // --+---+---+---+---+---+ 01835 // | 1 | 2 | 1 | 2 | 0 | 01836 // +---+---+---+---+---+ 01837 // | 0 | 3 | 0 | 3 | 0 | 01838 // --+---+---+---+---+---+ 01839 // | 1 | 2 | 1 | 2 | 0 | 01840 // +---+---+---+---+---+ 01841 // | 0 | 3 | 0 | 3 | 0 | 01842 // --+---+---+---+---+---+ 01843 // | | | 01844 // 01845 for ( int z = 0; z < v1x1x1NumBlocks[2]; ++z ) { 01846 float Y = minTexCoord[1]; 01847 for ( int y = 0; y < v1x1x1NumBlocks[1]; y+=2 ) { 01848 float X = minTexCoord[0]; 01849 for ( int x = 0; x < v1x1x1NumBlocks[0]; x+=2 ) { 01850 if ( x < v1x1x1NumBlocks[0]-1 && y < v1x1x1NumBlocks[1]-1 ) 01851 { 01852 T X1 = X + texCoordStep[0]; 01853 T Y1 = Y + texCoordStep[1]; 01854 // 0 01855 vertices[ idx++ ] = X; 01856 vertices[ idx++ ] = Y; 01857 vertices[ idx++ ] = Z; 01858 // 1 01859 vertices[ idx++ ] = X; 01860 vertices[ idx++ ] = Y1; 01861 vertices[ idx++ ] = Z; 01862 // 2 01863 vertices[ idx++ ] = X1; 01864 vertices[ idx++ ] = Y1; 01865 vertices[ idx++ ] = Z; 01866 // 3 01867 vertices[ idx++ ] = X1; 01868 vertices[ idx++ ] = Y; 01869 vertices[ idx++ ] = Z; 01870 } 01871 else { 01872 vertices[ idx++ ] = X; 01873 vertices[ idx++ ] = Y; 01874 vertices[ idx++ ] = Z; 01875 } 01876 X += texCoordStep[0] * texCoordStep[0]; 01877 } 01878 Y += texCoordStep[1] * texCoordStep[1]; 01879 } 01880 Z += texCoordStep[2]; 01881 } 01882 //----------------------------------------------------- 01883 //*/ 01884 01885 glUnmapBuffer( GL_ARRAY_BUFFER ); 01886 glBindBuffer( GL_ARRAY_BUFFER, 0 ); 01887 //----------------------------------------------------- 01888 return true; 01889 } 01890 //----------------------------------------------------------------------------- 01891 // END: GenerateTheVBOForTextureCoordinates 01892 //============================================================================= 01893 #endif // TAPs_DEFORMABLE_MODEL_VISUALIZATION_GPU_MARCHING_CUBES_SUBCUBE_BY_TWO 01894 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_1X1X1_CUBES 01895 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_BUFFERS 01896 01897 01898 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_BUFFERS 01899 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_1X1X1_CUBES 01900 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 01901 //============================================================================= 01902 // Vertex Buffer for Cube Tracking 01903 //----------------------------------------------------------------------------- 01904 template <typename T> 01905 bool ModelDeformableGLSL_Visualization_RTGenMesh<T>:: 01906 GenerateTheVBOForTexCoordForCubeTracking ( Vector3<int> const & vGridSize ) 01907 { 01908 assert( m_vboTexCoordForCubeTracking == 0 ); 01909 //------------------------------------------- 01910 // Reduce the grid size by one, 01911 // since needed only the # of cubes for marching cube. 01912 //------------------------------------------- 01913 // Process 1x1x1 Cubes as a group 01914 Vector3<int> v1x1x1NumBlocks( 01915 vGridSize[0]-1, 01916 vGridSize[1]-1, 01917 vGridSize[2]-1 01918 ); 01919 m_uiTotalCubes = v1x1x1NumBlocks[0] * v1x1x1NumBlocks[1] * v1x1x1NumBlocks[2]; 01920 glGenBuffers( 1, &m_vboTexCoordForCubeTracking ); 01921 if ( m_vboTexCoordForCubeTracking == 0 ) return false; 01922 //----------------------------------------------------- 01923 glBindBuffer( GL_ARRAY_BUFFER, m_vboTexCoordForCubeTracking ); 01924 glBufferData( GL_ARRAY_BUFFER, sizeof( GLfloat)*m_uiTotalCubes*3, NULL, GL_STATIC_DRAW ); 01925 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 01926 float * vertices = static_cast<float *>( glMapBuffer( GL_ARRAY_BUFFER, GL_WRITE_ONLY ) ); 01927 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 01928 //----------------------------------------------------- 01929 // Grid size is #ofBlocks + 1 01930 // Divided by vGridSize so that the texture coordinates is of 01931 // the first vertex (#0) of the cube 01932 Vector3<float> texCoordStep( 01933 1.0 / v1x1x1NumBlocks[0], 1.0 / v1x1x1NumBlocks[1], 1.0 / v1x1x1NumBlocks[2] ); 01934 Vector3<float> minTexCoord( 01935 texCoordStep[0] / 2.0, texCoordStep[1] / 2.0, texCoordStep[2] / 2.0 ); 01936 int idx = 0; 01937 float Z = minTexCoord[2]; 01938 //------------------------------------------- 01939 for ( int z = 0; z < v1x1x1NumBlocks[2]; ++z ) { 01940 float Y = minTexCoord[1]; 01941 for ( int y = 0; y < v1x1x1NumBlocks[1]; ++y ) { 01942 float X = minTexCoord[0]; 01943 for ( int x = 0; x < v1x1x1NumBlocks[0]; ++x ) { 01944 vertices[ idx++ ] = X; 01945 vertices[ idx++ ] = Y; 01946 vertices[ idx++ ] = Z; 01947 /*/ 01948 std::cout << "VBO for Rendering: " 01949 << X << ", " 01950 << Y << ", " 01951 << Z << "\n"; 01952 //*/ 01953 X += texCoordStep[0]; 01954 } 01955 Y += texCoordStep[1]; 01956 } 01957 Z += texCoordStep[2]; 01958 } 01959 //----------------------------------------------------- 01960 glUnmapBuffer( GL_ARRAY_BUFFER ); 01961 glBindBuffer( GL_ARRAY_BUFFER, 0 ); 01962 //----------------------------------------------------- 01963 return true; 01964 } 01965 //----------------------------------------------------------------------------- 01966 // END: GenerateTheVBOForTexCoordForCubeTracking 01967 //============================================================================= 01968 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 01969 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_1X1X1_CUBES 01970 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_BUFFERS 01971 01972 01973 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_BUFFERS 01974 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_2X2X2_CUBES 01975 //============================================================================= 01976 // Vertex Buffer for Rendering 01977 //----------------------------------------------------------------------------- 01978 template <typename T> 01979 bool ModelDeformableGLSL_Visualization_RTGenMesh<T>:: 01980 GenerateTheVBOForTextureCoordinates ( Vector3<int> const & vGridSize ) 01981 { 01982 assert( m_vboVerticesAsTexCoords == 0 ); 01983 //------------------------------------------- 01984 // Reduce the grid size by one, 01985 // since needed only the # of cubes for marching cube. 01986 // Process 2x2x2 Cubes as a group 01987 Vector3<int> v2x2x2NumBlocks( 01988 ceil( (vGridSize[0]-1)/2.0 ), 01989 ceil( (vGridSize[1]-1)/2.0 ), 01990 ceil( (vGridSize[2]-1)/2.0 ) 01991 ); 01992 01993 //wxLogError( wxT("#Blocks: %i %i %i"), v2x2x2NumBlocks[0], v2x2x2NumBlocks[1], v2x2x2NumBlocks[2] ); 01994 01995 m_uiTotalCubes = v2x2x2NumBlocks[0] * v2x2x2NumBlocks[1] * v2x2x2NumBlocks[2]; 01996 glGenBuffers( 1, &m_vboVerticesAsTexCoords ); 01997 if ( m_vboVerticesAsTexCoords == 0 ) return false; 01998 //----------------------------------------------------- 01999 glBindBuffer( GL_ARRAY_BUFFER, m_vboVerticesAsTexCoords ); 02000 glBufferData( GL_ARRAY_BUFFER, sizeof( GLfloat)*m_uiTotalCubes*3, NULL, GL_STATIC_DRAW ); 02001 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02002 float * vertices = static_cast<float *>( glMapBuffer( GL_ARRAY_BUFFER, GL_WRITE_ONLY ) ); 02003 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02004 //----------------------------------------------------- 02005 // Grid size is #ofBlocks + 1 02006 // Divided by (v2x2x2NumBlocks[0]+1) so that the texture coordinates is of 02007 // the first vertex (#0) of the cube 02008 02009 // The texture is from 0 to 1 (0 - gridsize) 02010 Vector3<float> texCoordStep( 02011 2.0 / vGridSize[0], 2.0 / vGridSize[1], 2.0 / vGridSize[2] ); 02012 Vector3<float> minTexCoord( 02013 0.5 / vGridSize[0], 0.5 / vGridSize[1], 0.5 / vGridSize[2] ); 02014 int idx = 0; 02015 float Z = minTexCoord[2]; 02016 //------------------------------------------- 02017 // Reduce the grid size by one, 02018 // since needed only the # of cubes for marching cube. 02019 for ( int z = 0; z < v2x2x2NumBlocks[2]; ++z ) { 02020 float Y = minTexCoord[1]; 02021 for ( int y = 0; y < v2x2x2NumBlocks[1]; ++y ) { 02022 float X = minTexCoord[0]; 02023 for ( int x = 0; x < v2x2x2NumBlocks[0]; ++x ) { 02024 vertices[ idx++ ] = X; 02025 vertices[ idx++ ] = Y; 02026 vertices[ idx++ ] = Z; 02027 /*/ 02028 std::cout << "VBO for Rendering: " 02029 << X << ", " 02030 << Y << ", " 02031 << Z << "\n"; 02032 //*/ 02033 X += texCoordStep[0]; 02034 } 02035 Y += texCoordStep[1]; 02036 } 02037 Z += texCoordStep[2]; 02038 } 02039 //----------------------------------------------------- 02040 glUnmapBuffer( GL_ARRAY_BUFFER ); 02041 glBindBuffer( GL_ARRAY_BUFFER, 0 ); 02042 //----------------------------------------------------- 02043 return true; 02044 } 02045 //----------------------------------------------------------------------------- 02046 // END: GenerateTheVBOForTextureCoordinates 02047 //============================================================================= 02048 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_2X2X2_CUBES 02049 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_BUFFERS 02050 02051 02052 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_RENDERING 02053 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 02054 //***************************************************************************** 02055 // BEGIN: GenerateBufferObjects 02056 //----------------------------------------------------------------------------- 02057 template <typename T> 02058 bool ModelDeformableGLSL_Visualization_RTGenMesh<T>::GenerateBufferObjects () 02059 { 02060 //=============================================================== 02061 // Framebuffer Object(s) 02062 //--------------------------------------------------------------- 02063 //----------------------- 02064 // For Cube Tracking 02065 //----------------------- 02066 glGenFramebuffersEXT( 1, &m_glslFBO_CubeTracking ); 02067 glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, m_glslFBO_CubeTracking ); 02068 glFramebufferTexture3DEXT( 02069 GL_FRAMEBUFFER_EXT, // target 02070 GL_COLOR_ATTACHMENT0_EXT, // attached frame 02071 GL_TEXTURE_3D, // texture target 02072 CubeTrackingTexture, // texture id 02073 0, // level 02074 0 // zoffset (for 3D texture) 02075 ); 02076 //glDrawBuffer( GL_COLOR_ATTACHMENT0_EXT ); 02077 TAPs::OpenGL::Fn::CHECK_FRAMEBUFFER_STATUS(); 02078 glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 ); 02079 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02080 //----------------------- 02081 //--------------------------------------------------------------- 02082 //=============================================================== 02083 return true; 02084 } 02085 //----------------------------------------------------------------------------- 02086 // END: GenerateBufferObjects 02087 //***************************************************************************** 02088 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 02089 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_RENDERING 02090 02091 02092 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_RENDERING 02093 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_1X1X1_CUBES 02094 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 02095 //***************************************************************************** 02096 // BEGIN: UpdateCubeTrackingTexture 02097 //----------------------------------------------------------------------------- 02098 template <typename T> 02099 void ModelDeformableGLSL_Visualization_RTGenMesh<T>::UpdateCubeTrackingTexture () 02100 { 02106 //--------------------------------------------------------------- 02107 #ifdef TAPs_DEBUG_MODE 02108 if ( !m_SimDomain ) return; 02109 //--------------------------------------------------------------- 02110 if ( !m_SimDomain->RetObject3DTexturePosition() ) return; 02111 //--------------------------------------------------------------- 02112 #endif 02113 02114 //UpdateCollisionDetectionParameters(); 02115 //--------------------------------------------------------------- 02116 //=============================================================== 02117 // Get 3D texture for positions 02118 //--------------------------------------------------------------- 02119 Texture * texture3DPosition = m_SimDomain->RetObject3DTexturePosition(); 02120 //--------------------------------------------------------------- 02121 //=============================================================== 02122 texture3DPosition->EnableTextureTarget(); 02123 m_glslProgramObjectUpdateCubeTracking->BeginGLSL(); 02124 glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, m_glslFBO_CubeTracking ); 02125 TAPs::OpenGL::Fn::CHECK_FRAMEBUFFER_STATUS(); 02126 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02127 glPushAttrib( GL_ALL_ATTRIB_BITS ); 02128 { 02129 //------------------------------------------------- 02130 // Send Stream of Data (one 2D texture at a time in a for loop) 02131 glMatrixMode( GL_PROJECTION ); 02132 glPushMatrix(); 02133 glLoadIdentity(); 02134 // 02135 Vector3<T> offsetCoords = m_SimDomain->GetTexCoordOffsetForPosition(); 02136 T offsetRCoord = offsetCoords[2] / 2.0; 02137 T maxCoordS = 1.0 - offsetCoords[0]; 02138 T maxCoordT = 1.0 - offsetCoords[1]; 02139 // 02140 // Set texture coordinates -- xMin, xMax, yMin and yMax 02141 // In this case, they are 0, 1, 0, and 1. 02142 //gluOrtho2D( 0, texture3DPosition->GetMaxCoordS(), 02143 // 0, texture3DPosition->GetMaxCoordT() ); 02144 gluOrtho2D( 0, maxCoordS, 0, maxCoordT ); 02145 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02146 // 02147 glMatrixMode( GL_MODELVIEW ); 02148 glPushMatrix(); 02149 glLoadIdentity(); 02150 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02151 // 02152 // Generate pixels -- xMin, xMax, yMin, and yMax 02153 // One less due to the cube size. 02154 glViewport( 0, 0, texture3DPosition->GetWidth()-1, 02155 texture3DPosition->GetHeight()-1 ); 02156 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02157 // 02158 //================================================= 02159 //------------------------------------------------- 02160 // Uniform Variables 02161 //------------------------------------------------- 02162 // Threshold 02163 m_glslProgramObjectUpdateCubeTracking->SetUniform1f( "threshold", m_SimDomain->IC_Thresholds::ON_BOUNDARY ); 02164 //--------------------------------- 02165 // Coordinate Offsets 02166 m_glslProgramObjectUpdateCubeTracking->SetUniform3f( 02167 "offsetCoordsPosition", 02168 offsetCoords[0], offsetCoords[1], offsetCoords[2] 02169 ); 02170 //------------------------------------------------- 02171 texture3DPosition->EnableTextureTarget(); 02172 //------------------------------------------------- 02173 // Set PositionTexture to Texture Unit 0 02174 glActiveTexture( GL_TEXTURE0 ); 02175 texture3DPosition->BindTexture(0); 02176 m_glslProgramObjectUpdateCubeTracking->SetUniform1i( "PositionTexture", 0 ); 02177 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02178 //------------------------------------------------- 02179 //================================================= 02180 // The size is m_vGridResolution[2]-1, due to the cube size is one less. 02181 for ( int i = 0; i < texture3DPosition->GetDepth()-1; ++i ) { 02182 //------------------------------------------------- 02183 glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, m_glslFBO_CubeTracking ); 02184 glFramebufferTexture3DEXT( 02185 GL_FRAMEBUFFER_EXT, // target 02186 GL_COLOR_ATTACHMENT0_EXT, // attached frame 02187 GL_TEXTURE_3D, // texture target 02188 CubeTrackingTexture, // texture id -- next position 02189 0, // level 02190 i // zoffset 02191 ); 02192 glDrawBuffer( GL_COLOR_ATTACHMENT0_EXT ); 02193 02194 // CURRENTLY 02195 // The GLSL's texture3D( isampler3D sampler, vec3 coords ) 02196 // doesn't return the correct value for integer 02197 // The GLSL's texture3D( usampler3D sampler, vec3 coords ) 02198 // doesn't return the correct value for unsinged integer 02199 // So GL_ALPHA8 is used instead! 02200 // So glBindFragDataLocationEXT is not used! 02201 // CURRENTLY 02202 // GL_ALPHA8 DOESN'T WORK EITHER SO BACK TO GL_ALPHA16UI_EXT 02203 // So use the below statement for writing to integer texture 02204 02205 // New fn for writing unsigned int from fragment shader to GL_COLOR_ATTACHMENT location 02206 //void BindFragDataLocationEXT(uint program, uint colorNumber, const char *name); 02207 glBindFragDataLocationEXT( m_glslProgramObjectUpdateCubeTracking->GetProgramObject(), 0, "fragData0" ); 02208 02209 TAPs::OpenGL::Fn::CHECK_FRAMEBUFFER_STATUS(); 02210 //------------------------------------------------- 02211 // Send data stream to GPU 02212 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02213 // 02214 glClearColor( 0, 0, 0, 0 ); 02215 //glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); 02216 glClear( GL_COLOR_BUFFER_BIT ); 02217 // 02218 T coordR = offsetCoords[2]*i + offsetRCoord; 02219 glPolygonMode( GL_FRONT, GL_FILL ); 02220 glBegin( GL_QUADS ); 02221 glTexCoord3f( 0, 0, coordR ); 02222 glVertex3f ( 0, 0, 0 ); 02223 glTexCoord3f( maxCoordS, 0, coordR ); 02224 glVertex3f ( maxCoordS, 0, 0 ); 02225 glTexCoord3f( maxCoordS, maxCoordT, coordR ); 02226 glVertex3f ( maxCoordS, maxCoordT, 0 ); 02227 glTexCoord3f( 0, maxCoordT, coordR ); 02228 glVertex3f ( 0, maxCoordT, 0 ); 02229 glEnd(); 02230 } 02231 glPopMatrix(); 02232 glMatrixMode( GL_PROJECTION ); 02233 glPopMatrix(); 02234 glMatrixMode( GL_MODELVIEW ); 02235 } 02236 glPopAttrib(); 02237 texture3DPosition->DisableTextureTarget(); 02238 texture3DPosition->UnbindTexture(); 02239 glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 ); 02240 // 02241 m_glslProgramObjectUpdateCubeTracking->EndGLSL(); 02242 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02243 //--------------------------------------------------------------- 02244 02245 02246 /* 02247 // DEBUG 02248 { 02249 Vector3<int> vCubes( 02250 texture3DPosition->GetWidth()-1, 02251 texture3DPosition->GetHeight()-1, 02252 texture3DPosition->GetDepth()-1 02253 ); 02254 int iTotalCubes = vCubes[0] * vCubes[1] * vCubes[2]; 02255 //GLubyte * pCubeValData = new GLubyte[ iTotalCubes * 2 ]; // there's one more read element per row! Why? How to fix it? 02256 GLint * pCubeValData = new GLint[ iTotalCubes ]; 02257 glBindBuffer( GL_PIXEL_PACK_BUFFER, 0 ); 02258 glBindTexture( GL_TEXTURE_3D, CubeTrackingTexture ); 02259 02260 // CURRENTLY, GL_ALPHA8UI_EXT is not working correctly. 02261 // Due to bugs with unsigned int in geometry shader compiler/driver. 02262 // So GL_ALPHA16I_EXT is used instead! 02263 //glGetTexImage( GL_TEXTURE_3D, 0, GL_ALPHA_INTEGER_EXT, GL_UNSIGNED_INT, pCubeValData ); 02264 //glGetTexImage( GL_TEXTURE_3D, 0, GL_ALPHA_INTEGER_EXT, GL_INT, pCubeValData ); 02265 // CURRENTLY 02266 // The GLSL's texture3D( isampler3D sampler, vec3 coords ) 02267 // doesn't return the correct value for integer 02268 // The GLSL's texture3D( usampler3D sampler, vec3 coords ) 02269 // doesn't return the correct value for unsinged integer 02270 // So GL_ALPHA8 is used instead! 02271 //glGetTexImage( GL_TEXTURE_3D, 0, GL_ALPHA, GL_UNSIGNED_BYTE, pCubeValData ); 02272 // CURRENTLY 02273 // GL_ALPHA8 DOESN'T WORK EITHER SO BACK TO GL_ALPHA16UI_EXT 02274 glGetTexImage( GL_TEXTURE_3D, 0, GL_ALPHA_INTEGER_EXT, GL_INT, pCubeValData ); 02275 02276 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02277 std::cout << "-------------------------------\n"; 02278 std::cout << "Cube Tracking Texture -- UPDATE\n"; 02279 std::cout << "-------------------------------\n"; 02280 int i = 0; 02281 for ( int z = 0; z < vCubes[2]; ++z ) { 02282 for ( int y = 0; y < vCubes[1]; ++y ) { 02283 for ( int x = 0; x < vCubes[0]; ++x ) { 02284 std::cout << " "; 02285 if ( pCubeValData[i] < 100 ) std::cout << " "; 02286 if ( pCubeValData[i] < 10 ) std::cout << " "; 02287 std::cout << static_cast<int>( pCubeValData[i] ); 02288 ++i; 02289 } 02290 std::cout << "\n"; 02291 } 02292 std::cout << "\n"; 02293 } 02294 std::cout << "---------------------\n"; 02295 //--------------------------------- 02296 glDisable( GL_TEXTURE_3D ); 02297 glBindTexture( GL_TEXTURE_3D, 0 ); 02298 //----------------------------------------------------- 02299 delete [] pCubeValData; 02300 } 02301 //*/ 02302 02303 02304 /* 02305 //=============================================================== 02306 // Get 3D texture for positions 02307 //--------------------------------------------------------------- 02308 Texture * texture3DPosition = m_SimDomain->RetObject3DTexturePosition(); 02309 //--------------------------------------------------------------- 02310 //=============================================================== 02311 // 02312 //--------------------------------------------------------------- 02313 glPushAttrib( GL_ALL_ATTRIB_BITS ); 02314 //----------------------------------------------------- 02315 //----------------------------------------------------- 02316 m_glslProgramObjectUpdateCubeTracking->BeginGLSL(); 02317 //----------------------------------------------------- 02318 02319 //+++++++++++++++++++++++++++++++++++++++++++ 02320 //=========================================== 02321 // START: Parameter Setup 02322 //------------------------------------------- 02323 // Texture Parameter Setup 02324 //--------------------------------- 02325 // Set PositionTexture to Texture Unit 0 02326 texture3DPosition->EnableTextureTarget(); 02327 glActiveTexture( GL_TEXTURE0 ); 02328 texture3DPosition->BindTexture(0); 02329 m_glslProgramObjectUpdateCubeTracking->SetUniform1i( "PositionTexture", 0 ); 02330 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02331 //--------------------------------- 02332 // Threshold Value 02333 m_glslProgramObjectUpdateCubeTracking->SetUniform1f( "threshold", m_SimDomain->IC_Thresholds::ON_BOUNDARY ); 02334 //--------------------------------- 02335 // Coordinate Offsets 02336 Vector3<T> coordOffsets = m_SimDomain->GetTexCoordOffsetForPosition(); 02337 m_glslProgramObjectUpdateCubeTracking->SetUniform3f( 02338 "offsetCoordsPosition", 02339 coordOffsets[0], coordOffsets[1], coordOffsets[2] 02340 ); 02341 //------------------------------------------- 02342 // END: Parameter Setup 02343 //=========================================== 02344 //+++++++++++++++++++++++++++++++++++++++++++ 02345 02346 //----------------------------------------------------- 02347 // Bind the buffer and then draw 02348 glBindBuffer( GL_ARRAY_BUFFER, m_vboVerticesAsTexCoords ); 02349 glVertexPointer( 3, GL_FLOAT, 0, (GLubyte *)((char *)NULL + (0)) ); 02350 glEnableClientState( GL_VERTEX_ARRAY ); 02351 glDrawArrays( GL_POINTS, 0, m_uiTotalCubes ); 02352 glDisableClientState( GL_VERTEX_ARRAY ); 02353 glBindBuffer( GL_ARRAY_BUFFER, 0 ); 02354 //----------------------------------------------------- 02355 m_glslProgramObjectUpdateCubeTracking->EndGLSL(); 02356 //----------------------------------------------------- 02357 texture3DPosition->DisableTextureTarget(); 02358 texture3DPosition->UnbindTexture(); 02359 //----------------------------------------------------- 02360 glPopAttrib(); 02361 //--------------------------------------------------------------- 02362 //=============================================================== 02363 //*/ 02364 } 02365 //----------------------------------------------------------------------------- 02366 // END: UpdateCubeTrackingTexture 02367 //***************************************************************************** 02368 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 02369 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_1X1X1_CUBES 02370 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_RENDERING 02371 02372 02373 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_RENDERING 02374 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_BUFFERS 02375 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_1X1X1_CUBES 02376 //***************************************************************************** 02377 // BEGIN: DrawByGLSL 02378 //----------------------------------------------------------------------------- 02379 template <typename T> 02380 void ModelDeformableGLSL_Visualization_RTGenMesh<T>::DrawByGLSL () 02381 { 02392 //--------------------------------------------------------------- 02393 #ifdef TAPs_DEBUG_MODE 02394 if ( !m_SimDomain ) return; 02395 //--------------------------------------------------------------- 02396 if ( !m_SimDomain->RetObject3DTexturePosition() ) return; 02397 //--------------------------------------------------------------- 02398 #endif 02399 //* 02400 //=============================================================== 02401 // Get 3D texture for positions 02402 //--------------------------------------------------------------- 02403 Texture * texture3DPosition = m_SimDomain->RetObject3DTexturePosition(); 02404 //GLfloat modelviewMatrix[16]; 02405 //glGetFloatv( GL_MODELVIEW_MATRIX, modelviewMatrix ); 02406 //--------------------------------------------------------------- 02407 //=============================================================== 02408 // Draw the deformable model 02409 //--------------------------------------------------------------- 02410 glPushAttrib( GL_ALL_ATTRIB_BITS ); 02411 //----------------------------------------------------- 02412 glColor3ub( 80, 80, 80 ); 02413 //glEnable( GL_COLOR_MATERIAL ); 02414 glEnable( GL_LIGHTING ); 02415 glEnable( GL_BLEND ); 02416 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); 02417 glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND ); 02418 glEnable( GL_TEXTURE_3D ); 02419 //glEnable( GL_CULL_FACE ); // Doesn't really make the drawing run faster! 02420 //glShadeModel( GL_SMOOTH ); 02421 //glShadeModel( GL_FLAT ); 02422 //----------------------------------------------------- 02423 //texture3DPosition->EnableTextureTarget(); 02424 //glActiveTexture( GL_TEXTURE0 ); 02425 //texture3DPosition->BindTexture(0); 02426 //----------------------------------------------------- 02427 GLSLProgramObject * pShader = NULL; 02428 if ( m_bUseGlobalInterpolationVal ) { 02429 pShader = m_glslProgramObjectWithGlobalIntpValue; 02430 } 02431 else { 02432 pShader = m_glslProgramObjectWithTextureIntpValue; 02433 } 02434 pShader->BeginGLSL(); 02435 //----------------------------------------------------- 02436 02437 //+++++++++++++++++++++++++++++++++++++++++++ 02438 //=========================================== 02439 // START: Parameter Setup 02440 //------------------------------------------- 02441 // Texture Parameter Setup 02442 // Set Surface 3D Texture to Texture Unit 0 02443 //glEnable( GL_BLEND ); 02444 if ( m_3DTexture ) { 02445 glActiveTexture( GL_TEXTURE0 ); 02446 glBindTexture( GL_TEXTURE_3D, m_3DTexture ); 02447 pShader->SetUniform1i( "SurfaceTexture", 0 ); 02448 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02449 } 02450 //--------------------------------- 02451 // Set PositionTexture to Texture Unit 1 02452 texture3DPosition->EnableTextureTarget(); 02453 glActiveTexture( GL_TEXTURE1 ); 02454 texture3DPosition->BindTexture(0); 02455 pShader->SetUniform1i( "PositionTexture", 1 ); 02456 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02457 //--------------------------------- 02458 // Set Edge Table to Texture Unit 2 02459 glEnable( GL_TEXTURE_2D ); 02460 glActiveTexture( GL_TEXTURE2 ); 02461 glBindTexture( GL_TEXTURE_2D, EdgeTableTexture ); 02462 pShader->SetUniform1i( "EdgeTableTexture", 2 ); 02463 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02464 //--------------------------------- 02465 // Set Triangle Table to Texture Unit 3 02466 //glEnable( GL_TEXTURE_2D ); 02467 glActiveTexture( GL_TEXTURE3 ); 02468 glBindTexture( GL_TEXTURE_2D, TriTableTexture ); 02469 pShader->SetUniform1i( "TriTableTexture", 3 ); 02470 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02471 //--------------------------------- 02472 // A Combined Texture for Triangle and Edge Tables 02473 // Set Triangle and Edge Tables to Texture Unit 2 02474 //glEnable( GL_TEXTURE_2D ); 02475 //glActiveTexture( GL_TEXTURE2 ); 02476 //glBindTexture( GL_TEXTURE_2D, TriAndEdgeTableTexture ); 02477 //m_glslProgramObject->SetUniform1i( "TriAndEdgeTableTexture", 2 ); 02478 //TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02479 //------------------------------------------------------------------------- 02480 02481 // WITH GRADIENT TEXTURE 02482 #ifdef TAPs_MODEL_DEFORMABLE_USE_GRADIENT_TEXTURE 02483 //--------------------------------- 02484 // Set Gradient to Texture Unit 6 02485 glActiveTexture( GL_TEXTURE6 ); 02486 glBindTexture( GL_TEXTURE_3D, m_SimDomain->Get3DTextureGradient() ); 02487 pShader->SetUniform1i( "Gradient", 6 ); 02488 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02489 //--------------------------------- 02490 #endif // TAPs_MODEL_DEFORMABLE_USE_GRADIENT_TEXTURE 02491 02492 //int maximum; 02493 //glGetIntegerv( GL_MAX_TEXTURE_COORDS, &maximum ); 02494 //std::cout << "GL_MAX_TEXTURE_COORDS: " << maximum << "\n"; 02495 //glGetIntegerv( GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maximum ); 02496 //std::cout << "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: " << maximum << "\n"; 02497 02498 //========================================================================= 02499 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 02500 //------------------------------------------------------------------------- 02501 // Can't set to Texture Unit 0, 1, 2, or 3 -- they are in used 02502 // If set to Texture Unit 0 (1, 2, or 3), the surface will not be drawn. 02503 // Set Cube Tracking Texture to Texture Unit 4 02504 //glEnable( GL_TEXTURE_3D ); 02505 glActiveTexture( GL_TEXTURE4 ); 02506 glBindTexture( GL_TEXTURE_3D, CubeTrackingTexture ); 02507 02508 //m_glslProgramObject->SetUniform1ui( "CubeTrackingTexture", 4 ); 02509 // CURRENTLY, GL_ALPHA8UI_EXT is not working correctly. 02510 // Due to bugs with unsigned int in geometry shader compiler/driver. 02511 // So GL_ALPHA16I_EXT is used instead! 02512 //m_glslProgramObject->SetUniform1i( "CubeTrackingTexture", 4 ); 02513 // CURRENTLY 02514 // The GLSL's texture3D( isampler3D sampler, vec3 coords ) 02515 // doesn't return the correct value for integer 02516 // The GLSL's texture3D( usampler3D sampler, vec3 coords ) 02517 // doesn't return the correct value for unsinged integer 02518 // So GL_ALPHA8 is used instead! 02519 pShader->SetUniform1i( "CubeTrackingTexture", 4 ); 02520 //------------------------------------------------------------------------- 02521 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 02522 //========================================================================= 02523 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02524 02525 //--------------------------------- 02526 // Selectable Gradient Computations 02527 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_GRADIENT_SELECTABLE 02528 pShader->SetUniform1i( "bGradFaces", m_bComputeGradientFaces ); 02529 pShader->SetUniform1i( "bGradVertices", m_bComputeGradientVertices ); 02530 pShader->SetUniform1i( "bGradEdges", m_bComputeGradientEdges ); 02531 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_GRADIENT_SELECTABLE 02532 02533 //--------------------------------- 02534 // Interpolation Value 02535 // use global value 02536 if ( m_bUseGlobalInterpolationVal ) { 02537 pShader->SetUniform1f( "interpolationValue", m_tGlobalInterpolationVal ); 02538 } 02539 // use values store in texture 02540 else { 02541 glActiveTexture( GL_TEXTURE5 ); 02542 glBindTexture( GL_TEXTURE_3D, m_SimDomain->Get3DTextureEllipsoidInfluence() ); 02543 pShader->SetUniform1i( "IntpValTexture", 5 ); 02544 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02545 } 02546 02547 //--------------------------------- 02548 // Threshold Value 02549 pShader->SetUniform1f( "threshold", m_SimDomain->IC_Thresholds::ON_BOUNDARY ); 02550 //--------------------------------- 02551 // Threshold Value 02552 // For NVIDIA 320MB 8800 GTS, the smoothness should be at most 4. 02553 // The smotthness cannot be less than 2, due to the essential nature of PNTriangle algorithm. 02554 // Therefore, the smoothness must be between 2 (no PNTriangle, i.e. original triangle) to 4. 02555 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_PNTRI 02556 int Smoothness = static_cast<int>( m_PNTriangleSmoothness ); 02557 if ( Smoothness < 2 ) Smoothness = 2; 02558 else if ( Smoothness > 4 ) Smoothness = 4; 02559 //std::cout << "Smoothness: " << Smoothness << std::endl; 02560 m_glslProgramObject->SetUniform1i( "Smoothness", Smoothness ); 02561 #endif // #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_PNTRI 02562 //--------------------------------- 02563 // Coordinate Offsets 02564 Vector3<T> coordOffsets = m_SimDomain->GetTexCoordOffsetForPosition(); 02565 pShader->SetUniform3f( 02566 "offsetCoordsPosition", 02567 #ifdef TAPs_DEFORMABLE_MODEL_VISUALIZATION_GPU_MARCHING_CUBES_SUBCUBE_BY_TWO 02568 coordOffsets[0]*0.5, coordOffsets[1]*0.5, coordOffsets[2]*0.5 02569 #else 02570 coordOffsets[0], coordOffsets[1], coordOffsets[2] 02571 #endif // TAPs_DEFORMABLE_MODEL_VISUALIZATION_GPU_MARCHING_CUBES_SUBCUBE_BY_TWO 02572 ); 02573 //------------------------------------------- 02574 // END: Parameter Setup 02575 //=========================================== 02576 //+++++++++++++++++++++++++++++++++++++++++++ 02577 02578 glPushClientAttrib( GL_CLIENT_VERTEX_ARRAY_BIT ); 02579 //----------------------------------------------------- 02580 02581 glEnableClientState( GL_VERTEX_ARRAY ); 02582 02583 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 02584 glEnableClientState( GL_TEXTURE_COORD_ARRAY ); 02585 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 02586 02587 //------------------------------------------- 02588 // Bind the buffer for vertices as texture coordinate for vertex positions 02589 glBindBuffer( GL_ARRAY_BUFFER, m_vboVerticesAsTexCoords ); 02590 //glVertexPointer( 3, GL_FLOAT, 0, (GLubyte *)((char *)NULL + (0)) ); 02591 glVertexPointer( 4, GL_FLOAT, 0, (GLubyte *)((char *)NULL + (0)) ); 02592 02593 //------------------------------------------- 02594 // Bind the buffer for vertices as texture coordinate for vertex positions 02595 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 02596 glBindBuffer( GL_ARRAY_BUFFER, m_vboTexCoordForCubeTracking ); 02597 glTexCoordPointer( 3, GL_FLOAT, 0, (GLubyte *)((char *)NULL + (0)) ); 02598 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 02599 02600 //------------------------------------------- 02601 // Draw 02602 //glBeginTransformFeedbackNV( GL_TRIANGLES ); 02603 glDrawArrays( GL_POINTS, 0, m_uiTotalCubes ); 02604 //glEndTransformFeedbackNV(); 02605 02606 glBindBuffer( GL_ARRAY_BUFFER, 0 ); 02607 glDisableClientState( GL_VERTEX_ARRAY ); 02608 //----------------------------------------------------- 02609 glPopClientAttrib(); 02610 02611 //----------------------------------------------------- 02612 pShader->EndGLSL(); 02613 //----------------------------------------------------- 02614 texture3DPosition->DisableTextureTarget(); 02615 texture3DPosition->UnbindTexture(); 02616 //----------------------------------------------------- 02617 glPopAttrib(); 02618 //--------------------------------------------------------------- 02619 //=============================================================== 02620 //*/ 02621 02622 /* 02623 //========================================================================= 02624 // TEST DRAWING 02625 glPushAttrib( GL_ALL_ATTRIB_BITS ); 02626 glColor3ub( 175, 80, 80 ); 02627 glEnable( GL_COLOR_MATERIAL ); 02628 glDisable( GL_LIGHTING ); 02629 glPointSize( 5 ); 02630 glBindBuffer( GL_ARRAY_BUFFER, m_vboVerticesAsTexCoords ); 02631 glVertexPointer( 3, GL_FLOAT, 0, (GLubyte *)((char *)NULL + (0)) ); 02632 glEnableClientState( GL_VERTEX_ARRAY ); 02633 //glDrawArrays( GL_POINTS, 0, m_SimDomain->GetTotalGridElements() ); 02634 02635 //glBeginTransformFeedbackNV( GL_TRIANGLES ); 02636 glDrawArrays( GL_POINTS, 0, m_uiTotalCubes ); 02637 //glEndTransformFeedbackNV(); 02638 02639 glDisableClientState( GL_VERTEX_ARRAY ); 02640 glBindBuffer( GL_ARRAY_BUFFER, 0 ); 02641 glPopAttrib(); 02642 //========================================================================= 02643 //*/ 02644 } 02645 //----------------------------------------------------------------------------- 02646 // END: DrawByGLSL 02647 //***************************************************************************** 02648 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_1X1X1_CUBES 02649 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_BUFFERS 02650 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_RENDERING 02651 02652 02653 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_RENDERING 02654 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_BUFFERS 02655 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_2X2X2_CUBES 02656 //***************************************************************************** 02657 // BEGIN: DrawByGLSL 02658 //----------------------------------------------------------------------------- 02659 template <typename T> 02660 void ModelDeformableGLSL_Visualization_RTGenMesh<T>::DrawByGLSL () 02661 { 02672 //--------------------------------------------------------------- 02673 #ifdef TAPs_DEBUG_MODE 02674 if ( !m_SimDomain ) return; 02675 //--------------------------------------------------------------- 02676 if ( !m_SimDomain->RetObject3DTexturePosition() ) return; 02677 //--------------------------------------------------------------- 02678 #endif 02679 //* 02680 //=============================================================== 02681 // Get 3D texture for positions 02682 //--------------------------------------------------------------- 02683 Texture * texture3DPosition = m_SimDomain->RetObject3DTexturePosition(); 02684 //GLfloat modelviewMatrix[16]; 02685 //glGetFloatv( GL_MODELVIEW_MATRIX, modelviewMatrix ); 02686 //--------------------------------------------------------------- 02687 //=============================================================== 02688 // Draw the deformable model 02689 //--------------------------------------------------------------- 02690 glPushAttrib( GL_ALL_ATTRIB_BITS ); 02691 //----------------------------------------------------- 02692 glColor3ub( 80, 80, 80 ); 02693 glEnable( GL_COLOR_MATERIAL ); 02694 glEnable( GL_LIGHTING ); 02695 glEnable( GL_BLEND ); 02696 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); 02697 glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND ); 02698 //glShadeModel( GL_SMOOTH ); 02699 //glShadeModel( GL_FLAT ); 02700 //----------------------------------------------------- 02701 //texture3DPosition->EnableTextureTarget(); 02702 //glActiveTexture( GL_TEXTURE0 ); 02703 //texture3DPosition->BindTexture(0); 02704 //----------------------------------------------------- 02705 GLSLProgramObject * pShader = NULL; 02706 if ( m_bUseGlobalInterpolationVal ) { 02707 pShader = m_glslProgramObjectWithGlobalIntpValue; 02708 } 02709 else { 02710 pShader = m_glslProgramObjectWithTextureIntpValue; 02711 } 02712 pShader->BeginGLSL(); 02713 //----------------------------------------------------- 02714 02715 //+++++++++++++++++++++++++++++++++++++++++++ 02716 //=========================================== 02717 // START: Parameter Setup 02718 //------------------------------------------- 02719 // Texture Parameter Setup 02720 // Set Surface 3D Texture to Texture Unit 0 02721 //glEnable( GL_BLEND ); 02722 glEnable( GL_TEXTURE_3D ); 02723 glActiveTexture( GL_TEXTURE0 ); 02724 glBindTexture( GL_TEXTURE_3D, m_3DTexture ); 02725 pShader->SetUniform1i( "SurfaceTexture", 0 ); 02726 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02727 //--------------------------------- 02728 // Set PositionTexture to Texture Unit 1 02729 texture3DPosition->EnableTextureTarget(); 02730 glActiveTexture( GL_TEXTURE1 ); 02731 texture3DPosition->BindTexture(0); 02732 pShader->SetUniform1i( "PositionTexture", 1 ); 02733 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02734 //--------------------------------- 02735 // Set Edge Table to Texture Unit 2 02736 glEnable( GL_TEXTURE_2D ); 02737 glActiveTexture( GL_TEXTURE2 ); 02738 glBindTexture( GL_TEXTURE_2D, EdgeTableTexture ); 02739 pShader->SetUniform1i( "EdgeTableTexture", 2 ); 02740 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02741 //--------------------------------- 02742 // Set Triangle Table to Texture Unit 3 02743 //glEnable( GL_TEXTURE_2D ); 02744 glActiveTexture( GL_TEXTURE3 ); 02745 glBindTexture( GL_TEXTURE_2D, TriTableTexture ); 02746 pShader->SetUniform1i( "TriTableTexture", 3 ); 02747 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02748 //--------------------------------- 02749 // Set Triangle and Edge Tables to Texture Unit 2 02750 //glEnable( GL_TEXTURE_2D ); 02751 //glActiveTexture( GL_TEXTURE2 ); 02752 //glBindTexture( GL_TEXTURE_2D, TriAndEdgeTableTexture ); 02753 //pShader->SetUniform1i( "TriAndEdgeTableTexture", 2 ); 02754 //TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02755 //--------------------------------- 02756 // Threshold Value 02757 pShader->SetUniform1f( "threshold", m_SimDomain->IC_Thresholds::ON_BOUNDARY ); 02758 //--------------------------------- 02759 // Interpolation Value 02760 pShader->SetUniform1f( "interpolationValue", m_tGlobalInterpolationVal ); 02761 //--------------------------------- 02762 // Threshold Value 02763 // For NVIDIA 320MB 8800 GTS, the smoothness should be at most 4. 02764 // The smotthness cannot be less than 2, due to the essential nature of PNTriangle algorithm. 02765 // Therefore, the smoothness must be between 2 (no PNTriangle, i.e. original triangle) to 4. 02766 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_PNTRI 02767 int Smoothness = static_cast<int>( m_PNTriangleSmoothness ); 02768 if ( Smoothness < 2 ) Smoothness = 2; 02769 else if ( Smoothness > 4 ) Smoothness = 4; 02770 //std::cout << "Smoothness: " << Smoothness << std::endl; 02771 pShader->SetUniform1i( "Smoothness", Smoothness ); 02772 #endif // #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_PNTRI 02773 //--------------------------------- 02774 // Coordinate Offsets 02775 Vector3<T> coordOffsets = m_SimDomain->GetTexCoordOffsetForPosition(); 02776 pShader->SetUniform3f( 02777 "offsetCoordsPosition", 02778 coordOffsets[0], coordOffsets[1], coordOffsets[2] 02779 ); 02780 //------------------------------------------- 02781 // END: Parameter Setup 02782 //=========================================== 02783 //+++++++++++++++++++++++++++++++++++++++++++ 02784 02785 //----------------------------------------------------- 02786 // Bind the buffer and then draw 02787 glBindBuffer( GL_ARRAY_BUFFER, m_vboVerticesAsTexCoords ); 02788 glVertexPointer( 3, GL_FLOAT, 0, (GLubyte *)((char *)NULL + (0)) ); 02789 glEnableClientState( GL_VERTEX_ARRAY ); 02790 //glDrawArrays( GL_POINTS, 0, m_SimDomain->GetTotalGridElements() ); 02791 02792 //glBeginTransformFeedbackNV( GL_TRIANGLES ); 02793 glDrawArrays( GL_POINTS, 0, m_uiTotalCubes ); 02794 //glEndTransformFeedbackNV(); 02795 02796 glDisableClientState( GL_VERTEX_ARRAY ); 02797 glBindBuffer( GL_ARRAY_BUFFER, 0 ); 02798 //----------------------------------------------------- 02799 pShader->EndGLSL(); 02800 //----------------------------------------------------- 02801 texture3DPosition->DisableTextureTarget(); 02802 texture3DPosition->UnbindTexture(); 02803 //----------------------------------------------------- 02804 glPopAttrib(); 02805 //--------------------------------------------------------------- 02806 //=============================================================== 02807 //*/ 02808 02809 /* 02810 //========================================================================= 02811 // TEST DRAWING 02812 glPushAttrib( GL_ALL_ATTRIB_BITS ); 02813 glColor3ub( 175, 80, 80 ); 02814 glEnable( GL_COLOR_MATERIAL ); 02815 glDisable( GL_LIGHTING ); 02816 glPointSize( 5 ); 02817 glBindBuffer( GL_ARRAY_BUFFER, m_vboVerticesAsTexCoords ); 02818 glVertexPointer( 3, GL_FLOAT, 0, (GLubyte *)((char *)NULL + (0)) ); 02819 glEnableClientState( GL_VERTEX_ARRAY ); 02820 //glDrawArrays( GL_POINTS, 0, m_SimDomain->GetTotalGridElements() ); 02821 02822 //glBeginTransformFeedbackNV( GL_TRIANGLES ); 02823 glDrawArrays( GL_POINTS, 0, m_uiTotalCubes ); 02824 //glEndTransformFeedbackNV(); 02825 02826 glDisableClientState( GL_VERTEX_ARRAY ); 02827 glBindBuffer( GL_ARRAY_BUFFER, 0 ); 02828 glPopAttrib(); 02829 //========================================================================= 02830 //*/ 02831 } 02832 //----------------------------------------------------------------------------- 02833 // END: DrawByGLSL 02834 //***************************************************************************** 02835 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_2X2X2_CUBES 02836 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_BUFFERS 02837 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_RENDERING 02838 02839 02840 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_CPU_RENDERING 02841 //***************************************************************************** 02842 // BEGIN: DrawByGLSL 02843 //----------------------------------------------------------------------------- 02844 template <typename T> 02845 void ModelDeformableGLSL_Visualization_RTGenMesh<T>::DrawByGLSL () 02846 { 02847 DrawByGL(); 02848 } 02849 //----------------------------------------------------------------------------- 02850 // END: DrawByGLSL 02851 //***************************************************************************** 02852 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_CPU_RENDERING 02853 02854 02855 //#ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_RENDERING 02856 //#ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_NOT_USE_BUFFERS 02860 //template <typename T> 02861 //void ModelDeformableGLSL_Visualization_RTGenMesh<T>::DrawByGLSL () 02862 //{ 02863 // //* 02864 // glPushAttrib( GL_ALL_ATTRIB_BITS ); 02865 // glDisable( GL_LIGHTING ); 02866 // glPointSize( 17 ); 02867 // glBegin( GL_POINTS ); 02868 // glColor3f( 1, 1, 1 ); 02869 // glVertex3f( 0, 0, 0 ); 02870 // glEnd(); 02871 // glPopAttrib(); 02872 // //*/ 02873 // 02874 // //--------------------------------------------------------------- 02875 //#ifdef TAPs_DEBUG_MODE 02876 // if ( !m_SimDomain ) return; 02877 // //--------------------------------------------------------------- 02878 // if ( !m_SimDomain->RetObject3DTexturePosition() ) return; 02879 // //--------------------------------------------------------------- 02880 //#endif 02881 // //=============================================================== 02882 // // Get 3D texture for positions 02883 // //--------------------------------------------------------------- 02884 // Texture * texture3DPosition = m_SimDomain->RetObject3DTexturePosition(); 02885 // //GLfloat modelviewMatrix[16]; 02886 // //glGetFloatv( GL_MODELVIEW_MATRIX, modelviewMatrix ); 02887 // //--------------------------------------------------------------- 02888 // //=============================================================== 02889 // // Draw the deformable model 02890 // //--------------------------------------------------------------- 02891 // glPushAttrib( GL_ALL_ATTRIB_BITS ); 02892 // //----------------------------------------------------- 02893 // texture3DPosition->EnableTextureTarget(); 02894 // //glActiveTexture( GL_TEXTURE0 ); 02895 // texture3DPosition->BindTexture(0); 02896 // //----------------------------------------------------- 02897 // m_glslProgramObject->BeginGLSL(); 02898 // //----------------------------------------------------- 02899 // // Set PositionTexture to Texture Unit 0 02900 // texture3DPosition->EnableTextureTarget(); 02901 // glActiveTexture( GL_TEXTURE0 ); 02902 // texture3DPosition->BindTexture(0); 02903 // m_glslProgramObject->SetUniform1i( "PositionTexture", 0 ); 02904 // TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 02905 // //------------------------------------------- 02906 // // location name, count, isTranspose, *data 02907 // //////m_glslProgramObject->SetUniformMatrix4fv( "ModelviewMatrix", 1, GL_FALSE, modelviewMatrix ); 02908 // //------------------------------------------- 02909 // Vector3<int> gridResolution = m_SimDomain->GetGridResolution(); 02910 // Vector3<T> texCoordOffset = m_SimDomain->GetTexCoordOffsetForPosition(); 02911 // T texCoordStart[3] = { 02912 // texCoordOffset[0] / 2.0, 02913 // texCoordOffset[1] / 2.0, 02914 // texCoordOffset[2] / 2.0 02915 // }; 02916 // T texCoord[3] = { texCoordStart[0], texCoordStart[1], texCoordStart[2] }; 02917 // int idx = 0; 02918 // glPointSize( 11 ); 02919 // 02920 // 02921 // /*/ 02922 // static bool isFirstRun = true; 02923 // if ( isFirstRun ) { 02924 // isFirstRun = false; 02925 // std::cout << "m_SimDomain->GetTotalGridElements(): " << m_SimDomain->GetTotalGridElements() << "\n"; 02926 // glBindBuffer( GL_ARRAY_BUFFER, m_vboVerticesAsTexCoords ); 02927 // float * vertices = static_cast<float *>( glMapBuffer( GL_ARRAY_BUFFER, GL_WRITE_ONLY ) ); 02928 // int idx = 0; 02929 // for ( int z = 0; z < gridResolution[2]; ++z ) { 02930 // for ( int y = 0; y < gridResolution[1]; ++y ) { 02931 // for ( int x = 0; x < gridResolution[0]; ++x ) { 02932 // std::cout << "VBO READ BACK: " 02933 // << x << " " 02934 // << y << " " 02935 // << z << ": " 02936 // << vertices[idx++] << " " 02937 // << vertices[idx++] << " " 02938 // << vertices[idx++] << "\n"; 02939 // } 02940 // } 02941 // } 02942 // glUnmapBuffer( GL_ARRAY_BUFFER ); 02943 // glBindBuffer( GL_ARRAY_BUFFER, 0 ); 02944 // } 02945 // //*/ 02946 // 02947 // //* 02948 // glBegin( GL_POINTS ); 02949 // //texCoord[2] = texCoordStart[2]; 02950 // for ( int Z = 0; Z < gridResolution[2]; ++Z ) { 02951 // texCoord[1] = texCoordStart[1]; 02952 // for ( int Y = 0; Y < gridResolution[1]; ++Y ) { 02953 // texCoord[0] = texCoordStart[0]; 02954 // for ( int X = 0; X < gridResolution[0]; ++X ) { 02955 // //glTexCoord3f( texCoord[0], texCoord[1], texCoord[2] ); 02956 // glVertex3f( texCoord[0], texCoord[1], texCoord[2] ); 02957 // idx += 4; 02958 // texCoord[0] += texCoordOffset[0]; 02959 // } 02960 // texCoord[1] += texCoordOffset[1]; 02961 // } 02962 // texCoord[2] += texCoordOffset[2]; 02963 // } 02964 // glEnd(); 02965 // //*/ 02966 // //----------------------------------------------------- 02967 // m_glslProgramObject->EndGLSL(); 02968 // //----------------------------------------------------- 02969 // texture3DPosition->DisableTextureTarget(); 02970 // texture3DPosition->UnbindTexture(); 02971 // //----------------------------------------------------- 02972 // glPopAttrib(); 02973 // //--------------------------------------------------------------- 02974 // //=============================================================== 02975 //} 02979 //#endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_NOT_USE_BUFFERS 02980 //#endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_RENDERING 02981 02982 02983 //***************************************************************************** 02984 // BEGIN: DrawByGL_StandardMC 02985 //----------------------------------------------------------------------------- 02986 template <typename T> 02987 void ModelDeformableGLSL_Visualization_RTGenMesh<T>::DrawByGL_StandardMC () 02988 { 02999 //* 03000 //--------------------------------------------------------------- 03001 #ifdef TAPs_DEBUG_MODE 03002 if ( !m_SimDomain ) return; 03003 //--------------------------------------------------------------- 03004 if ( !m_SimDomain->RetObject3DTexturePosition() ) return; 03005 //--------------------------------------------------------------- 03006 #endif 03007 //=============================================================== 03008 // Read data from GPU -- Positions 03009 //--------------------------------------------------------------- 03010 Texture * texture3DPosition = m_SimDomain->RetObject3DTexturePosition(); 03011 //--------------------------------------------------------------- 03012 glPushAttrib( GL_ALL_ATTRIB_BITS ); 03013 //----------------------------------------------------- 03014 GLsizei sizeForPosition = 03015 texture3DPosition->GetWidth() * 03016 texture3DPosition->GetHeight() * 03017 texture3DPosition->GetDepth() * 03018 texture3DPosition->GetInternalFormatNumberOfComponents(); 03019 GLfloat * dataForPosition = new GLfloat[ sizeForPosition ]; 03020 { 03021 int i = 0; 03022 //================================================= 03023 // Read data for positions from a texture to memory 03024 glBindBuffer( GL_PIXEL_PACK_BUFFER, 0 ); 03025 texture3DPosition->BindTexture(0); 03026 glGetTexImage( 03027 texture3DPosition->GetTarget(), 03028 texture3DPosition->GetLevel(), 03029 texture3DPosition->GetPixelFormat(), 03030 texture3DPosition->GetDataType(), 03031 dataForPosition 03032 ); 03033 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 03034 //================================================= 03035 } 03036 //--------------------------------------------------------------- 03037 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 03038 //----------------------------------------------------- 03039 glPopAttrib(); 03040 //--------------------------------------------------------------- 03041 //=============================================================== 03042 03043 //=============================================================== 03044 // Read data from GPU -- Ellipsoid Influence 03045 //--------------------------------------------------------------- 03046 Texture * texture3DEllipsoidInfluence = m_SimDomain->RetObject3DTextureEllipsoidInfluence(); 03047 //--------------------------------------------------------------- 03048 glPushAttrib( GL_ALL_ATTRIB_BITS ); 03049 //----------------------------------------------------- 03050 GLsizei sizeForEllipsoidInfluence = 03051 texture3DEllipsoidInfluence->GetWidth() * 03052 texture3DEllipsoidInfluence->GetHeight() * 03053 texture3DEllipsoidInfluence->GetDepth() * 03054 texture3DEllipsoidInfluence->GetInternalFormatNumberOfComponents(); 03055 //std::cout << "sizeForEllipsoidInfluence: " << sizeForEllipsoidInfluence << "\n"; 03056 GLfloat * dataForEllipsoidInfluence = new GLfloat[ sizeForEllipsoidInfluence ]; 03057 { 03058 int i = 0; 03059 //================================================= 03060 // Read data for ellipsoid influences from a texture to memory 03061 glBindBuffer( GL_PIXEL_PACK_BUFFER, 0 ); 03062 texture3DEllipsoidInfluence->BindTexture(0); 03063 glGetTexImage( 03064 texture3DEllipsoidInfluence->GetTarget(), 03065 texture3DEllipsoidInfluence->GetLevel(), 03066 texture3DEllipsoidInfluence->GetPixelFormat(), 03067 texture3DEllipsoidInfluence->GetDataType(), 03068 dataForEllipsoidInfluence 03069 ); 03070 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 03071 //================================================= 03072 } 03073 //--------------------------------------------------------------- 03074 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 03075 //----------------------------------------------------- 03076 glPopAttrib(); 03077 //--------------------------------------------------------------- 03078 //=============================================================== 03079 03080 //--------------------------------- 03081 Vector3<int> gridResolution = m_SimDomain->GetGridResolution(); 03082 Vector3<T> gridDimension = m_SimDomain->GetGridDimension(); 03083 //--------------------------------- 03084 03085 //* 03086 //=============================================================== 03087 // Draw by Marching Cube 03088 //--------------------------------------------------------------- 03089 // Adapted from "Polygonising a scalar field" by Paul Bourke (1994) 03090 // http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/ 03091 //--------------------------------------------------------------- 03092 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_SHADER_FOR_SHADING_SURFACE_FROM_SW 03093 m_glslProgramObjectForShaderSurfaceFromSW->BeginGLSL(); 03094 if ( m_3DTexture ) { 03095 glActiveTexture( GL_TEXTURE0 ); 03096 glBindTexture( GL_TEXTURE_3D, m_3DTexture ); 03097 m_glslProgramObjectForShaderSurfaceFromSW->SetUniform1i( "SurfaceTexture", 0 ); 03098 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 03099 } 03100 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_SHADER_FOR_SHADING_SURFACE_FROM_SW 03101 03102 glPushAttrib( GL_ALL_ATTRIB_BITS ); 03103 //glLineWidth( 2 ); 03104 glPointSize( 5 ); 03105 03106 //glColor3ub( 240/2, 220/2, 130/2 ); 03107 //glColor3ub( 240/8, 220/8, 130/8 ); 03108 //glColor3ub( 65, 65, 65 ); 03109 03110 glColor3ub( 75, 75, 75 ); 03111 03112 //glColor3ub( 150, 150, 150 ); 03113 //glColor3ub( 255, 255, 255 ); 03114 03115 //glEnable( GL_COLOR_MATERIAL ); 03116 03117 /* 03118 GLfloat diffuseMaterial[4] = { 0.5f, 0.5f, 0.5f, 1.0f }; 03119 GLfloat specularMaterial[4] = { 0.8f, 0.8f, 0.8f, 1.0f }; 03120 GLfloat ambientMaterial[4] = { 0.1f, 0.1f, 0.1f, 1.0f }; 03121 GLfloat shininessMaterial[] = { 128.0 }; 03122 glMaterialfv( GL_FRONT, GL_AMBIENT, ambientMaterial ); 03123 glMaterialfv( GL_FRONT, GL_SPECULAR, specularMaterial ); 03124 glMaterialfv( GL_FRONT, GL_DIFFUSE, diffuseMaterial ); 03125 glMaterialfv( GL_FRONT, GL_SHININESS, diffuseMaterial ); 03126 //*/ 03127 03128 glEnable( GL_LIGHTING ); 03129 //glDisable( GL_LIGHTING ); 03130 03131 // DEBUG for two-sided lighting 03132 glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE ); 03133 03134 //--------------------------------------------------------------- 03135 // Texture Parameter Setup 03136 03137 /* 03138 // 3D Texture for surface 03139 glEnable( GL_TEXTURE_3D ); 03140 glBindTexture( GL_TEXTURE_3D, m_3DTexture ); 03141 //*/ 03142 03143 // Composition 03144 glEnable( GL_BLEND ); 03145 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); 03146 glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); 03147 //glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND ); 03148 //glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL ); 03149 //glTexEnvf( GL_TEXTURE_ENV, GL_RGB_SCALE, 0.5 ); 03150 //glTexEnvf( GL_TEXTURE_ENV, GL_ALPHA_SCALE, 0.5 ); 03151 //glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD ); 03152 03153 /* 03154 static GLfloat constColor[4] = { 0.0, 0.0, 0.0, 0.0 }; 03155 constColor[3] = 0.2; 03156 glTexEnvfv( GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constColor ); 03157 glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE ); 03158 glTexEnvf( GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE ); 03159 glTexEnvf( GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE ); 03160 glTexEnvf( GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR ); 03161 glTexEnvf( GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS ); 03162 glTexEnvf( GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR ); 03163 glTexEnvf( GL_TEXTURE_ENV, GL_SRC2_RGB, GL_PREVIOUS ); 03164 glTexEnvf( GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA ); 03165 //*/ 03166 03167 //--------------------------------------------------------------- 03168 int iOffsetSlice = gridResolution[1] * gridResolution[0] * 4; 03169 int iOffsetRow = gridResolution[0] * 4; 03170 int iOffsetCol = 4; 03171 //--------------------------------- 03172 // Vertex & Edge Index 03173 // 3------2------2 03174 // /| /| 03175 // 11 | 10 | 03176 // / 3 / 1 03177 // 7------6------6 | 03178 // | | | | 03179 // | 0------0--|---1 03180 // 7 / 5 / 03181 // | 8 | 9 03182 // |/ |/ 03183 // 4------4------5 03184 //--------------------------------- 03185 // Edge Table [256] & Triangle Table [256][16] 03193 // V = V1 + (isovalue - s1) (V2 - V1) / (s2 - s1) 03194 //--------------------------------- 03195 //unsigned char cubeClass = 0; 03196 //if ( grid.val[0] < isolevel ) cubeClass |= 1; 03197 //if ( grid.val[1] < isolevel ) cubeClass |= 2; 03198 //if ( grid.val[2] < isolevel ) cubeClass |= 4; 03199 //if ( grid.val[3] < isolevel ) cubeClass |= 8; 03200 //if ( grid.val[4] < isolevel ) cubeClass |= 16; 03201 //if ( grid.val[5] < isolevel ) cubeClass |= 32; 03202 //if ( grid.val[6] < isolevel ) cubeClass |= 64; 03203 //if ( grid.val[7] < isolevel ) cubeClass |= 128; 03204 //--------------------------------- 03205 int numOfTrisPerCell = 0; // number of triangles in the cell 03206 int triIndices[15]; // at most 5 triangles 03207 Vector3<T> V[8]; // vertices of the cell 03208 Vector3<T> VTC[8]; // texture coordinates of the vertices 03209 Vector3<T> texCoordList[12]; // since 12 edges 03210 Vector3<T> vertexList[12]; // since 12 edges 03211 int bV[12]; // >=0 if the vertex is counted (e.g. on boundary, existing, etc.) 03212 Vector3<T> grad[12]; // gradients of vertices 03213 //Vector3<T> texCoords[12]; // 03214 Vector3<T> Center, nE, nW, nN, nS, nF, nB; // center and its neighbors for gradient computation 03215 //--------------------------------- 03216 int idx[8], d, i; 03217 unsigned char cubeClass = 0; 03218 T threshold = 250; 03219 // 03220 T tc[3]; 03221 T tcStep[3] = { 03222 1.0 / static_cast<T>( gridResolution[0]-1 ), 03223 1.0 / static_cast<T>( gridResolution[1]-1 ), 03224 1.0 / static_cast<T>( gridResolution[2]-1 ) 03225 }; 03226 // 03227 03228 //----------------------------------------------------- 03229 // For Interpolation Data used by Marching Cube 03230 int iOffsetSliceIntp = gridResolution[1] * gridResolution[0] * 3; 03231 int iOffsetRowIntp = gridResolution[0] * 3; 03232 int iOffsetColIntp = 3; 03233 int intpIdx[8]; 03234 Vector3<T> VIntp[8]; // Interpolation Data (XYZ) 03235 //----------------------------------------------------- 03236 03237 //--------------------------------- 03238 //for ( int Z = gridResolution[2]*3/4; Z < gridResolution[2]-1; ++Z ) { 03239 for ( int Z = 0; Z < gridResolution[2]-1; ++Z ) { 03240 // 03241 // For Interpolation Data 03242 int offsetZIntp = Z * iOffsetSliceIntp; 03243 // 03244 int offsetZ = Z * iOffsetSlice; 03245 // 03246 // Texture Coordinates -- Z 03247 tc[2] = static_cast<T>( Z ) / static_cast<T>( gridResolution[2]-1 ); 03248 VTC[0].SetZ( tc[2] ); 03249 VTC[1].SetZ( tc[2] ); 03250 VTC[2].SetZ( tc[2] ); 03251 VTC[3].SetZ( tc[2] ); 03252 tc[2] += tcStep[2]; 03253 VTC[4].SetZ( tc[2] ); 03254 VTC[5].SetZ( tc[2] ); 03255 VTC[6].SetZ( tc[2] ); 03256 VTC[7].SetZ( tc[2] ); 03257 // 03258 //for ( int Y = gridResolution[1]; Y < gridResolution[1]-1; ++Y ) { 03259 for ( int Y = 0; Y < gridResolution[1]-1; ++Y ) { 03260 // 03261 // Set Indices for Interpolation Data 03262 int offsetYZIntp = Y * iOffsetRowIntp + offsetZIntp; 03263 intpIdx[0] = offsetYZIntp;; 03264 intpIdx[1] = intpIdx[0] + iOffsetColIntp; 03265 intpIdx[2] = intpIdx[1] + iOffsetRowIntp; 03266 intpIdx[3] = intpIdx[0] + iOffsetRowIntp; 03267 intpIdx[4] = intpIdx[0] + iOffsetSliceIntp; 03268 intpIdx[5] = intpIdx[4] + iOffsetColIntp; 03269 intpIdx[6] = intpIdx[5] + iOffsetRowIntp; 03270 intpIdx[7] = intpIdx[4] + iOffsetRowIntp; 03271 // 03272 // Set Indices for Cube Vertices 03273 int offsetYZ = Y * iOffsetRow + offsetZ; 03274 idx[0] = offsetYZ; 03275 idx[1] = idx[0] + iOffsetCol; 03276 idx[2] = idx[1] + iOffsetRow; 03277 idx[3] = idx[0] + iOffsetRow; 03278 idx[4] = idx[0] + iOffsetSlice; 03279 idx[5] = idx[4] + iOffsetCol; 03280 idx[6] = idx[5] + iOffsetRow; 03281 idx[7] = idx[4] + iOffsetRow; 03282 // 03283 // Texture Coordinates -- Y 03284 tc[1] = static_cast<T>( Y ) / static_cast<T>( gridResolution[1]-1 ); 03285 VTC[0].SetY( tc[1] ); 03286 VTC[1].SetY( tc[1] ); 03287 VTC[4].SetY( tc[1] ); 03288 VTC[5].SetY( tc[1] ); 03289 tc[1] += tcStep[1]; 03290 VTC[2].SetY( tc[1] ); 03291 VTC[3].SetY( tc[1] ); 03292 VTC[6].SetY( tc[1] ); 03293 VTC[7].SetY( tc[1] ); 03294 // 03295 for ( int X = 0; X < gridResolution[0]-1; ++X ) { 03296 // 03297 // Texture Coordinates -- X 03298 tc[0] = static_cast<T>( X ) / static_cast<T>( gridResolution[0]-1 ); 03299 VTC[0].SetX( tc[0] ); 03300 VTC[3].SetX( tc[0] ); 03301 VTC[4].SetX( tc[0] ); 03302 VTC[7].SetX( tc[0] ); 03303 tc[0] += tcStep[0]; 03304 VTC[1].SetX( tc[0] ); 03305 VTC[2].SetX( tc[0] ); 03306 VTC[5].SetX( tc[0] ); 03307 VTC[6].SetX( tc[0] ); 03308 // 03309 03310 03311 bool bLeftPresent = false; 03312 bool bRightPresent = false; 03313 { 03314 for ( int i = 0; i < 8; ++i ) { 03315 int flagVal = static_cast<int>( dataForPosition[idx[i] + 3] ); 03316 if ( flagVal > threshold ) { 03317 flagVal %= int( m_SimDomain->IC_Thresholds::FLAG_STEP ); 03318 if ( 1 < flagVal && flagVal < m_SimDomain->IC_Thresholds::MC_LEFT_ADD+1 ) { 03319 bLeftPresent = true; 03320 } 03321 else if ( flagVal > m_SimDomain->IC_Thresholds::MC_LEFT_ADD+1 ) { 03322 bRightPresent = true; 03323 } 03324 } 03325 } 03326 } 03327 03328 // STANDARD CUBE CONFIGURATION 03329 //------------------------------- 03330 // Determine the threshold of each vertex of the cube 03331 cubeClass = 0; 03332 if ( dataForPosition[idx[0] + 3] > threshold ) cubeClass |= 1; 03333 if ( dataForPosition[idx[1] + 3] > threshold ) cubeClass |= 2; 03334 if ( dataForPosition[idx[2] + 3] > threshold ) cubeClass |= 4; 03335 if ( dataForPosition[idx[3] + 3] > threshold ) cubeClass |= 8; 03336 if ( dataForPosition[idx[4] + 3] > threshold ) cubeClass |= 16; 03337 if ( dataForPosition[idx[5] + 3] > threshold ) cubeClass |= 32; 03338 if ( dataForPosition[idx[6] + 3] > threshold ) cubeClass |= 64; 03339 if ( dataForPosition[idx[7] + 3] > threshold ) cubeClass |= 128; 03340 //------------------------------- 03341 03342 03343 // ONE ITERATION FOR EACH CUBE 03344 { 03345 //------------------------------- 03346 // Cell is entirely in/out of the surface 03347 if ( EdgeTable[cubeClass] == 0 ) { 03348 numOfTrisPerCell = 0; 03349 } 03350 else { 03351 //------------------------------- 03352 // Cell contains part of the surface 03353 //----------------- 03354 for ( i = 0; i < 8; ++i ) { 03355 V[i].SetXYZ( 03356 dataForPosition[idx[i] ], 03357 dataForPosition[idx[i] + 1], 03358 dataForPosition[idx[i] + 2] 03359 ); 03360 } 03361 //----------------- 03362 // Reset list of existing vertices 03363 for ( i = 0; i < 12; ++i ) { 03364 bV[i] = -1; 03365 } 03366 03367 //----------------- 03368 // Interpolation Data 03369 for ( i = 0; i < 8; ++i ) { 03370 VIntp[i].SetXYZ( 03371 dataForEllipsoidInfluence[intpIdx[i] ], 03372 dataForEllipsoidInfluence[intpIdx[i] + 1], 03373 dataForEllipsoidInfluence[intpIdx[i] + 2] 03374 ); 03375 } 03376 03377 //=============================================== 03378 // Calculate Gradients 03379 //----------------------------------------------- 03380 Vector3<T> G[8]; 03381 int index; 03382 for ( int vID = 0; vID < 8; ++vID ) { 03383 Center.SetXYZ( dataForPosition[idx[vID] ], 03384 dataForPosition[idx[vID]+1], 03385 dataForPosition[idx[vID]+2] ); 03386 G[vID].SetXYZ( 0, 0, 0 ); 03387 03388 //* 03389 //================================= 03390 // START: 6 Face Gradients 03391 //--------------------------------- 03392 if ( GetGradientComputationByFacesStatus() ) { 03393 //--- East -------------- 03394 if ( X < gridResolution[0]-2 ) { 03395 index = idx[vID] + iOffsetCol; 03396 if ( dataForPosition[index+3] > threshold ) { 03397 nE.SetXYZ( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03398 G[vID] += Center - nE; 03399 } 03400 } 03401 //--- West -------------- 03402 if ( X > 0 ) { 03403 index = idx[vID] - iOffsetCol; 03404 if ( dataForPosition[index+3] > threshold ) { 03405 nW.SetXYZ( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03406 G[vID] += Center - nW; 03407 } 03408 } 03409 //--- North ------------- 03410 if ( Y < gridResolution[1]-2 ) { 03411 index = idx[vID] + iOffsetRow; 03412 if ( dataForPosition[index+3] > threshold ) { 03413 nN.SetXYZ( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03414 G[vID] += Center - nN; 03415 } 03416 } 03417 //--- South ------------- 03418 if ( Y > 0 ) { 03419 index = idx[vID] - iOffsetRow; 03420 if ( dataForPosition[index+3] > threshold ) { 03421 nS.SetXYZ( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03422 G[vID] += Center - nS; 03423 } 03424 } 03425 //--- Front ------------- 03426 if ( Z < gridResolution[2]-2 ) { 03427 index = idx[vID] + iOffsetSlice; 03428 if ( dataForPosition[index+3] > threshold ) { 03429 nF.SetXYZ( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03430 G[vID] += Center - nF; 03431 } 03432 } 03433 //--- Back -------------- 03434 if ( Z > 0 ) { 03435 index = idx[vID] - iOffsetSlice; 03436 if ( dataForPosition[index+3] > threshold ) { 03437 nB.SetXYZ( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03438 G[vID] += Center - nB; 03439 } 03440 } 03441 //----------------------- 03442 } // END: if ( GetGradientComputationByFacesStatus() ) { 03443 //--------------------------------- 03444 // END: 6 Face Gradients 03445 //================================= 03446 //*/ 03447 03448 //* 03449 //================================= 03450 // START: 8 Vertex Gradients 03451 //--------------------------------- 03452 if ( GetGradientComputationByVerticesStatus() ) { 03453 //--- Front ------------- 03454 if ( Z < gridResolution[2]-2 ) { 03455 int idxF = idx[vID] + iOffsetSlice; 03456 //-- North ----- 03457 if ( Y < gridResolution[1]-2 ) { 03458 int idxFN = idxF + iOffsetRow; 03459 //- West 03460 if ( X > 0 ) { 03461 index = idxFN - iOffsetCol; 03462 if ( dataForPosition[index+3] > threshold ) { 03463 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03464 G[vID] += Center - vGrad; 03465 } 03466 } 03467 //- East 03468 if ( X < gridResolution[0]-2 ) { 03469 index = idxFN + iOffsetCol; 03470 if ( dataForPosition[index+3] > threshold ) { 03471 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03472 G[vID] += Center - vGrad; 03473 } 03474 } 03475 } 03476 //-- South ----- 03477 if ( Y > 0 ) { 03478 int idxFS = idxF - iOffsetRow; 03479 //- West 03480 if ( X > 0 ) { 03481 index = idxFS - iOffsetCol; 03482 if ( dataForPosition[index+3] > threshold ) { 03483 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03484 G[vID] += Center - vGrad; 03485 } 03486 } 03487 //- East 03488 if ( X < gridResolution[0]-2 ) { 03489 index = idxFS + iOffsetCol; 03490 if ( dataForPosition[index+3] > threshold ) { 03491 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03492 G[vID] += Center - vGrad; 03493 } 03494 } 03495 } 03496 } 03497 //--- Back -------------- 03498 if ( Z > 0 ) { 03499 int idxF = idx[vID] - iOffsetSlice; 03500 //-- North ----- 03501 if ( Y < gridResolution[1]-2 ) { 03502 int idxFN = idxF + iOffsetRow; 03503 //- West 03504 if ( X > 0 ) { 03505 index = idxFN - iOffsetCol; 03506 if ( dataForPosition[index+3] > threshold ) { 03507 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03508 G[vID] += Center - vGrad; 03509 } 03510 } 03511 //- East 03512 if ( X < gridResolution[0]-2 ) { 03513 index = idxFN + iOffsetCol; 03514 if ( dataForPosition[index+3] > threshold ) { 03515 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03516 G[vID] += Center - vGrad; 03517 } 03518 } 03519 } 03520 //-- South ----- 03521 if ( Y > 0 ) { 03522 int idxFS = idxF - iOffsetRow; 03523 //- West 03524 if ( X > 0 ) { 03525 index = idxFS - iOffsetCol; 03526 if ( dataForPosition[index+3] > threshold ) { 03527 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03528 G[vID] += Center - vGrad; 03529 } 03530 } 03531 //- East 03532 if ( X < gridResolution[0]-2 ) { 03533 index = idxFS + iOffsetCol; 03534 if ( dataForPosition[index+3] > threshold ) { 03535 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03536 G[vID] += Center - vGrad; 03537 } 03538 } 03539 } 03540 } 03541 //----------------------- 03542 } // END: if ( GetGradientComputationByVerticesStatus() ) { 03543 //--------------------------------- 03544 // END: 8 Vertex Gradients 03545 //================================= 03546 //*/ 03547 03548 //* 03549 //================================= 03550 // START: 12 Edge Gradients 03551 //--------------------------------- 03552 if ( GetGradientComputationByEdgesStatus() ) { 03553 //--- Front ------------- 03554 if ( Z < gridResolution[2]-2 ) { 03555 int idxF = idx[vID] + iOffsetSlice; 03556 //-- East ------ 03557 if ( X < gridResolution[0]-2 ) { 03558 index = idxF + iOffsetCol; 03559 if ( dataForPosition[index+3] > threshold ) { 03560 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03561 G[vID] += Center - vGrad; 03562 } 03563 } 03564 //-- West ------ 03565 if ( X > 0 ) { 03566 index = idxF - iOffsetCol; 03567 if ( dataForPosition[index+3] > threshold ) { 03568 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03569 G[vID] += Center - vGrad; 03570 } 03571 } 03572 //-- North ----- 03573 if ( Y < gridResolution[1]-2 ) { 03574 index = idxF + iOffsetRow; 03575 if ( dataForPosition[index+3] > threshold ) { 03576 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03577 G[vID] += Center - vGrad; 03578 } 03579 } 03580 //-- South ----- 03581 if ( Y > 0 ) { 03582 index = idxF - iOffsetRow; 03583 if ( dataForPosition[index+3] > threshold ) { 03584 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03585 G[vID] += Center - vGrad; 03586 } 03587 } 03588 } 03589 //--- Center ------------ 03590 if ( true ) { 03591 int idxC = idx[vID]; 03592 //-- East ------ 03593 if ( X < gridResolution[0]-2 ) { 03594 index = idxC + iOffsetCol; 03595 if ( dataForPosition[index+3] > threshold ) { 03596 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03597 G[vID] += Center - vGrad; 03598 } 03599 } 03600 //-- West ------ 03601 if ( X > 0 ) { 03602 index = idxC - iOffsetCol; 03603 if ( dataForPosition[index+3] > threshold ) { 03604 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03605 G[vID] += Center - vGrad; 03606 } 03607 } 03608 //-- North ----- 03609 if ( Y < gridResolution[1]-2 ) { 03610 index = idxC + iOffsetRow; 03611 if ( dataForPosition[index+3] > threshold ) { 03612 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03613 G[vID] += Center - vGrad; 03614 } 03615 } 03616 //-- South ----- 03617 if ( Y > 0 ) { 03618 index = idxC - iOffsetRow; 03619 if ( dataForPosition[index+3] > threshold ) { 03620 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03621 G[vID] += Center - vGrad; 03622 } 03623 } 03624 } 03625 //--- Back -------------- 03626 if ( Z > 0 ) { 03627 int idxB = idx[vID] - iOffsetSlice; 03628 //-- East ------ 03629 if ( X < gridResolution[0]-2 ) { 03630 index = idxB + iOffsetCol; 03631 if ( dataForPosition[index+3] > threshold ) { 03632 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03633 G[vID] += Center - vGrad; 03634 } 03635 } 03636 //-- West ------ 03637 if ( X > 0 ) { 03638 index = idxB - iOffsetCol; 03639 if ( dataForPosition[index+3] > threshold ) { 03640 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03641 G[vID] += Center - vGrad; 03642 } 03643 } 03644 //-- North ----- 03645 if ( Y < gridResolution[1]-2 ) { 03646 index = idxB + iOffsetRow; 03647 if ( dataForPosition[index+3] > threshold ) { 03648 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03649 G[vID] += Center - vGrad; 03650 } 03651 } 03652 //-- South ----- 03653 if ( Y > 0 ) { 03654 index = idxB - iOffsetRow; 03655 if ( dataForPosition[index+3] > threshold ) { 03656 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 03657 G[vID] += Center - vGrad; 03658 } 03659 } 03660 } 03661 //----------------------- 03662 } // END: if ( GetGradientComputationByEdgesStatus() ) { 03663 //--------------------------------- 03664 // END: 12 Edge Gradients 03665 //================================= 03666 //*/ 03667 } 03668 //----------------------------------------------- 03669 // END: Calculate Gradients 03670 //=============================================== 03671 03672 03673 //=============================================== 03674 // Marching Cube Interpolation 03675 // V = V1 + (isovalue - s1) (V2 - V1) / (s2 - s1) 03676 //----------------------------------------------- 03677 // RUNTIME ERROR CAN OCCURS -- DEPENDING ON THE DATA 03678 // SINCE IT DOES NOT HAVE BOUNDARY PROTECTION -- ARRAY INDEX OUT OF BOUND ERROR 03679 //----------------------------------------------- 03680 // Not Use Global Interpolation Value -- each element has its own xyz interpolation values 03681 if ( !m_bUseGlobalInterpolationVal ) { 03682 //------------------------------------- 03683 // Marching Cube Interpolation 03684 T interpolationValPlus;// = m_tGlobalInterpolationVal; 03685 T interpolationValNeg;// = 1.0 - m_tGlobalInterpolationVal; 03686 //------------------------------------- 03687 // Edge# 0 to 11 <==> [ 1, 2, 4, ... , 2048 ] 03688 if ( EdgeTable[cubeClass] & 1 ) { 03689 if ( dataForPosition[idx[0] + 3] > threshold ) { 03690 // 03691 // Interpotation Data 03692 interpolationValPlus = VIntp[0].GetX(); 03693 // 03694 vertexList[ 0] = V[0] + interpolationValPlus*(V[1] - V[0]); 03695 grad[0] = G[0] + interpolationValPlus*(G[1] - G[0]); 03696 texCoordList[0] = VTC[0] + interpolationValPlus*(VTC[1] - VTC[0]); 03697 } 03698 else { 03699 // 03700 // Interpotation Data 03701 interpolationValNeg = 1.0 - VIntp[1].GetX(); 03702 // 03703 vertexList[ 0] = V[0] + interpolationValNeg*(V[1] - V[0]); 03704 grad[0] = G[0] + interpolationValNeg*(G[1] - G[0]); 03705 texCoordList[0] = VTC[0] + interpolationValNeg*(VTC[1] - VTC[0]); 03706 //grad[0] *= -1.0; 03707 } 03708 grad[0].Normalized(); 03709 } 03710 if ( EdgeTable[cubeClass] & 2 ) { 03711 if ( dataForPosition[idx[1] + 3] > threshold ) { 03712 // 03713 // Interpotation Data 03714 interpolationValPlus = VIntp[1].GetY(); 03715 // 03716 vertexList[ 1] = V[1] + interpolationValPlus*(V[2] - V[1]); 03717 grad[1] = G[1] + interpolationValPlus*(G[2] - G[1]); 03718 texCoordList[1] = VTC[1] + interpolationValPlus*(VTC[2] - VTC[1]); 03719 } 03720 else { 03721 // 03722 // Interpotation Data 03723 interpolationValNeg = 1.0 - VIntp[2].GetY(); 03724 // 03725 vertexList[ 1] = V[1] + interpolationValNeg*(V[2] - V[1]); 03726 grad[1] = G[1] + interpolationValNeg*(G[2] - G[1]); 03727 texCoordList[1] = VTC[1] + interpolationValNeg*(VTC[2] - VTC[1]); 03728 //grad[1] *= -1.0; 03729 } 03730 grad[1].Normalized(); 03731 } 03732 if ( EdgeTable[cubeClass] & 4 ) { 03733 if ( dataForPosition[idx[2] + 3] > threshold ) { 03734 // 03735 // Interpotation Data 03736 interpolationValPlus = VIntp[2].GetX(); 03737 // 03738 vertexList[ 2] = V[2] + interpolationValPlus*(V[3] - V[2]); 03739 grad[2] = G[2] + interpolationValPlus*(G[3] - G[2]); 03740 texCoordList[2] = VTC[2] + interpolationValPlus*(VTC[3] - VTC[2]); 03741 //grad[2] *= -1.0; 03742 } 03743 else { 03744 // 03745 // Interpotation Data 03746 interpolationValNeg = 1.0 - VIntp[3].GetX(); 03747 // 03748 vertexList[ 2] = V[2] + interpolationValNeg*(V[3] - V[2]); 03749 grad[2] = G[2] + interpolationValNeg*(G[3] - G[2]); 03750 texCoordList[2] = VTC[2] + interpolationValNeg*(VTC[3] - VTC[2]); 03751 } 03752 grad[2].Normalized(); 03753 } 03754 if ( EdgeTable[cubeClass] & 8 ) { 03755 if ( dataForPosition[idx[0] + 3] > threshold ) { 03756 // 03757 // Interpotation Data 03758 interpolationValPlus = VIntp[0].GetY(); 03759 // 03760 vertexList[ 3] = V[0] + interpolationValPlus*(V[3] - V[0]); 03761 grad[3] = G[0] + interpolationValPlus*(G[3] - G[0]); 03762 texCoordList[3] = VTC[0] + interpolationValPlus*(VTC[3] - VTC[0]); 03763 //grad[3][1] *= -1.0; 03764 } 03765 else { 03766 // 03767 // Interpotation Data 03768 interpolationValNeg = 1.0 - VIntp[3].GetY(); 03769 // 03770 vertexList[ 3] = V[0] + interpolationValNeg*(V[3] - V[0]); 03771 grad[3] = G[0] + interpolationValNeg*(G[3] - G[0]); 03772 texCoordList[3] = VTC[0] + interpolationValNeg*(VTC[3] - VTC[0]); 03773 } 03774 grad[3].Normalized(); 03775 } 03776 if ( EdgeTable[cubeClass] & 16 ) { 03777 if ( dataForPosition[idx[4] + 3] > threshold ) { 03778 // 03779 // Interpotation Data 03780 interpolationValPlus = VIntp[4].GetX(); 03781 // 03782 vertexList[ 4] = V[4] + interpolationValPlus*(V[5] - V[4]); 03783 grad[4] = G[4] + interpolationValPlus*(G[5] - G[4]); 03784 texCoordList[4] = VTC[4] + interpolationValPlus*(VTC[5] - VTC[4]); 03785 } 03786 else { 03787 // 03788 // Interpotation Data 03789 interpolationValNeg = 1.0 - VIntp[5].GetX(); 03790 // 03791 vertexList[ 4] = V[4] + interpolationValNeg*(V[5] - V[4]); 03792 grad[4] = G[4] + interpolationValNeg*(G[5] - G[4]); 03793 texCoordList[4] = VTC[4] + interpolationValNeg*(VTC[5] - VTC[4]); 03794 //grad[4] *= -1.0; 03795 } 03796 grad[4].Normalized(); 03797 } 03798 if ( EdgeTable[cubeClass] & 32 ) { 03799 if ( dataForPosition[idx[5] + 3] > threshold ) { 03800 // 03801 // Interpotation Data 03802 interpolationValPlus = VIntp[5].GetY(); 03803 // 03804 vertexList[ 5] = V[5] + interpolationValPlus*(V[6] - V[5]); 03805 grad[5] = G[5] + interpolationValPlus*(G[6] - G[5]); 03806 texCoordList[5] = VTC[5] + interpolationValPlus*(VTC[6] - VTC[5]); 03807 } 03808 else { 03809 // 03810 // Interpotation Data 03811 interpolationValNeg = 1.0 - VIntp[6].GetY(); 03812 // 03813 vertexList[ 5] = V[5] + interpolationValNeg*(V[6] - V[5]); 03814 grad[5] = G[5] + interpolationValNeg*(G[6] - G[5]); 03815 texCoordList[5] = VTC[5] + interpolationValNeg*(VTC[6] - VTC[5]); 03816 //grad[5][1] *= -1.0; 03817 } 03818 grad[5].Normalized(); 03819 } 03820 if ( EdgeTable[cubeClass] & 64 ) { 03821 if ( dataForPosition[idx[6] + 3] > threshold ) { 03822 // 03823 // Interpotation Data 03824 interpolationValPlus = VIntp[6].GetX(); 03825 // 03826 vertexList[ 6] = V[6] + interpolationValPlus*(V[7] - V[6]); 03827 grad[6] = G[6] + interpolationValPlus*(G[7] - G[6]); 03828 texCoordList[6] = VTC[6] + interpolationValPlus*(VTC[7] - VTC[6]); 03829 } 03830 else { 03831 // 03832 // Interpotation Data 03833 interpolationValNeg = 1.0 - VIntp[7].GetX(); 03834 // 03835 vertexList[ 6] = V[6] + interpolationValNeg*(V[7] - V[6]); 03836 grad[6] = G[6] + interpolationValNeg*(G[7] - G[6]); 03837 texCoordList[6] = VTC[6] + interpolationValNeg*(VTC[7] - VTC[6]); 03838 //grad[6] *= -1.0; 03839 } 03840 grad[6].Normalized(); 03841 } 03842 if ( EdgeTable[cubeClass] & 128 ) { 03843 if ( dataForPosition[idx[4] + 3] > threshold ) { 03844 // 03845 // Interpotation Data 03846 interpolationValPlus = VIntp[4].GetY(); 03847 // 03848 vertexList[ 7] = V[4] + interpolationValPlus*(V[7] - V[4]); 03849 grad[7] = G[4] + interpolationValPlus*(G[7] - G[4]); 03850 texCoordList[7] = VTC[4] + interpolationValPlus*(VTC[7] - VTC[4]); 03851 //grad[7][1] *= -1.0; 03852 } 03853 else { 03854 // 03855 // Interpotation Data 03856 interpolationValNeg = 1.0 - VIntp[7].GetY(); 03857 // 03858 vertexList[ 7] = V[4] + interpolationValNeg*(V[7] - V[4]); 03859 grad[7] = G[4] + interpolationValNeg*(G[7] - G[4]); 03860 texCoordList[7] = VTC[4] + interpolationValNeg*(VTC[7] - VTC[4]); 03861 } 03862 grad[7].Normalized(); 03863 } 03864 if ( EdgeTable[cubeClass] & 256 ) { 03865 if ( dataForPosition[idx[0] + 3] > threshold ) { 03866 // 03867 // Interpotation Data 03868 interpolationValPlus = VIntp[0].GetZ(); 03869 // 03870 vertexList[ 8] = V[0] + interpolationValPlus*(V[4] - V[0]); 03871 grad[8] = G[0] + interpolationValPlus*(G[4] - G[0]); 03872 texCoordList[8] = VTC[0] + interpolationValPlus*(VTC[4] - VTC[0]); 03873 } 03874 else { 03875 // 03876 // Interpotation Data 03877 interpolationValNeg = 1.0 - VIntp[4].GetZ(); 03878 // 03879 vertexList[ 8] = V[0] + interpolationValNeg*(V[4] - V[0]); 03880 grad[8] = G[0] + interpolationValNeg*(G[4] - G[0]); 03881 texCoordList[8] = VTC[0] + interpolationValNeg*(VTC[4] - VTC[0]); 03882 //grad[8][2] *= -1.0; 03883 } 03884 grad[8].Normalized(); 03885 } 03886 if ( EdgeTable[cubeClass] & 512 ) { 03887 if ( dataForPosition[idx[1] + 3] > threshold ) { 03888 // 03889 // Interpotation Data 03890 interpolationValPlus = VIntp[1].GetZ(); 03891 // 03892 vertexList[ 9] = V[1] + interpolationValPlus*(V[5] - V[1]); 03893 grad[9] = G[1] + interpolationValPlus*(G[5] - G[1]); 03894 texCoordList[9] = VTC[1] + interpolationValPlus*(VTC[5] - VTC[1]); 03895 } 03896 else { 03897 // 03898 // Interpotation Data 03899 interpolationValNeg = 1.0 - VIntp[5].GetZ(); 03900 // 03901 vertexList[ 9] = V[1] + interpolationValNeg*(V[5] - V[1]); 03902 grad[9] = G[1] + interpolationValNeg*(G[5] - G[1]); 03903 texCoordList[9] = VTC[1] + interpolationValNeg*(VTC[5] - VTC[1]); 03904 //grad[9][2] *= -1.0; 03905 } 03906 grad[9].Normalized(); 03907 } 03908 if ( EdgeTable[cubeClass] & 1024 ) { 03909 if ( dataForPosition[idx[2] + 3] > threshold ) { 03910 // 03911 // Interpotation Data 03912 interpolationValPlus = VIntp[2].GetZ(); 03913 // 03914 vertexList[10] = V[2] + interpolationValPlus*(V[6] - V[2]); 03915 grad[10] = G[2] + interpolationValPlus*(G[6] - G[2]); 03916 texCoordList[10] = VTC[2] + interpolationValPlus*(VTC[6] - VTC[2]); 03917 } 03918 else { 03919 // 03920 // Interpotation Data 03921 interpolationValNeg = 1.0 - VIntp[6].GetZ(); 03922 // 03923 vertexList[10] = V[2] + interpolationValNeg*(V[6] - V[2]); 03924 grad[10] = G[2] + interpolationValNeg*(G[6] - G[2]); 03925 texCoordList[10] = VTC[2] + interpolationValNeg*(VTC[6] - VTC[2]); 03926 //grad[10][2] *= -1.0; 03927 } 03928 grad[10].Normalized(); 03929 } 03930 if ( EdgeTable[cubeClass] & 2048 ) { 03931 if ( dataForPosition[idx[3] + 3] > threshold ) { 03932 // 03933 // Interpotation Data 03934 interpolationValPlus = VIntp[3].GetZ(); 03935 // 03936 vertexList[11] = V[3] + interpolationValPlus*(V[7] - V[3]); 03937 grad[11] = G[3] + interpolationValPlus*(G[7] - G[3]); 03938 texCoordList[11] = VTC[3] + interpolationValPlus*(VTC[7] - VTC[3]); 03939 } 03940 else { 03941 // 03942 // Interpotation Data 03943 interpolationValNeg = 1.0 - VIntp[7].GetZ(); 03944 // 03945 vertexList[11] = V[3] + interpolationValNeg*(V[7] - V[3]); 03946 grad[11] = G[3] + interpolationValNeg*(G[7] - G[3]); 03947 texCoordList[11] = VTC[3] + interpolationValNeg*(VTC[7] - VTC[3]); 03948 //grad[11][2] *= -1.0; 03949 } 03950 grad[11].Normalized(); 03951 } 03952 } // END: Not Use Global Interpolation Value 03953 //----------------------------------------------- 03954 // Use Global Interpolation Value -- all elements have the same interpolation value 03955 else { 03956 //------------------------------------- 03957 // Marching Cube Interpolation 03958 T interpolationValPlus = m_tGlobalInterpolationVal; 03959 T interpolationValNeg = 1.0 - m_tGlobalInterpolationVal; 03960 //------------------------------------- 03961 // Edge# 0 to 11 <==> [ 1, 2, 4, ... , 2048 ] 03962 if ( EdgeTable[cubeClass] & 1 ) { 03963 if ( dataForPosition[idx[0] + 3] > threshold ) { 03964 // 03965 // Interpotation Data 03966 //interpolationValPlus = VIntp[0].GetX(); 03967 // 03968 vertexList[ 0] = V[0] + interpolationValPlus*(V[1] - V[0]); 03969 grad[0] = G[0] + interpolationValPlus*(G[1] - G[0]); 03970 texCoordList[0] = VTC[0] + interpolationValPlus*(VTC[1] - VTC[0]); 03971 } 03972 else { 03973 // 03974 // Interpotation Data 03975 //interpolationValNeg = 1.0 - VIntp[1].GetX(); 03976 // 03977 vertexList[ 0] = V[0] + interpolationValNeg*(V[1] - V[0]); 03978 grad[0] = G[0] + interpolationValNeg*(G[1] - G[0]); 03979 texCoordList[0] = VTC[0] + interpolationValNeg*(VTC[1] - VTC[0]); 03980 //grad[0] *= -1.0; 03981 } 03982 grad[0].Normalized(); 03983 } 03984 if ( EdgeTable[cubeClass] & 2 ) { 03985 if ( dataForPosition[idx[1] + 3] > threshold ) { 03986 // 03987 // Interpotation Data 03988 //interpolationValPlus = VIntp[1].GetY(); 03989 // 03990 vertexList[ 1] = V[1] + interpolationValPlus*(V[2] - V[1]); 03991 grad[1] = G[1] + interpolationValPlus*(G[2] - G[1]); 03992 texCoordList[1] = VTC[1] + interpolationValPlus*(VTC[2] - VTC[1]); 03993 } 03994 else { 03995 // 03996 // Interpotation Data 03997 //interpolationValNeg = 1.0 - VIntp[2].GetY(); 03998 // 03999 vertexList[ 1] = V[1] + interpolationValNeg*(V[2] - V[1]); 04000 grad[1] = G[1] + interpolationValNeg*(G[2] - G[1]); 04001 texCoordList[1] = VTC[1] + interpolationValNeg*(VTC[2] - VTC[1]); 04002 //grad[1] *= -1.0; 04003 } 04004 grad[1].Normalized(); 04005 } 04006 if ( EdgeTable[cubeClass] & 4 ) { 04007 if ( dataForPosition[idx[2] + 3] > threshold ) { 04008 // 04009 // Interpotation Data 04010 //interpolationValPlus = VIntp[2].GetX(); 04011 // 04012 vertexList[ 2] = V[2] + interpolationValPlus*(V[3] - V[2]); 04013 grad[2] = G[2] + interpolationValPlus*(G[3] - G[2]); 04014 texCoordList[2] = VTC[2] + interpolationValPlus*(VTC[3] - VTC[2]); 04015 //grad[2] *= -1.0; 04016 } 04017 else { 04018 // 04019 // Interpotation Data 04020 //interpolationValNeg = 1.0 - VIntp[3].GetX(); 04021 // 04022 vertexList[ 2] = V[2] + interpolationValNeg*(V[3] - V[2]); 04023 grad[2] = G[2] + interpolationValNeg*(G[3] - G[2]); 04024 texCoordList[2] = VTC[2] + interpolationValNeg*(VTC[3] - VTC[2]); 04025 } 04026 grad[2].Normalized(); 04027 } 04028 if ( EdgeTable[cubeClass] & 8 ) { 04029 if ( dataForPosition[idx[0] + 3] > threshold ) { 04030 // 04031 // Interpotation Data 04032 //interpolationValPlus = VIntp[0].GetY(); 04033 // 04034 vertexList[ 3] = V[0] + interpolationValPlus*(V[3] - V[0]); 04035 grad[3] = G[0] + interpolationValPlus*(G[3] - G[0]); 04036 texCoordList[3] = VTC[0] + interpolationValPlus*(VTC[3] - VTC[0]); 04037 //grad[3][1] *= -1.0; 04038 } 04039 else { 04040 // 04041 // Interpotation Data 04042 //interpolationValNeg = 1.0 - VIntp[3].GetY(); 04043 // 04044 vertexList[ 3] = V[0] + interpolationValNeg*(V[3] - V[0]); 04045 grad[3] = G[0] + interpolationValNeg*(G[3] - G[0]); 04046 texCoordList[3] = VTC[0] + interpolationValNeg*(VTC[3] - VTC[0]); 04047 } 04048 grad[3].Normalized(); 04049 } 04050 if ( EdgeTable[cubeClass] & 16 ) { 04051 if ( dataForPosition[idx[4] + 3] > threshold ) { 04052 // 04053 // Interpotation Data 04054 //interpolationValPlus = VIntp[4].GetX(); 04055 // 04056 vertexList[ 4] = V[4] + interpolationValPlus*(V[5] - V[4]); 04057 grad[4] = G[4] + interpolationValPlus*(G[5] - G[4]); 04058 texCoordList[4] = VTC[4] + interpolationValPlus*(VTC[5] - VTC[4]); 04059 } 04060 else { 04061 // 04062 // Interpotation Data 04063 //interpolationValNeg = 1.0 - VIntp[5].GetX(); 04064 // 04065 vertexList[ 4] = V[4] + interpolationValNeg*(V[5] - V[4]); 04066 grad[4] = G[4] + interpolationValNeg*(G[5] - G[4]); 04067 texCoordList[4] = VTC[4] + interpolationValNeg*(VTC[5] - VTC[4]); 04068 //grad[4] *= -1.0; 04069 } 04070 grad[4].Normalized(); 04071 } 04072 if ( EdgeTable[cubeClass] & 32 ) { 04073 if ( dataForPosition[idx[5] + 3] > threshold ) { 04074 // 04075 // Interpotation Data 04076 //interpolationValPlus = VIntp[5].GetY(); 04077 // 04078 vertexList[ 5] = V[5] + interpolationValPlus*(V[6] - V[5]); 04079 grad[5] = G[5] + interpolationValPlus*(G[6] - G[5]); 04080 texCoordList[5] = VTC[5] + interpolationValPlus*(VTC[6] - VTC[5]); 04081 } 04082 else { 04083 // 04084 // Interpotation Data 04085 //interpolationValNeg = 1.0 - VIntp[6].GetY(); 04086 // 04087 vertexList[ 5] = V[5] + interpolationValNeg*(V[6] - V[5]); 04088 grad[5] = G[5] + interpolationValNeg*(G[6] - G[5]); 04089 texCoordList[5] = VTC[5] + interpolationValNeg*(VTC[6] - VTC[5]); 04090 //grad[5][1] *= -1.0; 04091 } 04092 grad[5].Normalized(); 04093 } 04094 if ( EdgeTable[cubeClass] & 64 ) { 04095 if ( dataForPosition[idx[6] + 3] > threshold ) { 04096 // 04097 // Interpotation Data 04098 //interpolationValPlus = VIntp[6].GetX(); 04099 // 04100 vertexList[ 6] = V[6] + interpolationValPlus*(V[7] - V[6]); 04101 grad[6] = G[6] + interpolationValPlus*(G[7] - G[6]); 04102 texCoordList[6] = VTC[6] + interpolationValPlus*(VTC[7] - VTC[6]); 04103 } 04104 else { 04105 // 04106 // Interpotation Data 04107 //interpolationValNeg = 1.0 - VIntp[7].GetX(); 04108 // 04109 vertexList[ 6] = V[6] + interpolationValNeg*(V[7] - V[6]); 04110 grad[6] = G[6] + interpolationValNeg*(G[7] - G[6]); 04111 texCoordList[6] = VTC[6] + interpolationValNeg*(VTC[7] - VTC[6]); 04112 //grad[6] *= -1.0; 04113 } 04114 grad[6].Normalized(); 04115 } 04116 if ( EdgeTable[cubeClass] & 128 ) { 04117 if ( dataForPosition[idx[4] + 3] > threshold ) { 04118 // 04119 // Interpotation Data 04120 //interpolationValPlus = VIntp[4].GetY(); 04121 // 04122 vertexList[ 7] = V[4] + interpolationValPlus*(V[7] - V[4]); 04123 grad[7] = G[4] + interpolationValPlus*(G[7] - G[4]); 04124 texCoordList[7] = VTC[4] + interpolationValPlus*(VTC[7] - VTC[4]); 04125 //grad[7][1] *= -1.0; 04126 } 04127 else { 04128 // 04129 // Interpotation Data 04130 //interpolationValNeg = 1.0 - VIntp[7].GetY(); 04131 // 04132 vertexList[ 7] = V[4] + interpolationValNeg*(V[7] - V[4]); 04133 grad[7] = G[4] + interpolationValNeg*(G[7] - G[4]); 04134 texCoordList[7] = VTC[4] + interpolationValNeg*(VTC[7] - VTC[4]); 04135 } 04136 grad[7].Normalized(); 04137 } 04138 if ( EdgeTable[cubeClass] & 256 ) { 04139 if ( dataForPosition[idx[0] + 3] > threshold ) { 04140 // 04141 // Interpotation Data 04142 //interpolationValPlus = VIntp[0].GetZ(); 04143 // 04144 vertexList[ 8] = V[0] + interpolationValPlus*(V[4] - V[0]); 04145 grad[8] = G[0] + interpolationValPlus*(G[4] - G[0]); 04146 texCoordList[8] = VTC[0] + interpolationValPlus*(VTC[4] - VTC[0]); 04147 } 04148 else { 04149 // 04150 // Interpotation Data 04151 //interpolationValNeg = 1.0 - VIntp[4].GetZ(); 04152 // 04153 vertexList[ 8] = V[0] + interpolationValNeg*(V[4] - V[0]); 04154 grad[8] = G[0] + interpolationValNeg*(G[4] - G[0]); 04155 texCoordList[8] = VTC[0] + interpolationValNeg*(VTC[4] - VTC[0]); 04156 //grad[8][2] *= -1.0; 04157 } 04158 grad[8].Normalized(); 04159 } 04160 if ( EdgeTable[cubeClass] & 512 ) { 04161 if ( dataForPosition[idx[1] + 3] > threshold ) { 04162 // 04163 // Interpotation Data 04164 //interpolationValPlus = VIntp[1].GetZ(); 04165 // 04166 vertexList[ 9] = V[1] + interpolationValPlus*(V[5] - V[1]); 04167 grad[9] = G[1] + interpolationValPlus*(G[5] - G[1]); 04168 texCoordList[9] = VTC[1] + interpolationValPlus*(VTC[5] - VTC[1]); 04169 } 04170 else { 04171 // 04172 // Interpotation Data 04173 //interpolationValNeg = 1.0 - VIntp[5].GetZ(); 04174 // 04175 vertexList[ 9] = V[1] + interpolationValNeg*(V[5] - V[1]); 04176 grad[9] = G[1] + interpolationValNeg*(G[5] - G[1]); 04177 texCoordList[9] = VTC[1] + interpolationValNeg*(VTC[5] - VTC[1]); 04178 //grad[9][2] *= -1.0; 04179 } 04180 grad[9].Normalized(); 04181 } 04182 if ( EdgeTable[cubeClass] & 1024 ) { 04183 if ( dataForPosition[idx[2] + 3] > threshold ) { 04184 // 04185 // Interpotation Data 04186 //interpolationValPlus = VIntp[2].GetZ(); 04187 // 04188 vertexList[10] = V[2] + interpolationValPlus*(V[6] - V[2]); 04189 grad[10] = G[2] + interpolationValPlus*(G[6] - G[2]); 04190 texCoordList[10] = VTC[2] + interpolationValPlus*(VTC[6] - VTC[2]); 04191 } 04192 else { 04193 // 04194 // Interpotation Data 04195 //interpolationValNeg = 1.0 - VIntp[6].GetZ(); 04196 // 04197 vertexList[10] = V[2] + interpolationValNeg*(V[6] - V[2]); 04198 grad[10] = G[2] + interpolationValNeg*(G[6] - G[2]); 04199 texCoordList[10] = VTC[2] + interpolationValNeg*(VTC[6] - VTC[2]); 04200 //grad[10][2] *= -1.0; 04201 } 04202 grad[10].Normalized(); 04203 } 04204 if ( EdgeTable[cubeClass] & 2048 ) { 04205 if ( dataForPosition[idx[3] + 3] > threshold ) { 04206 // 04207 // Interpotation Data 04208 //interpolationValPlus = VIntp[3].GetZ(); 04209 // 04210 vertexList[11] = V[3] + interpolationValPlus*(V[7] - V[3]); 04211 grad[11] = G[3] + interpolationValPlus*(G[7] - G[3]); 04212 texCoordList[11] = VTC[3] + interpolationValPlus*(VTC[7] - VTC[3]); 04213 } 04214 else { 04215 // 04216 // Interpotation Data 04217 //interpolationValNeg = 1.0 - VIntp[7].GetZ(); 04218 // 04219 vertexList[11] = V[3] + interpolationValNeg*(V[7] - V[3]); 04220 grad[11] = G[3] + interpolationValNeg*(G[7] - G[3]); 04221 texCoordList[11] = VTC[3] + interpolationValNeg*(VTC[7] - VTC[3]); 04222 //grad[11][2] *= -1.0; 04223 } 04224 grad[11].Normalized(); 04225 } 04226 } // END: Use Global Interpolation Value 04227 //----------------------------------------------- 04228 // END: if/else statement for MC Interpolation 04229 //=============================================== 04230 04231 //=============================================== 04232 //----------------------------------------------- 04233 // Generate Triangle Index 04234 numOfTrisPerCell = 0; 04235 for ( d = 0; TriTable[cubeClass][d] != -1; ++d ) { 04236 triIndices[d] = TriTable[cubeClass][d]; 04237 } 04238 numOfTrisPerCell = d / 3; 04239 //----------------------------------------------- 04240 //=============================================== 04241 } 04242 04243 /* 04244 //------------------------------- 04245 // Draw (Gradient) Normals 04246 { 04247 glPushAttrib( GL_ALL_ATTRIB_BITS ); 04248 glBegin( GL_LINES ); 04249 glDisable( GL_TEXTURE_3D ); 04250 glDisable( GL_BLEND ); 04251 glDisable( GL_LIGHTING ); 04252 for ( int i = 0; i < numOfTrisPerCell*3; i+=3 ) { 04253 glColor3f( 1, 0, 0 ); 04254 glVertex3fv( vertexList[triIndices[i+2]].GetDataFloat() ); 04255 glVertex3fv( ( vertexList[triIndices[i+2]] + grad[triIndices[i+2]]*0.15 ).GetDataFloat() ); 04256 glColor3f( 0, 1, 0 ); 04257 glVertex3fv( vertexList[triIndices[i+1]].GetDataFloat() ); 04258 glVertex3fv( ( vertexList[triIndices[i+1]] + grad[triIndices[i+1]]*0.15 ).GetDataFloat() ); 04259 glColor3f( 0, 0, 1 ); 04260 glVertex3fv( vertexList[triIndices[i+0]].GetDataFloat() ); 04261 glVertex3fv( ( vertexList[triIndices[i+0]] + grad[triIndices[i+0]]*0.15 ).GetDataFloat() ); 04262 } 04263 glEnd(); 04264 glPopAttrib(); 04265 } 04266 //------------------------------- 04267 //*/ 04268 04269 //------------------------------- 04270 // Draw PN-Triangles generated 04271 // from Marching Cube Triangles 04272 if ( m_bDrawPNTriangle ) { 04273 int i = 0; 04274 while ( numOfTrisPerCell > 0 ) { 04275 PNTriangle<T>::DrawByOpenGL( 04276 vertexList[triIndices[i+2]], 04277 vertexList[triIndices[i+1]], 04278 vertexList[triIndices[i+0]], 04279 grad[triIndices[i+2]], 04280 grad[triIndices[i+1]], 04281 grad[triIndices[i+0]], 04282 texCoordList[triIndices[i+2]], 04283 texCoordList[triIndices[i+1]], 04284 texCoordList[triIndices[i+0]], 04285 m_PNTriangleSmoothness 04286 ); 04287 --numOfTrisPerCell; 04288 i += 3; 04289 } 04290 } 04291 // DEBUG for PNTri Drawing 04292 //glUseProgramObjectARB( g_PNTriProg ); 04293 // 04294 // DEBUG for PNTri Drawing 04295 //glUseProgramObjectARB( NULL ); 04296 04297 //------------------------------- 04298 // Draw Marching Cube Triangles 04299 else { 04300 04301 /* 04302 //************************************* 04303 // DEBUG 04304 { 04305 glPushAttrib( GL_ALL_ATTRIB_BITS ); 04306 glDisable( GL_LIGHTING ); 04307 glDisable( GL_BLEND ); 04308 glDisable( GL_TEXTURE_3D ); 04309 glColor3ub( 200, 50, 100 ); 04310 //glColor3f( 0.0, 0.0, 1.0 ); 04311 glBegin( GL_POINTS ); 04312 int count = numOfTrisPerCell; 04313 int i = 0; 04314 while ( count > 0 ) { 04315 //glTexCoord3fv( texCoordList[triIndices[i+2]].GetDataFloat() ); 04316 glColor3f( 1, 0, 0 ); 04317 glNormal3fv( grad[triIndices[i+2]].GetDataFloat() ); 04318 glVertex3fv( vertexList[triIndices[i+2]].GetDataFloat() ); 04319 // 04320 //glTexCoord3fv( texCoordList[triIndices[i+1]].GetDataFloat() ); 04321 glColor3f( 0, 1, 0 ); 04322 glNormal3fv( grad[triIndices[i+1]].GetDataFloat() ); 04323 glVertex3fv( vertexList[triIndices[i+1]].GetDataFloat() ); 04324 // 04325 //glTexCoord3fv( texCoordList[triIndices[i+0]].GetDataFloat() ); 04326 glColor3f( 0, 0, 1 ); 04327 glNormal3fv( grad[triIndices[i+0]].GetDataFloat() ); 04328 glVertex3fv( vertexList[triIndices[i+0]].GetDataFloat() ); 04329 // 04330 --count; 04331 i += 3; 04332 } 04333 glEnd(); 04334 glPopAttrib(); 04335 } 04336 //************************************* 04337 //*/ 04338 04339 //glBegin( GL_LINE_LOOP ); 04340 glBegin( GL_TRIANGLES ); 04341 int i = 0; 04342 while ( numOfTrisPerCell > 0 ) { 04343 glTexCoord3fv( texCoordList[triIndices[i+2]].GetDataFloat() ); 04344 glNormal3fv( grad[triIndices[i+2]].GetDataFloat() ); 04345 glVertex3fv( vertexList[triIndices[i+2]].GetDataFloat() ); 04346 // 04347 glTexCoord3fv( texCoordList[triIndices[i+1]].GetDataFloat() ); 04348 glNormal3fv( grad[triIndices[i+1]].GetDataFloat() ); 04349 glVertex3fv( vertexList[triIndices[i+1]].GetDataFloat() ); 04350 // 04351 glTexCoord3fv( texCoordList[triIndices[i+0]].GetDataFloat() ); 04352 glNormal3fv( grad[triIndices[i+0]].GetDataFloat() ); 04353 glVertex3fv( vertexList[triIndices[i+0]].GetDataFloat() ); 04354 // 04355 --numOfTrisPerCell; 04356 i += 3; 04357 } 04358 glEnd(); 04359 } 04360 04361 //#ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 04363 //if ( isFirstRun ) { 04364 // if ( cubeClass < 100 ) std::cout << " "; 04365 // if ( cubeClass < 10 ) std::cout << " "; 04366 // std::cout << " " << static_cast<int>( cubeClass ); 04367 //} 04368 //#endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 04369 04370 } // END: // TWO ITERATIONS FOR LEFT AND RIGHT CUBE CONFIGURATIONS 04371 04372 //------------------------------- 04373 // Next Cell 04374 for ( i = 0; i < 8; ++i ) { 04375 idx[i] += 4; 04376 // 04377 intpIdx[i] += 3; 04378 } 04379 //------------------------------- 04380 04381 } // END: for loop for X 04382 04383 //#ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 04385 //if ( isFirstRun ) std::cout << "\n"; 04386 //#endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 04387 04388 } // END: for loop for Y 04389 04390 //#ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 04392 //if ( isFirstRun ) std::cout << "\n"; 04393 //#endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 04394 04395 } // END: for loop for Z 04396 04397 //#ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 04399 //if ( isFirstRun ) { 04400 // std::cout << "-------------------------\n"; 04401 //} 04403 //#endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 04404 04405 glPopAttrib(); 04406 04407 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_SHADER_FOR_SHADING_SURFACE_FROM_SW 04408 m_glslProgramObjectForShaderSurfaceFromSW->EndGLSL(); 04409 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_SHADER_FOR_SHADING_SURFACE_FROM_SW 04410 //--------------------------------------------------------------- 04411 //=============================================================== 04412 //*/ 04413 04414 //--------------------------------------------------------------- 04415 //=============================================================== 04416 delete [] dataForPosition; 04417 delete [] dataForEllipsoidInfluence; 04418 } 04419 //----------------------------------------------------------------------------- 04420 // END: DrawByGL_StandardMC 04421 //***************************************************************************** 04422 04423 04427 //***************************************************************************** 04428 // BEGIN: DrawByGL 04429 //----------------------------------------------------------------------------- 04430 template <typename T> 04431 void ModelDeformableGLSL_Visualization_RTGenMesh<T>::DrawByGL () 04432 { 04444 //--------------------------------------------------------------- 04445 // For fixed length (by interpolation) after cutting 04446 const Vector3<T> CUBE_DIMENSIONS = m_SimDomain->RetGridDimension(); 04447 //--------------------------------------------------------------- 04448 04449 //* 04450 //--------------------------------------------------------------- 04451 #ifdef TAPs_DEBUG_MODE 04452 if ( !m_SimDomain ) return; 04453 //--------------------------------------------------------------- 04454 if ( !m_SimDomain->RetObject3DTexturePosition() ) return; 04455 //--------------------------------------------------------------- 04456 #endif 04457 //=============================================================== 04458 // Read data from GPU -- Positions 04459 //--------------------------------------------------------------- 04460 Texture * texture3DPosition = m_SimDomain->RetObject3DTexturePosition(); 04461 //--------------------------------------------------------------- 04462 glPushAttrib( GL_ALL_ATTRIB_BITS ); 04463 //----------------------------------------------------- 04464 GLsizei sizeForPosition = 04465 texture3DPosition->GetWidth() * 04466 texture3DPosition->GetHeight() * 04467 texture3DPosition->GetDepth() * 04468 texture3DPosition->GetInternalFormatNumberOfComponents(); 04469 GLfloat * dataForPosition = new GLfloat[ sizeForPosition ]; 04470 { 04471 int i = 0; 04472 //================================================= 04473 // Read data for positions from a texture to memory 04474 glBindBuffer( GL_PIXEL_PACK_BUFFER, 0 ); 04475 texture3DPosition->BindTexture(0); 04476 glGetTexImage( 04477 texture3DPosition->GetTarget(), 04478 texture3DPosition->GetLevel(), 04479 texture3DPosition->GetPixelFormat(), 04480 texture3DPosition->GetDataType(), 04481 dataForPosition 04482 ); 04483 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 04484 //================================================= 04485 } 04486 //--------------------------------------------------------------- 04487 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 04488 //----------------------------------------------------- 04489 glPopAttrib(); 04490 //--------------------------------------------------------------- 04491 //=============================================================== 04492 04493 //=============================================================== 04494 // Read data from GPU -- Ellipsoid Influence 04495 //--------------------------------------------------------------- 04496 Texture * texture3DEllipsoidInfluence = m_SimDomain->RetObject3DTextureEllipsoidInfluence(); 04497 //--------------------------------------------------------------- 04498 glPushAttrib( GL_ALL_ATTRIB_BITS ); 04499 //----------------------------------------------------- 04500 GLsizei sizeForEllipsoidInfluence = 04501 texture3DEllipsoidInfluence->GetWidth() * 04502 texture3DEllipsoidInfluence->GetHeight() * 04503 texture3DEllipsoidInfluence->GetDepth() * 04504 texture3DEllipsoidInfluence->GetInternalFormatNumberOfComponents(); 04505 //std::cout << "sizeForEllipsoidInfluence: " << sizeForEllipsoidInfluence << "\n"; 04506 GLfloat * dataForEllipsoidInfluence = new GLfloat[ sizeForEllipsoidInfluence ]; 04507 { 04508 int i = 0; 04509 //================================================= 04510 // Read data for ellipsoid influences from a texture to memory 04511 glBindBuffer( GL_PIXEL_PACK_BUFFER, 0 ); 04512 texture3DEllipsoidInfluence->BindTexture(0); 04513 glGetTexImage( 04514 texture3DEllipsoidInfluence->GetTarget(), 04515 texture3DEllipsoidInfluence->GetLevel(), 04516 texture3DEllipsoidInfluence->GetPixelFormat(), 04517 texture3DEllipsoidInfluence->GetDataType(), 04518 dataForEllipsoidInfluence 04519 ); 04520 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 04521 //================================================= 04522 } 04523 //--------------------------------------------------------------- 04524 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 04525 //----------------------------------------------------- 04526 glPopAttrib(); 04527 //--------------------------------------------------------------- 04528 //=============================================================== 04529 04530 //--------------------------------- 04531 Vector3<int> gridResolution = m_SimDomain->GetGridResolution(); 04532 Vector3<T> gridDimension = m_SimDomain->GetGridDimension(); 04533 //--------------------------------- 04534 04535 //* 04536 //=============================================================== 04537 // Draw by Marching Cube 04538 //--------------------------------------------------------------- 04539 // Adapted from "Polygonising a scalar field" by Paul Bourke (1994) 04540 // http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/ 04541 //--------------------------------------------------------------- 04542 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_SHADER_FOR_SHADING_SURFACE_FROM_SW 04543 m_glslProgramObjectForShaderSurfaceFromSW->BeginGLSL(); 04544 if ( m_3DTexture ) { 04545 glActiveTexture( GL_TEXTURE0 ); 04546 glBindTexture( GL_TEXTURE_3D, m_3DTexture ); 04547 m_glslProgramObjectForShaderSurfaceFromSW->SetUniform1i( "SurfaceTexture", 0 ); 04548 TAPs::OpenGL::Fn::CHECK_GL_ERROR(); 04549 } 04550 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_SHADER_FOR_SHADING_SURFACE_FROM_SW 04551 04552 glPushAttrib( GL_ALL_ATTRIB_BITS ); 04553 //glLineWidth( 2 ); 04554 glPointSize( 5 ); 04555 04556 //glColor3ub( 240/2, 220/2, 130/2 ); 04557 //glColor3ub( 240/8, 220/8, 130/8 ); 04558 //glColor3ub( 65, 65, 65 ); 04559 04560 glColor3ub( 75, 75, 75 ); 04561 04562 //glColor3ub( 150, 150, 150 ); 04563 //glColor3ub( 255, 255, 255 ); 04564 04565 //glEnable( GL_COLOR_MATERIAL ); 04566 04567 /* 04568 GLfloat diffuseMaterial[4] = { 0.5f, 0.5f, 0.5f, 1.0f }; 04569 GLfloat specularMaterial[4] = { 0.8f, 0.8f, 0.8f, 1.0f }; 04570 GLfloat ambientMaterial[4] = { 0.1f, 0.1f, 0.1f, 1.0f }; 04571 GLfloat shininessMaterial[] = { 128.0 }; 04572 glMaterialfv( GL_FRONT, GL_AMBIENT, ambientMaterial ); 04573 glMaterialfv( GL_FRONT, GL_SPECULAR, specularMaterial ); 04574 glMaterialfv( GL_FRONT, GL_DIFFUSE, diffuseMaterial ); 04575 glMaterialfv( GL_FRONT, GL_SHININESS, diffuseMaterial ); 04576 //*/ 04577 04578 glEnable( GL_LIGHTING ); 04579 //glDisable( GL_LIGHTING ); 04580 04581 // DEBUG for two-sided lighting 04582 glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE ); 04583 04584 //--------------------------------------------------------------- 04585 // Texture Parameter Setup 04586 04587 /* 04588 // 3D Texture for surface 04589 glEnable( GL_TEXTURE_3D ); 04590 glBindTexture( GL_TEXTURE_3D, m_3DTexture ); 04591 //*/ 04592 04593 // Composition 04594 glEnable( GL_BLEND ); 04595 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); 04596 glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); 04597 //glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND ); 04598 //glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL ); 04599 //glTexEnvf( GL_TEXTURE_ENV, GL_RGB_SCALE, 0.5 ); 04600 //glTexEnvf( GL_TEXTURE_ENV, GL_ALPHA_SCALE, 0.5 ); 04601 //glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD ); 04602 04603 /* 04604 static GLfloat constColor[4] = { 0.0, 0.0, 0.0, 0.0 }; 04605 constColor[3] = 0.2; 04606 glTexEnvfv( GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constColor ); 04607 glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE ); 04608 glTexEnvf( GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE ); 04609 glTexEnvf( GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE ); 04610 glTexEnvf( GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR ); 04611 glTexEnvf( GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS ); 04612 glTexEnvf( GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR ); 04613 glTexEnvf( GL_TEXTURE_ENV, GL_SRC2_RGB, GL_PREVIOUS ); 04614 glTexEnvf( GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA ); 04615 //*/ 04616 04617 //--------------------------------------------------------------- 04618 int iOffsetSlice = gridResolution[1] * gridResolution[0] * 4; 04619 int iOffsetRow = gridResolution[0] * 4; 04620 int iOffsetCol = 4; 04621 //--------------------------------- 04622 // Vertex & Edge Index 04623 // 3------2------2 04624 // /| /| 04625 // 11 | 10 | 04626 // / 3 / 1 04627 // 7------6------6 | 04628 // | | | | 04629 // | 0------0--|---1 04630 // 7 / 5 / 04631 // | 8 | 9 04632 // |/ |/ 04633 // 4------4------5 04634 //--------------------------------- 04635 // Edge Table [256] & Triangle Table [256][16] 04643 // V = V1 + (isovalue - s1) (V2 - V1) / (s2 - s1) 04644 //--------------------------------- 04645 //unsigned char cubeClass = 0; 04646 //if ( grid.val[0] < isolevel ) cubeClass |= 1; 04647 //if ( grid.val[1] < isolevel ) cubeClass |= 2; 04648 //if ( grid.val[2] < isolevel ) cubeClass |= 4; 04649 //if ( grid.val[3] < isolevel ) cubeClass |= 8; 04650 //if ( grid.val[4] < isolevel ) cubeClass |= 16; 04651 //if ( grid.val[5] < isolevel ) cubeClass |= 32; 04652 //if ( grid.val[6] < isolevel ) cubeClass |= 64; 04653 //if ( grid.val[7] < isolevel ) cubeClass |= 128; 04654 //--------------------------------- 04655 int numOfTrisPerCell = 0; // number of triangles in the cell 04656 int triIndices[15]; // at most 5 triangles 04657 Vector3<T> V[8]; // vertices of the cell 04658 Vector3<T> VTC[8]; // texture coordinates of the vertices 04659 Vector3<T> texCoordList[12]; // since 12 edges 04660 Vector3<T> vertexList[12]; // since 12 edges 04661 int bV[12]; // >=0 if the vertex is counted (e.g. on boundary, existing, etc.) 04662 Vector3<T> grad[12]; // gradients of vertices 04663 //Vector3<T> texCoords[12]; // 04664 Vector3<T> Center;//, nE, nW, nN, nS, nF, nB; // center and its neighbors for gradient computation 04665 //--------------------------------- 04666 int idx[8], d, i; 04667 unsigned char cubeClass = 0; 04668 T threshold = 250; 04669 // 04670 T tc[3]; 04671 T tcStep[3] = { 04672 1.0 / static_cast<T>( gridResolution[0]-1 ), 04673 1.0 / static_cast<T>( gridResolution[1]-1 ), 04674 1.0 / static_cast<T>( gridResolution[2]-1 ) 04675 }; 04676 // 04677 04678 //----------------------------------------------------- 04679 // For Interpolation Data used by Marching Cube 04680 int iOffsetSliceIntp = gridResolution[1] * gridResolution[0] * 3; 04681 int iOffsetRowIntp = gridResolution[0] * 3; 04682 int iOffsetColIntp = 3; 04683 int intpIdx[8]; 04684 Vector3<T> VIntp[8]; // Interpolation Data (XYZ) 04685 //----------------------------------------------------- 04686 04687 //--------------------------------- 04688 //for ( int Z = gridResolution[2]*3/4; Z < gridResolution[2]-1; ++Z ) { 04689 for ( int Z = 0; Z < gridResolution[2]-1; ++Z ) { 04690 // 04691 // For Interpolation Data 04692 int offsetZIntp = Z * iOffsetSliceIntp; 04693 // 04694 int offsetZ = Z * iOffsetSlice; 04695 // 04696 // Texture Coordinates -- Z 04697 tc[2] = static_cast<T>( Z ) / static_cast<T>( gridResolution[2]-1 ); 04698 VTC[0].SetZ( tc[2] ); 04699 VTC[1].SetZ( tc[2] ); 04700 VTC[2].SetZ( tc[2] ); 04701 VTC[3].SetZ( tc[2] ); 04702 tc[2] += tcStep[2]; 04703 VTC[4].SetZ( tc[2] ); 04704 VTC[5].SetZ( tc[2] ); 04705 VTC[6].SetZ( tc[2] ); 04706 VTC[7].SetZ( tc[2] ); 04707 // 04708 //for ( int Y = gridResolution[1]; Y < gridResolution[1]-1; ++Y ) { 04709 for ( int Y = 0; Y < gridResolution[1]-1; ++Y ) { 04710 // 04711 // Set Indices for Interpolation Data 04712 int offsetYZIntp = Y * iOffsetRowIntp + offsetZIntp; 04713 intpIdx[0] = offsetYZIntp;; 04714 intpIdx[1] = intpIdx[0] + iOffsetColIntp; 04715 intpIdx[2] = intpIdx[1] + iOffsetRowIntp; 04716 intpIdx[3] = intpIdx[0] + iOffsetRowIntp; 04717 intpIdx[4] = intpIdx[0] + iOffsetSliceIntp; 04718 intpIdx[5] = intpIdx[4] + iOffsetColIntp; 04719 intpIdx[6] = intpIdx[5] + iOffsetRowIntp; 04720 intpIdx[7] = intpIdx[4] + iOffsetRowIntp; 04721 // 04722 // Set Indices for Cube Vertices 04723 int offsetYZ = Y * iOffsetRow + offsetZ; 04724 idx[0] = offsetYZ; 04725 idx[1] = idx[0] + iOffsetCol; 04726 idx[2] = idx[1] + iOffsetRow; 04727 idx[3] = idx[0] + iOffsetRow; 04728 idx[4] = idx[0] + iOffsetSlice; 04729 idx[5] = idx[4] + iOffsetCol; 04730 idx[6] = idx[5] + iOffsetRow; 04731 idx[7] = idx[4] + iOffsetRow; 04732 // 04733 // Texture Coordinates -- Y 04734 tc[1] = static_cast<T>( Y ) / static_cast<T>( gridResolution[1]-1 ); 04735 VTC[0].SetY( tc[1] ); 04736 VTC[1].SetY( tc[1] ); 04737 VTC[4].SetY( tc[1] ); 04738 VTC[5].SetY( tc[1] ); 04739 tc[1] += tcStep[1]; 04740 VTC[2].SetY( tc[1] ); 04741 VTC[3].SetY( tc[1] ); 04742 VTC[6].SetY( tc[1] ); 04743 VTC[7].SetY( tc[1] ); 04744 // 04745 for ( int X = 0; X < gridResolution[0]-1; ++X ) { 04746 // 04747 // Texture Coordinates -- X 04748 tc[0] = static_cast<T>( X ) / static_cast<T>( gridResolution[0]-1 ); 04749 VTC[0].SetX( tc[0] ); 04750 VTC[3].SetX( tc[0] ); 04751 VTC[4].SetX( tc[0] ); 04752 VTC[7].SetX( tc[0] ); 04753 tc[0] += tcStep[0]; 04754 VTC[1].SetX( tc[0] ); 04755 VTC[2].SetX( tc[0] ); 04756 VTC[5].SetX( tc[0] ); 04757 VTC[6].SetX( tc[0] ); 04758 // 04759 04760 04761 bool bLeftPresent = false; 04762 bool bRightPresent = false; 04763 { 04764 for ( int i = 0; i < 8; ++i ) { 04765 int flagVal = static_cast<int>( dataForPosition[idx[i] + 3] ); 04766 if ( flagVal > threshold ) { 04767 flagVal %= int( m_SimDomain->IC_Thresholds::FLAG_STEP ); 04768 if ( 1 < flagVal && flagVal < m_SimDomain->IC_Thresholds::MC_LEFT_ADD+1 ) { 04769 bLeftPresent = true; 04770 } 04771 else if ( flagVal > m_SimDomain->IC_Thresholds::MC_LEFT_ADD+1 ) { 04772 bRightPresent = true; 04773 } 04774 } 04775 } 04776 } 04777 04778 //* 04779 // STANDARD CUBE CONFIGURATION 04780 //------------------------------- 04781 // Determine the threshold of each vertex of the cube 04782 cubeClass = 0; 04783 if ( dataForPosition[idx[0] + 3] > threshold ) cubeClass |= 1; 04784 if ( dataForPosition[idx[1] + 3] > threshold ) cubeClass |= 2; 04785 if ( dataForPosition[idx[2] + 3] > threshold ) cubeClass |= 4; 04786 if ( dataForPosition[idx[3] + 3] > threshold ) cubeClass |= 8; 04787 if ( dataForPosition[idx[4] + 3] > threshold ) cubeClass |= 16; 04788 if ( dataForPosition[idx[5] + 3] > threshold ) cubeClass |= 32; 04789 if ( dataForPosition[idx[6] + 3] > threshold ) cubeClass |= 64; 04790 if ( dataForPosition[idx[7] + 3] > threshold ) cubeClass |= 128; 04791 //------------------------------- 04792 //*/ 04793 04794 //=============================================== 04795 // Calculate Gradients 04796 //----------------------------------------------- 04797 Vector3<T> G[8]; 04798 int index; 04799 for ( int vID = 0; vID < 8; ++vID ) { 04800 Center.SetXYZ( dataForPosition[idx[vID] ], 04801 dataForPosition[idx[vID]+1], 04802 dataForPosition[idx[vID]+2] ); 04803 G[vID].SetXYZ( 0, 0, 0 ); 04804 04805 //* 04806 //================================= 04807 // START: 6 Face Gradients 04808 //--------------------------------- 04809 if ( GetGradientComputationByFacesStatus() ) { 04810 //--- East -------------- 04811 if ( X < gridResolution[0]-2 ) { 04812 index = idx[vID] + iOffsetCol; 04813 if ( dataForPosition[index+3] > threshold ) { 04814 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 04815 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 04816 G[vID] += Center - vGrad; 04817 } 04818 } 04819 //--- West -------------- 04820 if ( X > 0 ) { 04821 index = idx[vID] - iOffsetCol; 04822 if ( dataForPosition[index+3] > threshold ) { 04823 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 04824 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 04825 G[vID] += Center - vGrad; 04826 } 04827 } 04828 //--- North ------------- 04829 if ( Y < gridResolution[1]-2 ) { 04830 index = idx[vID] + iOffsetRow; 04831 if ( dataForPosition[index+3] > threshold ) { 04832 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 04833 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 04834 G[vID] += Center - vGrad; 04835 } 04836 } 04837 //--- South ------------- 04838 if ( Y > 0 ) { 04839 index = idx[vID] - iOffsetRow; 04840 if ( dataForPosition[index+3] > threshold ) { 04841 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 04842 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 04843 G[vID] += Center - vGrad; 04844 } 04845 } 04846 //--- Front ------------- 04847 if ( Z < gridResolution[2]-2 ) { 04848 index = idx[vID] + iOffsetSlice; 04849 if ( dataForPosition[index+3] > threshold ) { 04850 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 04851 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 04852 G[vID] += Center - vGrad; 04853 } 04854 } 04855 //--- Back -------------- 04856 if ( Z > 0 ) { 04857 index = idx[vID] - iOffsetSlice; 04858 if ( dataForPosition[index+3] > threshold ) { 04859 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 04860 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 04861 G[vID] += Center - vGrad; 04862 } 04863 } 04864 //----------------------- 04865 } // END: if ( GetGradientComputationByFacesStatus() ) { 04866 //--------------------------------- 04867 // END: 6 Face Gradients 04868 //================================= 04869 //*/ 04870 04871 //* 04872 //================================= 04873 // START: 8 Vertex Gradients 04874 //--------------------------------- 04875 if ( GetGradientComputationByVerticesStatus() ) { 04876 //--- Front ------------- 04877 if ( Z < gridResolution[2]-2 ) { 04878 int idxF = idx[vID] + iOffsetSlice; 04879 //-- North ----- 04880 if ( Y < gridResolution[1]-2 ) { 04881 int idxFN = idxF + iOffsetRow; 04882 //- West 04883 if ( X > 0 ) { 04884 index = idxFN - iOffsetCol; 04885 if ( dataForPosition[index+3] > threshold ) { 04886 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 04887 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 04888 G[vID] += Center - vGrad; 04889 } 04890 } 04891 //- East 04892 if ( X < gridResolution[0]-2 ) { 04893 index = idxFN + iOffsetCol; 04894 if ( dataForPosition[index+3] > threshold ) { 04895 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 04896 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 04897 G[vID] += Center - vGrad; 04898 } 04899 } 04900 } 04901 //-- South ----- 04902 if ( Y > 0 ) { 04903 int idxFS = idxF - iOffsetRow; 04904 //- West 04905 if ( X > 0 ) { 04906 index = idxFS - iOffsetCol; 04907 if ( dataForPosition[index+3] > threshold ) { 04908 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 04909 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 04910 G[vID] += Center - vGrad; 04911 } 04912 } 04913 //- East 04914 if ( X < gridResolution[0]-2 ) { 04915 index = idxFS + iOffsetCol; 04916 if ( dataForPosition[index+3] > threshold ) { 04917 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 04918 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 04919 G[vID] += Center - vGrad; 04920 } 04921 } 04922 } 04923 } 04924 //--- Back -------------- 04925 if ( Z > 0 ) { 04926 int idxF = idx[vID] - iOffsetSlice; 04927 //-- North ----- 04928 if ( Y < gridResolution[1]-2 ) { 04929 int idxFN = idxF + iOffsetRow; 04930 //- West 04931 if ( X > 0 ) { 04932 index = idxFN - iOffsetCol; 04933 if ( dataForPosition[index+3] > threshold ) { 04934 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 04935 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 04936 G[vID] += Center - vGrad; 04937 } 04938 } 04939 //- East 04940 if ( X < gridResolution[0]-2 ) { 04941 index = idxFN + iOffsetCol; 04942 if ( dataForPosition[index+3] > threshold ) { 04943 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 04944 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 04945 G[vID] += Center - vGrad; 04946 } 04947 } 04948 } 04949 //-- South ----- 04950 if ( Y > 0 ) { 04951 int idxFS = idxF - iOffsetRow; 04952 //- West 04953 if ( X > 0 ) { 04954 index = idxFS - iOffsetCol; 04955 if ( dataForPosition[index+3] > threshold ) { 04956 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 04957 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 04958 G[vID] += Center - vGrad; 04959 } 04960 } 04961 //- East 04962 if ( X < gridResolution[0]-2 ) { 04963 index = idxFS + iOffsetCol; 04964 if ( dataForPosition[index+3] > threshold ) { 04965 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 04966 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 04967 G[vID] += Center - vGrad; 04968 } 04969 } 04970 } 04971 } 04972 //----------------------- 04973 } // END: if ( GetGradientComputationByVerticesStatus() ) { 04974 //--------------------------------- 04975 // END: 8 Vertex Gradients 04976 //================================= 04977 //*/ 04978 04979 //* 04980 //================================= 04981 // START: 12 Edge Gradients 04982 //--------------------------------- 04983 if ( GetGradientComputationByEdgesStatus() ) { 04984 //--- Front ------------- 04985 if ( Z < gridResolution[2]-2 ) { 04986 int idxF = idx[vID] + iOffsetSlice; 04987 //-- East ------ 04988 if ( X < gridResolution[0]-2 ) { 04989 index = idxF + iOffsetCol; 04990 if ( dataForPosition[index+3] > threshold ) { 04991 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 04992 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 04993 G[vID] += Center - vGrad; 04994 } 04995 } 04996 //-- West ------ 04997 if ( X > 0 ) { 04998 index = idxF - iOffsetCol; 04999 if ( dataForPosition[index+3] > threshold ) { 05000 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 05001 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 05002 G[vID] += Center - vGrad; 05003 } 05004 } 05005 //-- North ----- 05006 if ( Y < gridResolution[1]-2 ) { 05007 index = idxF + iOffsetRow; 05008 if ( dataForPosition[index+3] > threshold ) { 05009 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 05010 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 05011 G[vID] += Center - vGrad; 05012 } 05013 } 05014 //-- South ----- 05015 if ( Y > 0 ) { 05016 index = idxF - iOffsetRow; 05017 if ( dataForPosition[index+3] > threshold ) { 05018 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 05019 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 05020 G[vID] += Center - vGrad; 05021 } 05022 } 05023 } 05024 //--- Center ------------ 05025 if ( true ) { 05026 int idxC = idx[vID]; 05027 //-- East ------ 05028 if ( X < gridResolution[0]-2 ) { 05029 index = idxC + iOffsetCol; 05030 if ( dataForPosition[index+3] > threshold ) { 05031 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 05032 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 05033 G[vID] += Center - vGrad; 05034 } 05035 } 05036 //-- West ------ 05037 if ( X > 0 ) { 05038 index = idxC - iOffsetCol; 05039 if ( dataForPosition[index+3] > threshold ) { 05040 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 05041 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 05042 G[vID] += Center - vGrad; 05043 } 05044 } 05045 //-- North ----- 05046 if ( Y < gridResolution[1]-2 ) { 05047 index = idxC + iOffsetRow; 05048 if ( dataForPosition[index+3] > threshold ) { 05049 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 05050 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 05051 G[vID] += Center - vGrad; 05052 } 05053 } 05054 //-- South ----- 05055 if ( Y > 0 ) { 05056 index = idxC - iOffsetRow; 05057 if ( dataForPosition[index+3] > threshold ) { 05058 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 05059 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 05060 G[vID] += Center - vGrad; 05061 } 05062 } 05063 } 05064 //--- Back -------------- 05065 if ( Z > 0 ) { 05066 int idxB = idx[vID] - iOffsetSlice; 05067 //-- East ------ 05068 if ( X < gridResolution[0]-2 ) { 05069 index = idxB + iOffsetCol; 05070 if ( dataForPosition[index+3] > threshold ) { 05071 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 05072 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 05073 G[vID] += Center - vGrad; 05074 } 05075 } 05076 //-- West ------ 05077 if ( X > 0 ) { 05078 index = idxB - iOffsetCol; 05079 if ( dataForPosition[index+3] > threshold ) { 05080 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 05081 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 05082 G[vID] += Center - vGrad; 05083 } 05084 } 05085 //-- North ----- 05086 if ( Y < gridResolution[1]-2 ) { 05087 index = idxB + iOffsetRow; 05088 if ( dataForPosition[index+3] > threshold ) { 05089 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 05090 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 05091 G[vID] += Center - vGrad; 05092 } 05093 } 05094 //-- South ----- 05095 if ( Y > 0 ) { 05096 index = idxB - iOffsetRow; 05097 if ( dataForPosition[index+3] > threshold ) { 05098 int iFlag = static_cast<int>( dataForPosition[index+3] ) % m_SimDomain->IC_Thresholds::FLAG_STEP; 05099 Vector3<T> vGrad( dataForPosition[index], dataForPosition[index+1], dataForPosition[index+2] ); 05100 G[vID] += Center - vGrad; 05101 } 05102 } 05103 } 05104 //----------------------- 05105 } // END: if ( GetGradientComputationByEdgesStatus() ) { 05106 //--------------------------------- 05107 // END: 12 Edge Gradients 05108 //================================= 05109 //*/ 05110 } 05111 //----------------------------------------------- 05112 // END: Calculate Gradients 05113 //=============================================== 05114 05115 { 05116 //* 05117 //----------------- 05118 for ( i = 0; i < 8; ++i ) { 05119 V[i].SetXYZ( 05120 dataForPosition[idx[i] ], 05121 dataForPosition[idx[i] + 1], 05122 dataForPosition[idx[i] + 2] 05123 ); 05124 } 05125 //----------------- 05126 // Reset list of existing vertices 05127 for ( i = 0; i < 12; ++i ) { 05128 bV[i] = -1; 05129 } 05130 05131 //----------------- 05132 // Interpolation Data 05133 for ( i = 0; i < 8; ++i ) { 05134 VIntp[i].SetXYZ( 05135 dataForEllipsoidInfluence[intpIdx[i] ], 05136 dataForEllipsoidInfluence[intpIdx[i] + 1], 05137 dataForEllipsoidInfluence[intpIdx[i] + 2] 05138 ); 05139 } 05140 //*/ 05141 05142 T interpolationValPlus; 05143 T interpolationValNeg; 05144 if ( EdgeTable[cubeClass] & 1 ) { 05145 if ( dataForPosition[idx[0] + 3] > threshold ) { 05146 // 05147 // Interpotation Data 05148 interpolationValPlus = VIntp[0].GetX(); 05149 // 05150 vertexList[ 0] = V[0] + interpolationValPlus*(V[1] - V[0]);//.Normalized()*CUBE_DIMENSIONS[0]; 05151 grad[0] = G[0] + interpolationValPlus*(G[1] - G[0]);//.Normalized()*CUBE_DIMENSIONS[0]; 05152 texCoordList[0] = VTC[0] + interpolationValPlus*(VTC[1] - VTC[0]);//.Normalized()*CUBE_DIMENSIONS[0]; 05153 } 05154 else { 05155 // 05156 // Interpotation Data 05157 interpolationValNeg = -VIntp[1].GetX(); 05158 // 05159 vertexList[ 0] = V[1] + interpolationValNeg*(V[1] - V[0]);//.Normalized()*CUBE_DIMENSIONS[0]; 05160 grad[0] = G[1] + interpolationValNeg*(G[1] - G[0]);//.Normalized()*CUBE_DIMENSIONS[0]; 05161 texCoordList[0] = VTC[1] + interpolationValNeg*(VTC[1] - VTC[0]);//.Normalized()*CUBE_DIMENSIONS[0]; 05162 } 05163 grad[0].Normalized(); 05164 } 05165 if ( EdgeTable[cubeClass] & 2 ) { 05166 if ( dataForPosition[idx[1] + 3] > threshold ) { 05167 // 05168 // Interpotation Data 05169 interpolationValPlus = VIntp[1].GetY(); 05170 // 05171 vertexList[ 1] = V[1] + interpolationValPlus*(V[2] - V[1]);//.Normalized()*CUBE_DIMENSIONS[1]; 05172 grad[1] = G[1] + interpolationValPlus*(G[2] - G[1]);//.Normalized()*CUBE_DIMENSIONS[1]; 05173 texCoordList[1] = VTC[1] + interpolationValPlus*(VTC[2] - VTC[1]);//.Normalized()*CUBE_DIMENSIONS[1]; 05174 } 05175 else { 05176 // 05177 // Interpotation Data 05178 interpolationValNeg = -VIntp[2].GetY(); 05179 // 05180 vertexList[ 1] = V[2] + interpolationValNeg*(V[2] - V[1]);//.Normalized()*CUBE_DIMENSIONS[1]; 05181 grad[1] = G[2] + interpolationValNeg*(G[2] - G[1]);//.Normalized()*CUBE_DIMENSIONS[1]; 05182 texCoordList[1] = VTC[2] + interpolationValNeg*(VTC[2] - VTC[1]);//.Normalized()*CUBE_DIMENSIONS[1]; 05183 } 05184 grad[1].Normalized(); 05185 } 05186 if ( EdgeTable[cubeClass] & 4 ) { 05187 if ( dataForPosition[idx[2] + 3] > threshold ) { 05188 // 05189 // Interpotation Data 05190 interpolationValPlus = VIntp[2].GetX(); 05191 // 05192 vertexList[ 2] = V[2] + interpolationValPlus*(V[3] - V[2]);//.Normalized()*CUBE_DIMENSIONS[0]; 05193 grad[2] = G[2] + interpolationValPlus*(G[3] - G[2]);//.Normalized()*CUBE_DIMENSIONS[0]; 05194 texCoordList[2] = VTC[2] + interpolationValPlus*(VTC[3] - VTC[2]);//.Normalized()*CUBE_DIMENSIONS[0]; 05195 } 05196 else { 05197 // 05198 // Interpotation Data 05199 interpolationValNeg = -VIntp[3].GetX(); 05200 // 05201 vertexList[ 2] = V[3] + interpolationValNeg*(V[3] - V[2]);//.Normalized()*CUBE_DIMENSIONS[0]; 05202 grad[2] = G[3] + interpolationValNeg*(G[3] - G[2]);//.Normalized()*CUBE_DIMENSIONS[0]; 05203 texCoordList[2] = VTC[3] + interpolationValNeg*(VTC[3] - VTC[2]);//.Normalized()*CUBE_DIMENSIONS[0]; 05204 } 05205 grad[2].Normalized(); 05206 } 05207 if ( EdgeTable[cubeClass] & 8 ) { 05208 if ( dataForPosition[idx[0] + 3] > threshold ) { 05209 // 05210 // Interpotation Data 05211 interpolationValPlus = VIntp[0].GetY(); 05212 // 05213 vertexList[ 3] = V[0] + interpolationValPlus*(V[3] - V[0]);//.Normalized()*CUBE_DIMENSIONS[1]; 05214 grad[3] = G[0] + interpolationValPlus*(G[3] - G[0]);//.Normalized()*CUBE_DIMENSIONS[1]; 05215 texCoordList[3] = VTC[0] + interpolationValPlus*(VTC[3] - VTC[0]);//.Normalized()*CUBE_DIMENSIONS[1]; 05216 } 05217 else { 05218 // 05219 // Interpotation Data 05220 interpolationValNeg = -VIntp[3].GetY(); 05221 // 05222 vertexList[ 3] = V[3] + interpolationValNeg*(V[3] - V[0]);//.Normalized()*CUBE_DIMENSIONS[1]; 05223 grad[3] = G[3] + interpolationValNeg*(G[3] - G[0]);//.Normalized()*CUBE_DIMENSIONS[1]; 05224 texCoordList[3] = VTC[3] + interpolationValNeg*(VTC[3] - VTC[0]);//.Normalized()*CUBE_DIMENSIONS[1]; 05225 } 05226 grad[3].Normalized(); 05227 } 05228 if ( EdgeTable[cubeClass] & 16 ) { 05229 if ( dataForPosition[idx[4] + 3] > threshold ) { 05230 // 05231 // Interpotation Data 05232 interpolationValPlus = VIntp[4].GetX(); 05233 // 05234 vertexList[ 4] = V[4] + interpolationValPlus*(V[5] - V[4]);//.Normalized()*CUBE_DIMENSIONS[0]; 05235 grad[4] = G[4] + interpolationValPlus*(G[5] - G[4]);//.Normalized()*CUBE_DIMENSIONS[0]; 05236 texCoordList[4] = VTC[4] + interpolationValPlus*(VTC[5] - VTC[4]);//.Normalized()*CUBE_DIMENSIONS[0]; 05237 } 05238 else { 05239 // 05240 // Interpotation Data 05241 interpolationValNeg = -VIntp[5].GetX(); 05242 // 05243 vertexList[ 4] = V[5] + interpolationValNeg*(V[5] - V[4]);//.Normalized()*CUBE_DIMENSIONS[0]; 05244 grad[4] = G[5] + interpolationValNeg*(G[5] - G[4]);//.Normalized()*CUBE_DIMENSIONS[0]; 05245 texCoordList[4] = VTC[5] + interpolationValNeg*(VTC[5] - VTC[4]);//.Normalized()*CUBE_DIMENSIONS[0]; 05246 } 05247 grad[4].Normalized(); 05248 } 05249 if ( EdgeTable[cubeClass] & 32 ) { 05250 if ( dataForPosition[idx[5] + 3] > threshold ) { 05251 // 05252 // Interpotation Data 05253 interpolationValPlus = VIntp[5].GetY(); 05254 // 05255 vertexList[ 5] = V[5] + interpolationValPlus*(V[6] - V[5]);//.Normalized()*CUBE_DIMENSIONS[1]; 05256 grad[5] = G[5] + interpolationValPlus*(G[6] - G[5]);//.Normalized()*CUBE_DIMENSIONS[1]; 05257 texCoordList[5] = VTC[5] + interpolationValPlus*(VTC[6] - VTC[5]);//.Normalized()*CUBE_DIMENSIONS[1]; 05258 } 05259 else { 05260 // 05261 // Interpotation Data 05262 interpolationValNeg = -VIntp[6].GetY(); 05263 // 05264 vertexList[ 5] = V[6] + interpolationValNeg*(V[6] - V[5]);//.Normalized()*CUBE_DIMENSIONS[1]; 05265 grad[5] = G[6] + interpolationValNeg*(G[6] - G[5]);//.Normalized()*CUBE_DIMENSIONS[1]; 05266 texCoordList[5] = VTC[6] + interpolationValNeg*(VTC[6] - VTC[5]);//.Normalized()*CUBE_DIMENSIONS[1]; 05267 } 05268 grad[5].Normalized(); 05269 } 05270 if ( EdgeTable[cubeClass] & 64 ) { 05271 if ( dataForPosition[idx[6] + 3] > threshold ) { 05272 // 05273 // Interpotation Data 05274 interpolationValPlus = VIntp[6].GetX(); 05275 // 05276 vertexList[ 6] = V[6] + interpolationValPlus*(V[7] - V[6]);//.Normalized()*CUBE_DIMENSIONS[0]; 05277 grad[6] = G[6] + interpolationValPlus*(G[7] - G[6]);//.Normalized()*CUBE_DIMENSIONS[0]; 05278 texCoordList[6] = VTC[6] + interpolationValPlus*(VTC[7] - VTC[6]);//.Normalized()*CUBE_DIMENSIONS[0]; 05279 } 05280 else { 05281 // 05282 // Interpotation Data 05283 interpolationValNeg = -VIntp[7].GetX(); 05284 // 05285 vertexList[ 6] = V[7] + interpolationValNeg*(V[7] - V[6]);//.Normalized()*CUBE_DIMENSIONS[0]; 05286 grad[6] = G[7] + interpolationValNeg*(G[7] - G[6]);//.Normalized()*CUBE_DIMENSIONS[0]; 05287 texCoordList[6] = VTC[7] + interpolationValNeg*(VTC[7] - VTC[6]);//.Normalized()*CUBE_DIMENSIONS[0]; 05288 } 05289 grad[6].Normalized(); 05290 } 05291 if ( EdgeTable[cubeClass] & 128 ) { 05292 if ( dataForPosition[idx[4] + 3] > threshold ) { 05293 // 05294 // Interpotation Data 05295 interpolationValPlus = VIntp[4].GetY(); 05296 // 05297 vertexList[ 7] = V[4] + interpolationValPlus*(V[7] - V[4]);//.Normalized()*CUBE_DIMENSIONS[1]; 05298 grad[7] = G[4] + interpolationValPlus*(G[7] - G[4]);//.Normalized()*CUBE_DIMENSIONS[1]; 05299 texCoordList[7] = VTC[4] + interpolationValPlus*(VTC[7] - VTC[4]);//.Normalized()*CUBE_DIMENSIONS[1]; 05300 } 05301 else { 05302 // 05303 // Interpotation Data 05304 interpolationValNeg = -VIntp[7].GetY(); 05305 // 05306 vertexList[ 7] = V[7] + interpolationValNeg*(V[7] - V[4]);//.Normalized()*CUBE_DIMENSIONS[1]; 05307 grad[7] = G[7] + interpolationValNeg*(G[7] - G[4]);//.Normalized()*CUBE_DIMENSIONS[1]; 05308 texCoordList[7] = VTC[7] + interpolationValNeg*(VTC[7] - VTC[4]);//.Normalized()*CUBE_DIMENSIONS[1]; 05309 } 05310 grad[7].Normalized(); 05311 } 05312 if ( EdgeTable[cubeClass] & 256 ) { 05313 if ( dataForPosition[idx[0] + 3] > threshold ) { 05314 // 05315 // Interpotation Data 05316 interpolationValPlus = VIntp[0].GetZ(); 05317 // 05318 vertexList[ 8] = V[0] + interpolationValPlus*(V[4] - V[0]);//.Normalized()*CUBE_DIMENSIONS[2]; 05319 grad[8] = G[0] + interpolationValPlus*(G[4] - G[0]);//.Normalized()*CUBE_DIMENSIONS[2]; 05320 texCoordList[8] = VTC[0] + interpolationValPlus*(VTC[4] - VTC[0]);//.Normalized()*CUBE_DIMENSIONS[2]; 05321 } 05322 else { 05323 // 05324 // Interpotation Data 05325 interpolationValNeg = -VIntp[4].GetZ(); 05326 // 05327 vertexList[ 8] = V[4] + interpolationValNeg*(V[4] - V[0]);//.Normalized()*CUBE_DIMENSIONS[2]; 05328 grad[8] = G[4] + interpolationValNeg*(G[4] - G[0]);//.Normalized()*CUBE_DIMENSIONS[2]; 05329 texCoordList[8] = VTC[4] + interpolationValNeg*(VTC[4] - VTC[0]);//.Normalized()*CUBE_DIMENSIONS[2]; 05330 } 05331 grad[8].Normalized(); 05332 } 05333 if ( EdgeTable[cubeClass] & 512 ) { 05334 if ( dataForPosition[idx[1] + 3] > threshold ) { 05335 // 05336 // Interpotation Data 05337 interpolationValPlus = VIntp[1].GetZ(); 05338 // 05339 vertexList[ 9] = V[1] + interpolationValPlus*(V[5] - V[1]);//.Normalized()*CUBE_DIMENSIONS[2]; 05340 grad[9] = G[1] + interpolationValPlus*(G[5] - G[1]);//.Normalized()*CUBE_DIMENSIONS[2]; 05341 texCoordList[9] = VTC[1] + interpolationValPlus*(VTC[5] - VTC[1]);//.Normalized()*CUBE_DIMENSIONS[2]; 05342 } 05343 else { 05344 // 05345 // Interpotation Data 05346 interpolationValNeg = -VIntp[5].GetZ(); 05347 // 05348 vertexList[ 9] = V[5] + interpolationValNeg*(V[5] - V[1]);//.Normalized()*CUBE_DIMENSIONS[2]; 05349 grad[9] = G[5] + interpolationValNeg*(G[5] - G[1]);//.Normalized()*CUBE_DIMENSIONS[2]; 05350 texCoordList[9] = VTC[5] + interpolationValNeg*(VTC[5] - VTC[1]);//.Normalized()*CUBE_DIMENSIONS[2]; 05351 } 05352 grad[9].Normalized(); 05353 } 05354 if ( EdgeTable[cubeClass] & 1024 ) { 05355 if ( dataForPosition[idx[2] + 3] > threshold ) { 05356 // 05357 // Interpotation Data 05358 interpolationValPlus = VIntp[2].GetZ(); 05359 // 05360 vertexList[10] = V[2] + interpolationValPlus*(V[6] - V[2]);//.Normalized()*CUBE_DIMENSIONS[2]; 05361 grad[10] = G[2] + interpolationValPlus*(G[6] - G[2]);//.Normalized()*CUBE_DIMENSIONS[2]; 05362 texCoordList[10] = VTC[2] + interpolationValPlus*(VTC[6] - VTC[2]);//.Normalized()*CUBE_DIMENSIONS[2]; 05363 } 05364 else { 05365 // 05366 // Interpotation Data 05367 interpolationValNeg = -VIntp[6].GetZ(); 05368 // 05369 vertexList[10] = V[6] + interpolationValNeg*(V[6] - V[2]);//.Normalized()*CUBE_DIMENSIONS[2]; 05370 grad[10] = G[6] + interpolationValNeg*(G[6] - G[2]);//.Normalized()*CUBE_DIMENSIONS[2]; 05371 texCoordList[10] = VTC[6] + interpolationValNeg*(VTC[6] - VTC[2]);//.Normalized()*CUBE_DIMENSIONS[2]; 05372 } 05373 grad[10].Normalized(); 05374 } 05375 if ( EdgeTable[cubeClass] & 2048 ) { 05376 if ( dataForPosition[idx[3] + 3] > threshold ) { 05377 // 05378 // Interpotation Data 05379 interpolationValPlus = VIntp[3].GetZ(); 05380 // 05381 vertexList[11] = V[3] + interpolationValPlus*(V[7] - V[3]);//.Normalized()*CUBE_DIMENSIONS[2]; 05382 grad[11] = G[3] + interpolationValPlus*(G[7] - G[3]);//.Normalized()*CUBE_DIMENSIONS[2]; 05383 texCoordList[11] = VTC[3] + interpolationValPlus*(VTC[7] - VTC[3]);//.Normalized()*CUBE_DIMENSIONS[2]; 05384 } 05385 else { 05386 // 05387 // Interpotation Data 05388 interpolationValNeg = -VIntp[7].GetZ(); 05389 // 05390 vertexList[11] = V[7] + interpolationValNeg*(V[7] - V[3]);//.Normalized()*CUBE_DIMENSIONS[2]; 05391 grad[11] = G[7] + interpolationValNeg*(G[7] - G[3]);//.Normalized()*CUBE_DIMENSIONS[2]; 05392 texCoordList[11] = VTC[7] + interpolationValNeg*(VTC[7] - VTC[3]);//.Normalized()*CUBE_DIMENSIONS[2]; 05393 } 05394 grad[11].Normalized(); 05395 } 05396 } // End processing normal cube 05397 05398 // TWO ITERATIONS FOR LEFT AND RIGHT CUBE CONFIGURATIONS 05399 for ( int iIterate = 0; iIterate < 2; ++iIterate ) 05400 { 05401 // Store Reloaded Threshold Values 05402 GLfloat reloadedThresholdValues[8]; 05403 for ( int R = 0; R < 8; ++R ) { 05404 reloadedThresholdValues[R] = dataForPosition[idx[R] + 3]; 05405 } 05406 05407 // STANDARD CUBE CONFIGURATION 05408 //------------------------------- 05409 if ( !bLeftPresent || !bRightPresent ) { 05410 iIterate = 2; 05411 } 05412 else { 05413 05414 //------------------------------- 05415 if ( iIterate == 0 ) 05416 // LEFT CUBE CONFIGURATION 05417 //------------------------------- 05418 // Determine the threshold of each vertex of the cube 05419 { 05420 float flagVal; 05421 int factor = 1; 05422 cubeClass = 0; 05423 for ( int i = 0; i < 8; ++i ) { 05424 flagVal = dataForPosition[idx[i] + 3]; 05425 if ( flagVal > threshold ) { 05426 int iFlag = int( flagVal ) % int( m_SimDomain->IC_Thresholds::FLAG_STEP ); 05427 if ( iFlag < m_SimDomain->IC_Thresholds::MC_LEFT_ADD+1 ) { 05428 cubeClass |= factor; 05429 } 05430 else { 05431 dataForPosition[idx[i] + 3] = m_SimDomain->IC_Thresholds::RIGHT_OUTSIDE_BOUNDARY; 05432 } 05433 } 05434 factor *= 2; 05435 } 05436 } 05437 05438 //------------------------------- 05439 else 05440 // RIGHT CUBE CONFIGURATION 05441 //------------------------------- 05442 // Determine the threshold of each vertex of the cube 05443 { 05444 float flagVal; 05445 int factor = 1; 05446 cubeClass = 0; 05447 for ( int i = 0; i < 8; ++i ) { 05448 flagVal = dataForPosition[idx[i] + 3]; 05449 if ( flagVal > threshold ) { 05450 int iFlag = int( flagVal ) % int( m_SimDomain->IC_Thresholds::FLAG_STEP ); 05451 if ( iFlag < m_SimDomain->IC_Thresholds::MC_LEFT_ADD-1 05452 || iFlag > m_SimDomain->IC_Thresholds::MC_LEFT_ADD+1 ) { 05453 cubeClass |= factor; 05454 } 05455 else { 05456 dataForPosition[idx[i] + 3] = m_SimDomain->IC_Thresholds::RIGHT_OUTSIDE_BOUNDARY; 05457 } 05458 } 05459 factor *= 2; 05460 } 05461 } 05462 //------------------------------- 05463 } 05464 05465 05466 //------------------------------- 05467 // Cell is entirely in/out of the surface 05468 if ( EdgeTable[cubeClass] == 0 ) { 05469 numOfTrisPerCell = 0; 05470 } 05471 else { 05472 //------------------------------- 05473 // Cell contains part of the surface 05474 05475 05476 //* 05477 //----------------- 05478 for ( i = 0; i < 8; ++i ) { 05479 V[i].SetXYZ( 05480 dataForPosition[idx[i] ], 05481 dataForPosition[idx[i] + 1], 05482 dataForPosition[idx[i] + 2] 05483 ); 05484 } 05485 //----------------- 05486 // Reset list of existing vertices 05487 for ( i = 0; i < 12; ++i ) { 05488 bV[i] = -1; 05489 } 05490 05491 //----------------- 05492 // Interpolation Data 05493 for ( i = 0; i < 8; ++i ) { 05494 VIntp[i].SetXYZ( 05495 dataForEllipsoidInfluence[intpIdx[i] ], 05496 dataForEllipsoidInfluence[intpIdx[i] + 1], 05497 dataForEllipsoidInfluence[intpIdx[i] + 2] 05498 ); 05499 } 05500 //*/ 05501 05502 05503 05504 //=============================================== 05505 // Marching Cube Interpolation 05506 // V = V1 + (isovalue - s1) (V2 - V1) / (s2 - s1) 05507 //----------------------------------------------- 05508 // RUNTIME ERROR CAN OCCURS -- DEPENDING ON THE DATA 05509 // SINCE IT DOES NOT HAVE BOUNDARY PROTECTION -- ARRAY INDEX OUT OF BOUND ERROR 05510 //----------------------------------------------- 05511 // Not Use Global Interpolation Value -- each element has its own xyz interpolation values 05512 if ( !m_bUseGlobalInterpolationVal ) { 05513 //------------------------------------- 05514 // Marching Cube Interpolation 05515 T interpolationValPlus;// = m_tGlobalInterpolationVal; 05516 T interpolationValNeg;// = 1.0 - m_tGlobalInterpolationVal; 05517 05518 05519 05520 /* 05521 //*************************************** 05522 // Normal Interpolation 05523 //======================================= 05524 //------------------------------------- 05525 // Edge# 0 to 11 <==> [ 1, 2, 4, ... , 2048 ] 05526 if ( EdgeTable[cubeClass] & 1 ) { 05527 if ( dataForPosition[idx[0] + 3] > threshold ) { 05528 // 05529 // Interpotation Data 05530 interpolationValPlus = VIntp[0].GetX(); 05531 // 05532 vertexList[ 0] = V[0] + interpolationValPlus*(V[1] - V[0]); 05533 grad[0] = G[0] + interpolationValPlus*(G[1] - G[0]); 05534 texCoordList[0] = VTC[0] + interpolationValPlus*(VTC[1] - VTC[0]); 05535 } 05536 else { 05537 // 05538 // Interpotation Data 05539 interpolationValNeg = 1.0 - VIntp[1].GetX(); 05540 // 05541 vertexList[ 0] = V[0] + interpolationValNeg*(V[1] - V[0]); 05542 grad[0] = G[0] + interpolationValNeg*(G[1] - G[0]); 05543 texCoordList[0] = VTC[0] + interpolationValNeg*(VTC[1] - VTC[0]); 05544 //grad[0] *= -1.0; 05545 } 05546 grad[0].Normalized(); 05547 } 05548 if ( EdgeTable[cubeClass] & 2 ) { 05549 if ( dataForPosition[idx[1] + 3] > threshold ) { 05550 // 05551 // Interpotation Data 05552 interpolationValPlus = VIntp[1].GetY(); 05553 // 05554 vertexList[ 1] = V[1] + interpolationValPlus*(V[2] - V[1]); 05555 grad[1] = G[1] + interpolationValPlus*(G[2] - G[1]); 05556 texCoordList[1] = VTC[1] + interpolationValPlus*(VTC[2] - VTC[1]); 05557 } 05558 else { 05559 // 05560 // Interpotation Data 05561 interpolationValNeg = 1.0 - VIntp[2].GetY(); 05562 // 05563 vertexList[ 1] = V[1] + interpolationValNeg*(V[2] - V[1]); 05564 grad[1] = G[1] + interpolationValNeg*(G[2] - G[1]); 05565 texCoordList[1] = VTC[1] + interpolationValNeg*(VTC[2] - VTC[1]); 05566 //grad[1] *= -1.0; 05567 } 05568 grad[1].Normalized(); 05569 } 05570 if ( EdgeTable[cubeClass] & 4 ) { 05571 if ( dataForPosition[idx[2] + 3] > threshold ) { 05572 // 05573 // Interpotation Data 05574 interpolationValPlus = VIntp[2].GetX(); 05575 // 05576 vertexList[ 2] = V[2] + interpolationValPlus*(V[3] - V[2]); 05577 grad[2] = G[2] + interpolationValPlus*(G[3] - G[2]); 05578 texCoordList[2] = VTC[2] + interpolationValPlus*(VTC[3] - VTC[2]); 05579 //grad[2] *= -1.0; 05580 } 05581 else { 05582 // 05583 // Interpotation Data 05584 interpolationValNeg = 1.0 - VIntp[3].GetX(); 05585 // 05586 vertexList[ 2] = V[2] + interpolationValNeg*(V[3] - V[2]); 05587 grad[2] = G[2] + interpolationValNeg*(G[3] - G[2]); 05588 texCoordList[2] = VTC[2] + interpolationValNeg*(VTC[3] - VTC[2]); 05589 } 05590 grad[2].Normalized(); 05591 } 05592 if ( EdgeTable[cubeClass] & 8 ) { 05593 if ( dataForPosition[idx[0] + 3] > threshold ) { 05594 // 05595 // Interpotation Data 05596 interpolationValPlus = VIntp[0].GetY(); 05597 // 05598 vertexList[ 3] = V[0] + interpolationValPlus*(V[3] - V[0]); 05599 grad[3] = G[0] + interpolationValPlus*(G[3] - G[0]); 05600 texCoordList[3] = VTC[0] + interpolationValPlus*(VTC[3] - VTC[0]); 05601 //grad[3][1] *= -1.0; 05602 } 05603 else { 05604 // 05605 // Interpotation Data 05606 interpolationValNeg = 1.0 - VIntp[3].GetY(); 05607 // 05608 vertexList[ 3] = V[0] + interpolationValNeg*(V[3] - V[0]); 05609 grad[3] = G[0] + interpolationValNeg*(G[3] - G[0]); 05610 texCoordList[3] = VTC[0] + interpolationValNeg*(VTC[3] - VTC[0]); 05611 } 05612 grad[3].Normalized(); 05613 } 05614 if ( EdgeTable[cubeClass] & 16 ) { 05615 if ( dataForPosition[idx[4] + 3] > threshold ) { 05616 // 05617 // Interpotation Data 05618 interpolationValPlus = VIntp[4].GetX(); 05619 // 05620 vertexList[ 4] = V[4] + interpolationValPlus*(V[5] - V[4]); 05621 grad[4] = G[4] + interpolationValPlus*(G[5] - G[4]); 05622 texCoordList[4] = VTC[4] + interpolationValPlus*(VTC[5] - VTC[4]); 05623 } 05624 else { 05625 // 05626 // Interpotation Data 05627 interpolationValNeg = 1.0 - VIntp[5].GetX(); 05628 // 05629 vertexList[ 4] = V[4] + interpolationValNeg*(V[5] - V[4]); 05630 grad[4] = G[4] + interpolationValNeg*(G[5] - G[4]); 05631 texCoordList[4] = VTC[4] + interpolationValNeg*(VTC[5] - VTC[4]); 05632 //grad[4] *= -1.0; 05633 } 05634 grad[4].Normalized(); 05635 } 05636 if ( EdgeTable[cubeClass] & 32 ) { 05637 if ( dataForPosition[idx[5] + 3] > threshold ) { 05638 // 05639 // Interpotation Data 05640 interpolationValPlus = VIntp[5].GetY(); 05641 // 05642 vertexList[ 5] = V[5] + interpolationValPlus*(V[6] - V[5]); 05643 grad[5] = G[5] + interpolationValPlus*(G[6] - G[5]); 05644 texCoordList[5] = VTC[5] + interpolationValPlus*(VTC[6] - VTC[5]); 05645 } 05646 else { 05647 // 05648 // Interpotation Data 05649 interpolationValNeg = 1.0 - VIntp[6].GetY(); 05650 // 05651 vertexList[ 5] = V[5] + interpolationValNeg*(V[6] - V[5]); 05652 grad[5] = G[5] + interpolationValNeg*(G[6] - G[5]); 05653 texCoordList[5] = VTC[5] + interpolationValNeg*(VTC[6] - VTC[5]); 05654 //grad[5][1] *= -1.0; 05655 } 05656 grad[5].Normalized(); 05657 } 05658 if ( EdgeTable[cubeClass] & 64 ) { 05659 if ( dataForPosition[idx[6] + 3] > threshold ) { 05660 // 05661 // Interpotation Data 05662 interpolationValPlus = VIntp[6].GetX(); 05663 // 05664 vertexList[ 6] = V[6] + interpolationValPlus*(V[7] - V[6]); 05665 grad[6] = G[6] + interpolationValPlus*(G[7] - G[6]); 05666 texCoordList[6] = VTC[6] + interpolationValPlus*(VTC[7] - VTC[6]); 05667 } 05668 else { 05669 // 05670 // Interpotation Data 05671 interpolationValNeg = 1.0 - VIntp[7].GetX(); 05672 // 05673 vertexList[ 6] = V[6] + interpolationValNeg*(V[7] - V[6]); 05674 grad[6] = G[6] + interpolationValNeg*(G[7] - G[6]); 05675 texCoordList[6] = VTC[6] + interpolationValNeg*(VTC[7] - VTC[6]); 05676 //grad[6] *= -1.0; 05677 } 05678 grad[6].Normalized(); 05679 } 05680 if ( EdgeTable[cubeClass] & 128 ) { 05681 if ( dataForPosition[idx[4] + 3] > threshold ) { 05682 // 05683 // Interpotation Data 05684 interpolationValPlus = VIntp[4].GetY(); 05685 // 05686 vertexList[ 7] = V[4] + interpolationValPlus*(V[7] - V[4]); 05687 grad[7] = G[4] + interpolationValPlus*(G[7] - G[4]); 05688 texCoordList[7] = VTC[4] + interpolationValPlus*(VTC[7] - VTC[4]); 05689 //grad[7][1] *= -1.0; 05690 } 05691 else { 05692 // 05693 // Interpotation Data 05694 interpolationValNeg = 1.0 - VIntp[7].GetY(); 05695 // 05696 vertexList[ 7] = V[4] + interpolationValNeg*(V[7] - V[4]); 05697 grad[7] = G[4] + interpolationValNeg*(G[7] - G[4]); 05698 texCoordList[7] = VTC[4] + interpolationValNeg*(VTC[7] - VTC[4]); 05699 } 05700 grad[7].Normalized(); 05701 } 05702 if ( EdgeTable[cubeClass] & 256 ) { 05703 if ( dataForPosition[idx[0] + 3] > threshold ) { 05704 // 05705 // Interpotation Data 05706 interpolationValPlus = VIntp[0].GetZ(); 05707 // 05708 vertexList[ 8] = V[0] + interpolationValPlus*(V[4] - V[0]); 05709 grad[8] = G[0] + interpolationValPlus*(G[4] - G[0]); 05710 texCoordList[8] = VTC[0] + interpolationValPlus*(VTC[4] - VTC[0]); 05711 } 05712 else { 05713 // 05714 // Interpotation Data 05715 interpolationValNeg = 1.0 - VIntp[4].GetZ(); 05716 // 05717 vertexList[ 8] = V[0] + interpolationValNeg*(V[4] - V[0]); 05718 grad[8] = G[0] + interpolationValNeg*(G[4] - G[0]); 05719 texCoordList[8] = VTC[0] + interpolationValNeg*(VTC[4] - VTC[0]); 05720 //grad[8][2] *= -1.0; 05721 } 05722 grad[8].Normalized(); 05723 } 05724 if ( EdgeTable[cubeClass] & 512 ) { 05725 if ( dataForPosition[idx[1] + 3] > threshold ) { 05726 // 05727 // Interpotation Data 05728 interpolationValPlus = VIntp[1].GetZ(); 05729 // 05730 vertexList[ 9] = V[1] + interpolationValPlus*(V[5] - V[1]); 05731 grad[9] = G[1] + interpolationValPlus*(G[5] - G[1]); 05732 texCoordList[9] = VTC[1] + interpolationValPlus*(VTC[5] - VTC[1]); 05733 } 05734 else { 05735 // 05736 // Interpotation Data 05737 interpolationValNeg = 1.0 - VIntp[5].GetZ(); 05738 // 05739 vertexList[ 9] = V[1] + interpolationValNeg*(V[5] - V[1]); 05740 grad[9] = G[1] + interpolationValNeg*(G[5] - G[1]); 05741 texCoordList[9] = VTC[1] + interpolationValNeg*(VTC[5] - VTC[1]); 05742 //grad[9][2] *= -1.0; 05743 } 05744 grad[9].Normalized(); 05745 } 05746 if ( EdgeTable[cubeClass] & 1024 ) { 05747 if ( dataForPosition[idx[2] + 3] > threshold ) { 05748 // 05749 // Interpotation Data 05750 interpolationValPlus = VIntp[2].GetZ(); 05751 // 05752 vertexList[10] = V[2] + interpolationValPlus*(V[6] - V[2]); 05753 grad[10] = G[2] + interpolationValPlus*(G[6] - G[2]); 05754 texCoordList[10] = VTC[2] + interpolationValPlus*(VTC[6] - VTC[2]); 05755 } 05756 else { 05757 // 05758 // Interpotation Data 05759 interpolationValNeg = 1.0 - VIntp[6].GetZ(); 05760 // 05761 vertexList[10] = V[2] + interpolationValNeg*(V[6] - V[2]); 05762 grad[10] = G[2] + interpolationValNeg*(G[6] - G[2]); 05763 texCoordList[10] = VTC[2] + interpolationValNeg*(VTC[6] - VTC[2]); 05764 //grad[10][2] *= -1.0; 05765 } 05766 grad[10].Normalized(); 05767 } 05768 if ( EdgeTable[cubeClass] & 2048 ) { 05769 if ( dataForPosition[idx[3] + 3] > threshold ) { 05770 // 05771 // Interpotation Data 05772 interpolationValPlus = VIntp[3].GetZ(); 05773 // 05774 vertexList[11] = V[3] + interpolationValPlus*(V[7] - V[3]); 05775 grad[11] = G[3] + interpolationValPlus*(G[7] - G[3]); 05776 texCoordList[11] = VTC[3] + interpolationValPlus*(VTC[7] - VTC[3]); 05777 } 05778 else { 05779 // 05780 // Interpotation Data 05781 interpolationValNeg = 1.0 - VIntp[7].GetZ(); 05782 // 05783 vertexList[11] = V[3] + interpolationValNeg*(V[7] - V[3]); 05784 grad[11] = G[3] + interpolationValNeg*(G[7] - G[3]); 05785 texCoordList[11] = VTC[3] + interpolationValNeg*(VTC[7] - VTC[3]); 05786 //grad[11][2] *= -1.0; 05787 } 05788 grad[11].Normalized(); 05789 } 05790 //--------------------------------------- 05791 //======================================= 05792 //*************************************** 05793 //*/ 05794 05795 05796 05797 // START DEBUGGING 05799 /* 05800 //*************************************** 05801 // Fixed Distance Interpolation 05802 //======================================= 05803 //--------------------------------------- 05804 // Edge# 0 to 11 <==> [ 1, 2, 4, ... , 2048 ] 05805 //if ( iIterate >= 2 ) 05806 { 05807 if ( EdgeTable[cubeClass] & 1 ) { 05808 if ( dataForPosition[idx[0] + 3] > threshold ) { 05809 // 05810 // Interpotation Data 05811 interpolationValPlus = VIntp[0].GetX(); 05812 // 05813 vertexList[ 0] = V[0] + interpolationValPlus*(V[1] - V[0]);//.Normalized()*CUBE_DIMENSIONS[0]; 05814 grad[0] = G[0] + interpolationValPlus*(G[1] - G[0]);//.Normalized()*CUBE_DIMENSIONS[0]; 05815 texCoordList[0] = VTC[0] + interpolationValPlus*(VTC[1] - VTC[0]);//.Normalized()*CUBE_DIMENSIONS[0]; 05816 } 05817 else { 05818 // 05819 // Interpotation Data 05820 interpolationValNeg = -VIntp[1].GetX(); 05821 // 05822 vertexList[ 0] = V[1] + interpolationValNeg*(V[1] - V[0]);//.Normalized()*CUBE_DIMENSIONS[0]; 05823 grad[0] = G[1] + interpolationValNeg*(G[1] - G[0]);//.Normalized()*CUBE_DIMENSIONS[0]; 05824 texCoordList[0] = VTC[1] + interpolationValNeg*(VTC[1] - VTC[0]);//.Normalized()*CUBE_DIMENSIONS[0]; 05825 } 05826 grad[0].Normalized(); 05827 } 05828 if ( EdgeTable[cubeClass] & 2 ) { 05829 if ( dataForPosition[idx[1] + 3] > threshold ) { 05830 // 05831 // Interpotation Data 05832 interpolationValPlus = VIntp[1].GetY(); 05833 // 05834 vertexList[ 1] = V[1] + interpolationValPlus*(V[2] - V[1]);//.Normalized()*CUBE_DIMENSIONS[1]; 05835 grad[1] = G[1] + interpolationValPlus*(G[2] - G[1]);//.Normalized()*CUBE_DIMENSIONS[1]; 05836 texCoordList[1] = VTC[1] + interpolationValPlus*(VTC[2] - VTC[1]);//.Normalized()*CUBE_DIMENSIONS[1]; 05837 } 05838 else { 05839 // 05840 // Interpotation Data 05841 interpolationValNeg = -VIntp[2].GetY(); 05842 // 05843 vertexList[ 1] = V[2] + interpolationValNeg*(V[2] - V[1]);//.Normalized()*CUBE_DIMENSIONS[1]; 05844 grad[1] = G[2] + interpolationValNeg*(G[2] - G[1]);//.Normalized()*CUBE_DIMENSIONS[1]; 05845 texCoordList[1] = VTC[2] + interpolationValNeg*(VTC[2] - VTC[1]);//.Normalized()*CUBE_DIMENSIONS[1]; 05846 } 05847 grad[1].Normalized(); 05848 } 05849 if ( EdgeTable[cubeClass] & 4 ) { 05850 if ( dataForPosition[idx[2] + 3] > threshold ) { 05851 // 05852 // Interpotation Data 05853 interpolationValPlus = VIntp[2].GetX(); 05854 // 05855 vertexList[ 2] = V[2] + interpolationValPlus*(V[3] - V[2]);//.Normalized()*CUBE_DIMENSIONS[0]; 05856 grad[2] = G[2] + interpolationValPlus*(G[3] - G[2]);//.Normalized()*CUBE_DIMENSIONS[0]; 05857 texCoordList[2] = VTC[2] + interpolationValPlus*(VTC[3] - VTC[2]);//.Normalized()*CUBE_DIMENSIONS[0]; 05858 } 05859 else { 05860 // 05861 // Interpotation Data 05862 interpolationValNeg = -VIntp[3].GetX(); 05863 // 05864 vertexList[ 2] = V[3] + interpolationValNeg*(V[3] - V[2]);//.Normalized()*CUBE_DIMENSIONS[0]; 05865 grad[2] = G[3] + interpolationValNeg*(G[3] - G[2]);//.Normalized()*CUBE_DIMENSIONS[0]; 05866 texCoordList[2] = VTC[3] + interpolationValNeg*(VTC[3] - VTC[2]);//.Normalized()*CUBE_DIMENSIONS[0]; 05867 } 05868 grad[2].Normalized(); 05869 } 05870 if ( EdgeTable[cubeClass] & 8 ) { 05871 if ( dataForPosition[idx[0] + 3] > threshold ) { 05872 // 05873 // Interpotation Data 05874 interpolationValPlus = VIntp[0].GetY(); 05875 // 05876 vertexList[ 3] = V[0] + interpolationValPlus*(V[3] - V[0]);//.Normalized()*CUBE_DIMENSIONS[1]; 05877 grad[3] = G[0] + interpolationValPlus*(G[3] - G[0]);//.Normalized()*CUBE_DIMENSIONS[1]; 05878 texCoordList[3] = VTC[0] + interpolationValPlus*(VTC[3] - VTC[0]);//.Normalized()*CUBE_DIMENSIONS[1]; 05879 } 05880 else { 05881 // 05882 // Interpotation Data 05883 interpolationValNeg = -VIntp[3].GetY(); 05884 // 05885 vertexList[ 3] = V[3] + interpolationValNeg*(V[3] - V[0]);//.Normalized()*CUBE_DIMENSIONS[1]; 05886 grad[3] = G[3] + interpolationValNeg*(G[3] - G[0]);//.Normalized()*CUBE_DIMENSIONS[1]; 05887 texCoordList[3] = VTC[3] + interpolationValNeg*(VTC[3] - VTC[0]);//.Normalized()*CUBE_DIMENSIONS[1]; 05888 } 05889 grad[3].Normalized(); 05890 } 05891 if ( EdgeTable[cubeClass] & 16 ) { 05892 if ( dataForPosition[idx[4] + 3] > threshold ) { 05893 // 05894 // Interpotation Data 05895 interpolationValPlus = VIntp[4].GetX(); 05896 // 05897 vertexList[ 4] = V[4] + interpolationValPlus*(V[5] - V[4]);//.Normalized()*CUBE_DIMENSIONS[0]; 05898 grad[4] = G[4] + interpolationValPlus*(G[5] - G[4]);//.Normalized()*CUBE_DIMENSIONS[0]; 05899 texCoordList[4] = VTC[4] + interpolationValPlus*(VTC[5] - VTC[4]);//.Normalized()*CUBE_DIMENSIONS[0]; 05900 } 05901 else { 05902 // 05903 // Interpotation Data 05904 interpolationValNeg = -VIntp[5].GetX(); 05905 // 05906 vertexList[ 4] = V[5] + interpolationValNeg*(V[5] - V[4]);//.Normalized()*CUBE_DIMENSIONS[0]; 05907 grad[4] = G[5] + interpolationValNeg*(G[5] - G[4]);//.Normalized()*CUBE_DIMENSIONS[0]; 05908 texCoordList[4] = VTC[5] + interpolationValNeg*(VTC[5] - VTC[4]);//.Normalized()*CUBE_DIMENSIONS[0]; 05909 } 05910 grad[4].Normalized(); 05911 } 05912 if ( EdgeTable[cubeClass] & 32 ) { 05913 if ( dataForPosition[idx[5] + 3] > threshold ) { 05914 // 05915 // Interpotation Data 05916 interpolationValPlus = VIntp[5].GetY(); 05917 // 05918 vertexList[ 5] = V[5] + interpolationValPlus*(V[6] - V[5]);//.Normalized()*CUBE_DIMENSIONS[1]; 05919 grad[5] = G[5] + interpolationValPlus*(G[6] - G[5]);//.Normalized()*CUBE_DIMENSIONS[1]; 05920 texCoordList[5] = VTC[5] + interpolationValPlus*(VTC[6] - VTC[5]);//.Normalized()*CUBE_DIMENSIONS[1]; 05921 } 05922 else { 05923 // 05924 // Interpotation Data 05925 interpolationValNeg = -VIntp[6].GetY(); 05926 // 05927 vertexList[ 5] = V[6] + interpolationValNeg*(V[6] - V[5]);//.Normalized()*CUBE_DIMENSIONS[1]; 05928 grad[5] = G[6] + interpolationValNeg*(G[6] - G[5]);//.Normalized()*CUBE_DIMENSIONS[1]; 05929 texCoordList[5] = VTC[6] + interpolationValNeg*(VTC[6] - VTC[5]);//.Normalized()*CUBE_DIMENSIONS[1]; 05930 } 05931 grad[5].Normalized(); 05932 } 05933 if ( EdgeTable[cubeClass] & 64 ) { 05934 if ( dataForPosition[idx[6] + 3] > threshold ) { 05935 // 05936 // Interpotation Data 05937 interpolationValPlus = VIntp[6].GetX(); 05938 // 05939 vertexList[ 6] = V[6] + interpolationValPlus*(V[7] - V[6]);//.Normalized()*CUBE_DIMENSIONS[0]; 05940 grad[6] = G[6] + interpolationValPlus*(G[7] - G[6]);//.Normalized()*CUBE_DIMENSIONS[0]; 05941 texCoordList[6] = VTC[6] + interpolationValPlus*(VTC[7] - VTC[6]);//.Normalized()*CUBE_DIMENSIONS[0]; 05942 } 05943 else { 05944 // 05945 // Interpotation Data 05946 interpolationValNeg = -VIntp[7].GetX(); 05947 // 05948 vertexList[ 6] = V[7] + interpolationValNeg*(V[7] - V[6]);//.Normalized()*CUBE_DIMENSIONS[0]; 05949 grad[6] = G[7] + interpolationValNeg*(G[7] - G[6]);//.Normalized()*CUBE_DIMENSIONS[0]; 05950 texCoordList[6] = VTC[7] + interpolationValNeg*(VTC[7] - VTC[6]);//.Normalized()*CUBE_DIMENSIONS[0]; 05951 } 05952 grad[6].Normalized(); 05953 } 05954 if ( EdgeTable[cubeClass] & 128 ) { 05955 if ( dataForPosition[idx[4] + 3] > threshold ) { 05956 // 05957 // Interpotation Data 05958 interpolationValPlus = VIntp[4].GetY(); 05959 // 05960 vertexList[ 7] = V[4] + interpolationValPlus*(V[7] - V[4]);//.Normalized()*CUBE_DIMENSIONS[1]; 05961 grad[7] = G[4] + interpolationValPlus*(G[7] - G[4]);//.Normalized()*CUBE_DIMENSIONS[1]; 05962 texCoordList[7] = VTC[4] + interpolationValPlus*(VTC[7] - VTC[4]);//.Normalized()*CUBE_DIMENSIONS[1]; 05963 } 05964 else { 05965 // 05966 // Interpotation Data 05967 interpolationValNeg = -VIntp[7].GetY(); 05968 // 05969 vertexList[ 7] = V[7] + interpolationValNeg*(V[7] - V[4]);//.Normalized()*CUBE_DIMENSIONS[1]; 05970 grad[7] = G[7] + interpolationValNeg*(G[7] - G[4]);//.Normalized()*CUBE_DIMENSIONS[1]; 05971 texCoordList[7] = VTC[7] + interpolationValNeg*(VTC[7] - VTC[4]);//.Normalized()*CUBE_DIMENSIONS[1]; 05972 } 05973 grad[7].Normalized(); 05974 } 05975 if ( EdgeTable[cubeClass] & 256 ) { 05976 if ( dataForPosition[idx[0] + 3] > threshold ) { 05977 // 05978 // Interpotation Data 05979 interpolationValPlus = VIntp[0].GetZ(); 05980 // 05981 vertexList[ 8] = V[0] + interpolationValPlus*(V[4] - V[0]);//.Normalized()*CUBE_DIMENSIONS[2]; 05982 grad[8] = G[0] + interpolationValPlus*(G[4] - G[0]);//.Normalized()*CUBE_DIMENSIONS[2]; 05983 texCoordList[8] = VTC[0] + interpolationValPlus*(VTC[4] - VTC[0]);//.Normalized()*CUBE_DIMENSIONS[2]; 05984 } 05985 else { 05986 // 05987 // Interpotation Data 05988 interpolationValNeg = -VIntp[4].GetZ(); 05989 // 05990 vertexList[ 8] = V[4] + interpolationValNeg*(V[4] - V[0]);//.Normalized()*CUBE_DIMENSIONS[2]; 05991 grad[8] = G[4] + interpolationValNeg*(G[4] - G[0]);//.Normalized()*CUBE_DIMENSIONS[2]; 05992 texCoordList[8] = VTC[4] + interpolationValNeg*(VTC[4] - VTC[0]);//.Normalized()*CUBE_DIMENSIONS[2]; 05993 } 05994 grad[8].Normalized(); 05995 } 05996 if ( EdgeTable[cubeClass] & 512 ) { 05997 if ( dataForPosition[idx[1] + 3] > threshold ) { 05998 // 05999 // Interpotation Data 06000 interpolationValPlus = VIntp[1].GetZ(); 06001 // 06002 vertexList[ 9] = V[1] + interpolationValPlus*(V[5] - V[1]);//.Normalized()*CUBE_DIMENSIONS[2]; 06003 grad[9] = G[1] + interpolationValPlus*(G[5] - G[1]);//.Normalized()*CUBE_DIMENSIONS[2]; 06004 texCoordList[9] = VTC[1] + interpolationValPlus*(VTC[5] - VTC[1]);//.Normalized()*CUBE_DIMENSIONS[2]; 06005 } 06006 else { 06007 // 06008 // Interpotation Data 06009 interpolationValNeg = -VIntp[5].GetZ(); 06010 // 06011 vertexList[ 9] = V[5] + interpolationValNeg*(V[5] - V[1]);//.Normalized()*CUBE_DIMENSIONS[2]; 06012 grad[9] = G[5] + interpolationValNeg*(G[5] - G[1]);//.Normalized()*CUBE_DIMENSIONS[2]; 06013 texCoordList[9] = VTC[5] + interpolationValNeg*(VTC[5] - VTC[1]);//.Normalized()*CUBE_DIMENSIONS[2]; 06014 } 06015 grad[9].Normalized(); 06016 } 06017 if ( EdgeTable[cubeClass] & 1024 ) { 06018 if ( dataForPosition[idx[2] + 3] > threshold ) { 06019 // 06020 // Interpotation Data 06021 interpolationValPlus = VIntp[2].GetZ(); 06022 // 06023 vertexList[10] = V[2] + interpolationValPlus*(V[6] - V[2]);//.Normalized()*CUBE_DIMENSIONS[2]; 06024 grad[10] = G[2] + interpolationValPlus*(G[6] - G[2]);//.Normalized()*CUBE_DIMENSIONS[2]; 06025 texCoordList[10] = VTC[2] + interpolationValPlus*(VTC[6] - VTC[2]);//.Normalized()*CUBE_DIMENSIONS[2]; 06026 } 06027 else { 06028 // 06029 // Interpotation Data 06030 interpolationValNeg = -VIntp[6].GetZ(); 06031 // 06032 vertexList[10] = V[6] + interpolationValNeg*(V[6] - V[2]);//.Normalized()*CUBE_DIMENSIONS[2]; 06033 grad[10] = G[6] + interpolationValNeg*(G[6] - G[2]);//.Normalized()*CUBE_DIMENSIONS[2]; 06034 texCoordList[10] = VTC[6] + interpolationValNeg*(VTC[6] - VTC[2]);//.Normalized()*CUBE_DIMENSIONS[2]; 06035 } 06036 grad[10].Normalized(); 06037 } 06038 if ( EdgeTable[cubeClass] & 2048 ) { 06039 if ( dataForPosition[idx[3] + 3] > threshold ) { 06040 // 06041 // Interpotation Data 06042 interpolationValPlus = VIntp[3].GetZ(); 06043 // 06044 vertexList[11] = V[3] + interpolationValPlus*(V[7] - V[3]);//.Normalized()*CUBE_DIMENSIONS[2]; 06045 grad[11] = G[3] + interpolationValPlus*(G[7] - G[3]);//.Normalized()*CUBE_DIMENSIONS[2]; 06046 texCoordList[11] = VTC[3] + interpolationValPlus*(VTC[7] - VTC[3]);//.Normalized()*CUBE_DIMENSIONS[2]; 06047 } 06048 else { 06049 // 06050 // Interpotation Data 06051 interpolationValNeg = -VIntp[7].GetZ(); 06052 // 06053 vertexList[11] = V[7] + interpolationValNeg*(V[7] - V[3]);//.Normalized()*CUBE_DIMENSIONS[2]; 06054 grad[11] = G[7] + interpolationValNeg*(G[7] - G[3]);//.Normalized()*CUBE_DIMENSIONS[2]; 06055 texCoordList[11] = VTC[7] + interpolationValNeg*(VTC[7] - VTC[3]);//.Normalized()*CUBE_DIMENSIONS[2]; 06056 } 06057 grad[11].Normalized(); 06058 } 06059 } // End processing normal cube 06060 //--------------------------------------- 06061 //======================================= 06062 //*************************************** 06063 //*/ 06065 // END DEBUGGING 06066 06067 06068 //std::cout << "(V[1] - V[0]).Normalized(): " << (V[1] - V[0]).Normalized() << std::endl; 06069 //std::cout << "(V[1] - V[0]).Normalized().Length(): " << (V[1] - V[0]).Normalized().Length() << std::endl;; 06070 06071 //* 06072 //*************************************** 06073 // Fixed Distance Interpolation 06074 //======================================= 06075 //--------------------------------------- 06076 // Edge# 0 to 11 <==> [ 1, 2, 4, ... , 2048 ] 06077 //else { 06078 if ( iIterate < 2 ) { 06079 //interpolationValPlus = m_tGlobalInterpolationVal; 06080 //interpolationValNeg = m_tGlobalInterpolationVal - 1.0; 06081 06082 if ( EdgeTable[cubeClass] & 1 ) { 06083 if ( dataForPosition[idx[0] + 3] > threshold ) { 06084 // 06085 // Interpotation Data 06086 interpolationValPlus = VIntp[0].GetX(); 06087 // 06088 vertexList[ 0] = V[0] + interpolationValPlus*(V[1] - V[0]).Normalized()*CUBE_DIMENSIONS[0]; 06089 //grad[0] = G[0] + interpolationValPlus*(G[1] - G[0]).Normalized()*CUBE_DIMENSIONS[0]; 06090 //texCoordList[0] = VTC[0] + interpolationValPlus*(VTC[1] - VTC[0]).Normalized()*CUBE_DIMENSIONS[0]; 06091 } 06092 else { 06093 // 06094 // Interpotation Data 06095 interpolationValNeg = -VIntp[1].GetX(); 06096 // 06097 vertexList[ 0] = V[1] + interpolationValNeg*(V[1] - V[0]).Normalized()*CUBE_DIMENSIONS[0]; 06098 //grad[0] = G[1] + interpolationValNeg*(G[1] - G[0]).Normalized()*CUBE_DIMENSIONS[0]; 06099 //texCoordList[0] = VTC[1] + interpolationValNeg*(VTC[1] - VTC[0]).Normalized()*CUBE_DIMENSIONS[0]; 06100 } 06101 grad[0].Normalized(); 06102 } 06103 if ( EdgeTable[cubeClass] & 2 ) { 06104 if ( dataForPosition[idx[1] + 3] > threshold ) { 06105 // 06106 // Interpotation Data 06107 interpolationValPlus = VIntp[1].GetY(); 06108 // 06109 vertexList[ 1] = V[1] + interpolationValPlus*(V[2] - V[1]).Normalized()*CUBE_DIMENSIONS[1]; 06110 //grad[1] = G[1] + interpolationValPlus*(G[2] - G[1]).Normalized()*CUBE_DIMENSIONS[1]; 06111 //texCoordList[1] = VTC[1] + interpolationValPlus*(VTC[2] - VTC[1]).Normalized()*CUBE_DIMENSIONS[1]; 06112 } 06113 else { 06114 // 06115 // Interpotation Data 06116 interpolationValNeg = -VIntp[2].GetY(); 06117 // 06118 vertexList[ 1] = V[2] + interpolationValNeg*(V[2] - V[1]).Normalized()*CUBE_DIMENSIONS[1]; 06119 //grad[1] = G[2] + interpolationValNeg*(G[2] - G[1]).Normalized()*CUBE_DIMENSIONS[1]; 06120 //texCoordList[1] = VTC[2] + interpolationValNeg*(VTC[2] - VTC[1]).Normalized()*CUBE_DIMENSIONS[1]; 06121 } 06122 grad[1].Normalized(); 06123 } 06124 if ( EdgeTable[cubeClass] & 4 ) { 06125 if ( dataForPosition[idx[2] + 3] > threshold ) { 06126 // 06127 // Interpotation Data 06128 interpolationValPlus = VIntp[2].GetX(); 06129 // 06130 vertexList[ 2] = V[2] + interpolationValPlus*(V[3] - V[2]).Normalized()*CUBE_DIMENSIONS[0]; 06131 //grad[2] = G[2] + interpolationValPlus*(G[3] - G[2]).Normalized()*CUBE_DIMENSIONS[0]; 06132 //texCoordList[2] = VTC[2] + interpolationValPlus*(VTC[3] - VTC[2]).Normalized()*CUBE_DIMENSIONS[0]; 06133 } 06134 else { 06135 // 06136 // Interpotation Data 06137 interpolationValNeg = -VIntp[3].GetX(); 06138 // 06139 vertexList[ 2] = V[3] + interpolationValNeg*(V[3] - V[2]).Normalized()*CUBE_DIMENSIONS[0]; 06140 //grad[2] = G[3] + interpolationValNeg*(G[3] - G[2]).Normalized()*CUBE_DIMENSIONS[0]; 06141 //texCoordList[2] = VTC[3] + interpolationValNeg*(VTC[3] - VTC[2]).Normalized()*CUBE_DIMENSIONS[0]; 06142 } 06143 grad[2].Normalized(); 06144 } 06145 if ( EdgeTable[cubeClass] & 8 ) { 06146 if ( dataForPosition[idx[0] + 3] > threshold ) { 06147 // 06148 // Interpotation Data 06149 interpolationValPlus = VIntp[0].GetY(); 06150 // 06151 vertexList[ 3] = V[0] + interpolationValPlus*(V[3] - V[0]).Normalized()*CUBE_DIMENSIONS[1]; 06152 //grad[3] = G[0] + interpolationValPlus*(G[3] - G[0]).Normalized()*CUBE_DIMENSIONS[1]; 06153 //texCoordList[3] = VTC[0] + interpolationValPlus*(VTC[3] - VTC[0]).Normalized()*CUBE_DIMENSIONS[1]; 06154 } 06155 else { 06156 // 06157 // Interpotation Data 06158 interpolationValNeg = -VIntp[3].GetY(); 06159 // 06160 vertexList[ 3] = V[3] + interpolationValNeg*(V[3] - V[0]).Normalized()*CUBE_DIMENSIONS[1]; 06161 //grad[3] = G[3] + interpolationValNeg*(G[3] - G[0]).Normalized()*CUBE_DIMENSIONS[1]; 06162 //texCoordList[3] = VTC[3] + interpolationValNeg*(VTC[3] - VTC[0]).Normalized()*CUBE_DIMENSIONS[1]; 06163 } 06164 grad[3].Normalized(); 06165 } 06166 if ( EdgeTable[cubeClass] & 16 ) { 06167 if ( dataForPosition[idx[4] + 3] > threshold ) { 06168 // 06169 // Interpotation Data 06170 interpolationValPlus = VIntp[4].GetX(); 06171 // 06172 vertexList[ 4] = V[4] + interpolationValPlus*(V[5] - V[4]).Normalized()*CUBE_DIMENSIONS[0]; 06173 //grad[4] = G[4] + interpolationValPlus*(G[5] - G[4]).Normalized()*CUBE_DIMENSIONS[0]; 06174 //texCoordList[4] = VTC[4] + interpolationValPlus*(VTC[5] - VTC[4]).Normalized()*CUBE_DIMENSIONS[0]; 06175 } 06176 else { 06177 // 06178 // Interpotation Data 06179 interpolationValNeg = -VIntp[5].GetX(); 06180 // 06181 vertexList[ 4] = V[5] + interpolationValNeg*(V[5] - V[4]).Normalized()*CUBE_DIMENSIONS[0]; 06182 //grad[4] = G[5] + interpolationValNeg*(G[5] - G[4]).Normalized()*CUBE_DIMENSIONS[0]; 06183 //texCoordList[4] = VTC[5] + interpolationValNeg*(VTC[5] - VTC[4]).Normalized()*CUBE_DIMENSIONS[0]; 06184 } 06185 grad[4].Normalized(); 06186 } 06187 if ( EdgeTable[cubeClass] & 32 ) { 06188 if ( dataForPosition[idx[5] + 3] > threshold ) { 06189 // 06190 // Interpotation Data 06191 interpolationValPlus = VIntp[5].GetY(); 06192 // 06193 vertexList[ 5] = V[5] + interpolationValPlus*(V[6] - V[5]).Normalized()*CUBE_DIMENSIONS[1]; 06194 //grad[5] = G[5] + interpolationValPlus*(G[6] - G[5]).Normalized()*CUBE_DIMENSIONS[1]; 06195 //texCoordList[5] = VTC[5] + interpolationValPlus*(VTC[6] - VTC[5]).Normalized()*CUBE_DIMENSIONS[1]; 06196 } 06197 else { 06198 // 06199 // Interpotation Data 06200 interpolationValNeg = -VIntp[6].GetY(); 06201 // 06202 vertexList[ 5] = V[6] + interpolationValNeg*(V[6] - V[5]).Normalized()*CUBE_DIMENSIONS[1]; 06203 //grad[5] = G[6] + interpolationValNeg*(G[6] - G[5]).Normalized()*CUBE_DIMENSIONS[1]; 06204 //texCoordList[5] = VTC[6] + interpolationValNeg*(VTC[6] - VTC[5]).Normalized()*CUBE_DIMENSIONS[1]; 06205 } 06206 grad[5].Normalized(); 06207 } 06208 if ( EdgeTable[cubeClass] & 64 ) { 06209 if ( dataForPosition[idx[6] + 3] > threshold ) { 06210 // 06211 // Interpotation Data 06212 interpolationValPlus = VIntp[6].GetX(); 06213 // 06214 vertexList[ 6] = V[6] + interpolationValPlus*(V[7] - V[6]).Normalized()*CUBE_DIMENSIONS[0]; 06215 //grad[6] = G[6] + interpolationValPlus*(G[7] - G[6]).Normalized()*CUBE_DIMENSIONS[0]; 06216 //texCoordList[6] = VTC[6] + interpolationValPlus*(VTC[7] - VTC[6]).Normalized()*CUBE_DIMENSIONS[0]; 06217 } 06218 else { 06219 // 06220 // Interpotation Data 06221 interpolationValNeg = -VIntp[7].GetX(); 06222 // 06223 vertexList[ 6] = V[7] + interpolationValNeg*(V[7] - V[6]).Normalized()*CUBE_DIMENSIONS[0]; 06224 //grad[6] = G[7] + interpolationValNeg*(G[7] - G[6]).Normalized()*CUBE_DIMENSIONS[0]; 06225 //texCoordList[6] = VTC[7] + interpolationValNeg*(VTC[7] - VTC[6]).Normalized()*CUBE_DIMENSIONS[0]; 06226 } 06227 grad[6].Normalized(); 06228 } 06229 if ( EdgeTable[cubeClass] & 128 ) { 06230 if ( dataForPosition[idx[4] + 3] > threshold ) { 06231 // 06232 // Interpotation Data 06233 interpolationValPlus = VIntp[4].GetY(); 06234 // 06235 vertexList[ 7] = V[4] + interpolationValPlus*(V[7] - V[4]).Normalized()*CUBE_DIMENSIONS[1]; 06236 //grad[7] = G[4] + interpolationValPlus*(G[7] - G[4]).Normalized()*CUBE_DIMENSIONS[1]; 06237 //texCoordList[7] = VTC[4] + interpolationValPlus*(VTC[7] - VTC[4]).Normalized()*CUBE_DIMENSIONS[1]; 06238 } 06239 else { 06240 // 06241 // Interpotation Data 06242 interpolationValNeg = -VIntp[7].GetY(); 06243 // 06244 vertexList[ 7] = V[7] + interpolationValNeg*(V[7] - V[4]).Normalized()*CUBE_DIMENSIONS[1]; 06245 //grad[7] = G[7] + interpolationValNeg*(G[7] - G[4]).Normalized()*CUBE_DIMENSIONS[1]; 06246 //texCoordList[7] = VTC[7] + interpolationValNeg*(VTC[7] - VTC[4]).Normalized()*CUBE_DIMENSIONS[1]; 06247 } 06248 grad[7].Normalized(); 06249 } 06250 if ( EdgeTable[cubeClass] & 256 ) { 06251 if ( dataForPosition[idx[0] + 3] > threshold ) { 06252 // 06253 // Interpotation Data 06254 interpolationValPlus = VIntp[0].GetZ(); 06255 // 06256 vertexList[ 8] = V[0] + interpolationValPlus*(V[4] - V[0]).Normalized()*CUBE_DIMENSIONS[2]; 06257 //grad[8] = G[0] + interpolationValPlus*(G[4] - G[0]).Normalized()*CUBE_DIMENSIONS[2]; 06258 //texCoordList[8] = VTC[0] + interpolationValPlus*(VTC[4] - VTC[0]).Normalized()*CUBE_DIMENSIONS[2]; 06259 } 06260 else { 06261 // 06262 // Interpotation Data 06263 interpolationValNeg = -VIntp[4].GetZ(); 06264 // 06265 vertexList[ 8] = V[4] + interpolationValNeg*(V[4] - V[0]).Normalized()*CUBE_DIMENSIONS[2]; 06266 //grad[8] = G[4] + interpolationValNeg*(G[4] - G[0]).Normalized()*CUBE_DIMENSIONS[2]; 06267 //texCoordList[8] = VTC[4] + interpolationValNeg*(VTC[4] - VTC[0]).Normalized()*CUBE_DIMENSIONS[2]; 06268 } 06269 grad[8].Normalized(); 06270 } 06271 if ( EdgeTable[cubeClass] & 512 ) { 06272 if ( dataForPosition[idx[1] + 3] > threshold ) { 06273 // 06274 // Interpotation Data 06275 interpolationValPlus = VIntp[1].GetZ(); 06276 // 06277 vertexList[ 9] = V[1] + interpolationValPlus*(V[5] - V[1]).Normalized()*CUBE_DIMENSIONS[2]; 06278 //grad[9] = G[1] + interpolationValPlus*(G[5] - G[1]).Normalized()*CUBE_DIMENSIONS[2]; 06279 //texCoordList[9] = VTC[1] + interpolationValPlus*(VTC[5] - VTC[1]).Normalized()*CUBE_DIMENSIONS[2]; 06280 } 06281 else { 06282 // 06283 // Interpotation Data 06284 interpolationValNeg = -VIntp[5].GetZ(); 06285 // 06286 vertexList[ 9] = V[5] + interpolationValNeg*(V[5] - V[1]).Normalized()*CUBE_DIMENSIONS[2]; 06287 //grad[9] = G[5] + interpolationValNeg*(G[5] - G[1]).Normalized()*CUBE_DIMENSIONS[2]; 06288 //texCoordList[9] = VTC[5] + interpolationValNeg*(VTC[5] - VTC[1]).Normalized()*CUBE_DIMENSIONS[2]; 06289 } 06290 grad[9].Normalized(); 06291 } 06292 if ( EdgeTable[cubeClass] & 1024 ) { 06293 if ( dataForPosition[idx[2] + 3] > threshold ) { 06294 // 06295 // Interpotation Data 06296 interpolationValPlus = VIntp[2].GetZ(); 06297 // 06298 vertexList[10] = V[2] + interpolationValPlus*(V[6] - V[2]).Normalized()*CUBE_DIMENSIONS[2]; 06299 //grad[10] = G[2] + interpolationValPlus*(G[6] - G[2]).Normalized()*CUBE_DIMENSIONS[2]; 06300 //texCoordList[10] = VTC[2] + interpolationValPlus*(VTC[6] - VTC[2]).Normalized()*CUBE_DIMENSIONS[2]; 06301 } 06302 else { 06303 // 06304 // Interpotation Data 06305 interpolationValNeg = -VIntp[6].GetZ(); 06306 // 06307 vertexList[10] = V[6] + interpolationValNeg*(V[6] - V[2]).Normalized()*CUBE_DIMENSIONS[2]; 06308 //grad[10] = G[6] + interpolationValNeg*(G[6] - G[2]).Normalized()*CUBE_DIMENSIONS[2]; 06309 //texCoordList[10] = VTC[6] + interpolationValNeg*(VTC[6] - VTC[2]).Normalized()*CUBE_DIMENSIONS[2]; 06310 } 06311 grad[10].Normalized(); 06312 } 06313 if ( EdgeTable[cubeClass] & 2048 ) { 06314 if ( dataForPosition[idx[3] + 3] > threshold ) { 06315 // 06316 // Interpotation Data 06317 interpolationValPlus = VIntp[3].GetZ(); 06318 // 06319 vertexList[11] = V[3] + interpolationValPlus*(V[7] - V[3]).Normalized()*CUBE_DIMENSIONS[2]; 06320 //grad[11] = G[3] + interpolationValPlus*(G[7] - G[3]).Normalized()*CUBE_DIMENSIONS[2]; 06321 //texCoordList[11] = VTC[3] + interpolationValPlus*(VTC[7] - VTC[3]).Normalized()*CUBE_DIMENSIONS[2]; 06322 } 06323 else { 06324 // 06325 // Interpotation Data 06326 interpolationValNeg = -VIntp[7].GetZ(); 06327 // 06328 vertexList[11] = V[7] + interpolationValNeg*(V[7] - V[3]).Normalized()*CUBE_DIMENSIONS[2]; 06329 //grad[11] = G[7] + interpolationValNeg*(G[7] - G[3]).Normalized()*CUBE_DIMENSIONS[2]; 06330 //texCoordList[11] = VTC[7] + interpolationValNeg*(VTC[7] - VTC[3]).Normalized()*CUBE_DIMENSIONS[2]; 06331 } 06332 grad[11].Normalized(); 06333 } 06334 } // End processing `left' or `right' cube 06335 //--------------------------------------- 06336 //======================================= 06337 //*************************************** 06338 //*/ 06339 06340 06341 06342 } // END: Not Use Global Interpolation Value 06343 //----------------------------------------------- 06344 // Use Global Interpolation Value -- all elements have the same interpolation value 06345 else { 06346 //------------------------------------- 06347 // Marching Cube Interpolation 06348 T interpolationValPlus = m_tGlobalInterpolationVal; 06349 T interpolationValNeg = 1.0 - m_tGlobalInterpolationVal; 06350 //T interpolationValPlus = 0.3; 06351 //T interpolationValNeg = 1.0 - 0.3; 06352 06353 06354 /* 06355 //*************************************** 06356 // Normal Interpolation 06357 //======================================= 06358 //--------------------------------------- 06359 // Edge# 0 to 11 <==> [ 1, 2, 4, ... , 2048 ] 06360 if ( EdgeTable[cubeClass] & 1 ) { 06361 if ( dataForPosition[idx[0] + 3] > threshold ) { 06362 // 06363 // Interpotation Data 06364 //interpolationValPlus = VIntp[0].GetX(); 06365 // 06366 vertexList[ 0] = V[0] + interpolationValPlus*(V[1] - V[0]); 06367 grad[0] = G[0] + interpolationValPlus*(G[1] - G[0]); 06368 texCoordList[0] = VTC[0] + interpolationValPlus*(VTC[1] - VTC[0]); 06369 } 06370 else { 06371 // 06372 // Interpotation Data 06373 //interpolationValNeg = 1.0 - VIntp[1].GetX(); 06374 // 06375 vertexList[ 0] = V[0] + interpolationValNeg*(V[1] - V[0]); 06376 grad[0] = G[0] + interpolationValNeg*(G[1] - G[0]); 06377 texCoordList[0] = VTC[0] + interpolationValNeg*(VTC[1] - VTC[0]); 06378 } 06379 grad[0].Normalized(); 06380 } 06381 if ( EdgeTable[cubeClass] & 2 ) { 06382 if ( dataForPosition[idx[1] + 3] > threshold ) { 06383 // 06384 // Interpotation Data 06385 //interpolationValPlus = VIntp[1].GetY(); 06386 // 06387 vertexList[ 1] = V[1] + interpolationValPlus*(V[2] - V[1]); 06388 grad[1] = G[1] + interpolationValPlus*(G[2] - G[1]); 06389 texCoordList[1] = VTC[1] + interpolationValPlus*(VTC[2] - VTC[1]); 06390 } 06391 else { 06392 // 06393 // Interpotation Data 06394 //interpolationValNeg = 1.0 - VIntp[2].GetY(); 06395 // 06396 vertexList[ 1] = V[1] + interpolationValNeg*(V[2] - V[1]); 06397 grad[1] = G[1] + interpolationValNeg*(G[2] - G[1]); 06398 texCoordList[1] = VTC[1] + interpolationValNeg*(VTC[2] - VTC[1]); 06399 } 06400 grad[1].Normalized(); 06401 } 06402 if ( EdgeTable[cubeClass] & 4 ) { 06403 if ( dataForPosition[idx[2] + 3] > threshold ) { 06404 // 06405 // Interpotation Data 06406 //interpolationValPlus = VIntp[2].GetX(); 06407 // 06408 vertexList[ 2] = V[2] + interpolationValPlus*(V[3] - V[2]); 06409 grad[2] = G[2] + interpolationValPlus*(G[3] - G[2]); 06410 texCoordList[2] = VTC[2] + interpolationValPlus*(VTC[3] - VTC[2]); 06411 } 06412 else { 06413 // 06414 // Interpotation Data 06415 //interpolationValNeg = 1.0 - VIntp[3].GetX(); 06416 // 06417 vertexList[ 2] = V[2] + interpolationValNeg*(V[3] - V[2]); 06418 grad[2] = G[2] + interpolationValNeg*(G[3] - G[2]); 06419 texCoordList[2] = VTC[2] + interpolationValNeg*(VTC[3] - VTC[2]); 06420 } 06421 grad[2].Normalized(); 06422 } 06423 if ( EdgeTable[cubeClass] & 8 ) { 06424 if ( dataForPosition[idx[0] + 3] > threshold ) { 06425 // 06426 // Interpotation Data 06427 //interpolationValPlus = VIntp[0].GetY(); 06428 // 06429 vertexList[ 3] = V[0] + interpolationValPlus*(V[3] - V[0]); 06430 grad[3] = G[0] + interpolationValPlus*(G[3] - G[0]); 06431 texCoordList[3] = VTC[0] + interpolationValPlus*(VTC[3] - VTC[0]); 06432 } 06433 else { 06434 // 06435 // Interpotation Data 06436 //interpolationValNeg = 1.0 - VIntp[3].GetY(); 06437 // 06438 vertexList[ 3] = V[0] + interpolationValNeg*(V[3] - V[0]); 06439 grad[3] = G[0] + interpolationValNeg*(G[3] - G[0]); 06440 texCoordList[3] = VTC[0] + interpolationValNeg*(VTC[3] - VTC[0]); 06441 } 06442 grad[3].Normalized(); 06443 } 06444 if ( EdgeTable[cubeClass] & 16 ) { 06445 if ( dataForPosition[idx[4] + 3] > threshold ) { 06446 // 06447 // Interpotation Data 06448 //interpolationValPlus = VIntp[4].GetX(); 06449 // 06450 vertexList[ 4] = V[4] + interpolationValPlus*(V[5] - V[4]); 06451 grad[4] = G[4] + interpolationValPlus*(G[5] - G[4]); 06452 texCoordList[4] = VTC[4] + interpolationValPlus*(VTC[5] - VTC[4]); 06453 } 06454 else { 06455 // 06456 // Interpotation Data 06457 //interpolationValNeg = 1.0 - VIntp[5].GetX(); 06458 // 06459 vertexList[ 4] = V[4] + interpolationValNeg*(V[5] - V[4]); 06460 grad[4] = G[4] + interpolationValNeg*(G[5] - G[4]); 06461 texCoordList[4] = VTC[4] + interpolationValNeg*(VTC[5] - VTC[4]); 06462 } 06463 grad[4].Normalized(); 06464 } 06465 if ( EdgeTable[cubeClass] & 32 ) { 06466 if ( dataForPosition[idx[5] + 3] > threshold ) { 06467 // 06468 // Interpotation Data 06469 //interpolationValPlus = VIntp[5].GetY(); 06470 // 06471 vertexList[ 5] = V[5] + interpolationValPlus*(V[6] - V[5]); 06472 grad[5] = G[5] + interpolationValPlus*(G[6] - G[5]); 06473 texCoordList[5] = VTC[5] + interpolationValPlus*(VTC[6] - VTC[5]); 06474 } 06475 else { 06476 // 06477 // Interpotation Data 06478 //interpolationValNeg = 1.0 - VIntp[6].GetY(); 06479 // 06480 vertexList[ 5] = V[5] + interpolationValNeg*(V[6] - V[5]); 06481 grad[5] = G[5] + interpolationValNeg*(G[6] - G[5]); 06482 texCoordList[5] = VTC[5] + interpolationValNeg*(VTC[6] - VTC[5]); 06483 } 06484 grad[5].Normalized(); 06485 } 06486 if ( EdgeTable[cubeClass] & 64 ) { 06487 if ( dataForPosition[idx[6] + 3] > threshold ) { 06488 // 06489 // Interpotation Data 06490 //interpolationValPlus = VIntp[6].GetX(); 06491 // 06492 vertexList[ 6] = V[6] + interpolationValPlus*(V[7] - V[6]); 06493 grad[6] = G[6] + interpolationValPlus*(G[7] - G[6]); 06494 texCoordList[6] = VTC[6] + interpolationValPlus*(VTC[7] - VTC[6]); 06495 } 06496 else { 06497 // 06498 // Interpotation Data 06499 //interpolationValNeg = 1.0 - VIntp[7].GetX(); 06500 // 06501 vertexList[ 6] = V[6] + interpolationValNeg*(V[7] - V[6]); 06502 grad[6] = G[6] + interpolationValNeg*(G[7] - G[6]); 06503 texCoordList[6] = VTC[6] + interpolationValNeg*(VTC[7] - VTC[6]); 06504 } 06505 grad[6].Normalized(); 06506 } 06507 if ( EdgeTable[cubeClass] & 128 ) { 06508 if ( dataForPosition[idx[4] + 3] > threshold ) { 06509 // 06510 // Interpotation Data 06511 //interpolationValPlus = VIntp[4].GetY(); 06512 // 06513 vertexList[ 7] = V[4] + interpolationValPlus*(V[7] - V[4]); 06514 grad[7] = G[4] + interpolationValPlus*(G[7] - G[4]); 06515 texCoordList[7] = VTC[4] + interpolationValPlus*(VTC[7] - VTC[4]); 06516 } 06517 else { 06518 // 06519 // Interpotation Data 06520 //interpolationValNeg = 1.0 - VIntp[7].GetY(); 06521 // 06522 vertexList[ 7] = V[4] + interpolationValNeg*(V[7] - V[4]); 06523 grad[7] = G[4] + interpolationValNeg*(G[7] - G[4]); 06524 texCoordList[7] = VTC[4] + interpolationValNeg*(VTC[7] - VTC[4]); 06525 } 06526 grad[7].Normalized(); 06527 } 06528 if ( EdgeTable[cubeClass] & 256 ) { 06529 if ( dataForPosition[idx[0] + 3] > threshold ) { 06530 // 06531 // Interpotation Data 06532 //interpolationValPlus = VIntp[0].GetZ(); 06533 // 06534 vertexList[ 8] = V[0] + interpolationValPlus*(V[4] - V[0]); 06535 grad[8] = G[0] + interpolationValPlus*(G[4] - G[0]); 06536 texCoordList[8] = VTC[0] + interpolationValPlus*(VTC[4] - VTC[0]); 06537 } 06538 else { 06539 // 06540 // Interpotation Data 06541 //interpolationValNeg = 1.0 - VIntp[4].GetZ(); 06542 // 06543 vertexList[ 8] = V[0] + interpolationValNeg*(V[4] - V[0]); 06544 grad[8] = G[0] + interpolationValNeg*(G[4] - G[0]); 06545 texCoordList[8] = VTC[0] + interpolationValNeg*(VTC[4] - VTC[0]); 06546 } 06547 grad[8].Normalized(); 06548 } 06549 if ( EdgeTable[cubeClass] & 512 ) { 06550 if ( dataForPosition[idx[1] + 3] > threshold ) { 06551 // 06552 // Interpotation Data 06553 //interpolationValPlus = VIntp[1].GetZ(); 06554 // 06555 vertexList[ 9] = V[1] + interpolationValPlus*(V[5] - V[1]); 06556 grad[9] = G[1] + interpolationValPlus*(G[5] - G[1]); 06557 texCoordList[9] = VTC[1] + interpolationValPlus*(VTC[5] - VTC[1]); 06558 } 06559 else { 06560 // 06561 // Interpotation Data 06562 //interpolationValNeg = 1.0 - VIntp[5].GetZ(); 06563 // 06564 vertexList[ 9] = V[1] + interpolationValNeg*(V[5] - V[1]); 06565 grad[9] = G[1] + interpolationValNeg*(G[5] - G[1]); 06566 texCoordList[9] = VTC[1] + interpolationValNeg*(VTC[5] - VTC[1]); 06567 } 06568 grad[9].Normalized(); 06569 } 06570 if ( EdgeTable[cubeClass] & 1024 ) { 06571 if ( dataForPosition[idx[2] + 3] > threshold ) { 06572 // 06573 // Interpotation Data 06574 //interpolationValPlus = VIntp[2].GetZ(); 06575 // 06576 vertexList[10] = V[2] + interpolationValPlus*(V[6] - V[2]); 06577 grad[10] = G[2] + interpolationValPlus*(G[6] - G[2]); 06578 texCoordList[10] = VTC[2] + interpolationValPlus*(VTC[6] - VTC[2]); 06579 } 06580 else { 06581 // 06582 // Interpotation Data 06583 //interpolationValNeg = 1.0 - VIntp[6].GetZ(); 06584 // 06585 vertexList[10] = V[2] + interpolationValNeg*(V[6] - V[2]); 06586 grad[10] = G[2] + interpolationValNeg*(G[6] - G[2]); 06587 texCoordList[10] = VTC[2] + interpolationValNeg*(VTC[6] - VTC[2]); 06588 } 06589 grad[10].Normalized(); 06590 } 06591 if ( EdgeTable[cubeClass] & 2048 ) { 06592 if ( dataForPosition[idx[3] + 3] > threshold ) { 06593 // 06594 // Interpotation Data 06595 //interpolationValPlus = VIntp[3].GetZ(); 06596 // 06597 vertexList[11] = V[3] + interpolationValPlus*(V[7] - V[3]); 06598 grad[11] = G[3] + interpolationValPlus*(G[7] - G[3]); 06599 texCoordList[11] = VTC[3] + interpolationValPlus*(VTC[7] - VTC[3]); 06600 } 06601 else { 06602 // 06603 // Interpotation Data 06604 //interpolationValNeg = 1.0 - VIntp[7].GetZ(); 06605 // 06606 vertexList[11] = V[3] + interpolationValNeg*(V[7] - V[3]); 06607 grad[11] = G[3] + interpolationValNeg*(G[7] - G[3]); 06608 texCoordList[11] = VTC[3] + interpolationValNeg*(VTC[7] - VTC[3]); 06609 } 06610 grad[11].Normalized(); 06611 } 06612 //--------------------------------------- 06613 //======================================= 06614 //*************************************** 06615 //*/ 06616 06617 06618 06619 //* 06620 //*************************************** 06621 // Fixed Distance Interpolation 06622 //======================================= 06623 //--------------------------------------- 06624 // Edge# 0 to 11 <==> [ 1, 2, 4, ... , 2048 ] 06625 if ( EdgeTable[cubeClass] & 1 ) { 06626 if ( dataForPosition[idx[0] + 3] > threshold ) { 06627 // 06628 // Interpotation Data 06629 //interpolationValPlus = VIntp[0].GetX(); 06630 // 06631 vertexList[ 0] = V[0] + interpolationValPlus*(V[1] - V[0]).Normalized()*CUBE_DIMENSIONS[0]; 06632 grad[0] = G[0] + interpolationValPlus*(G[1] - G[0]).Normalized()*CUBE_DIMENSIONS[0]; 06633 texCoordList[0] = VTC[0] + interpolationValPlus*(VTC[1] - VTC[0]).Normalized()*CUBE_DIMENSIONS[0]; 06634 } 06635 else { 06636 // 06637 // Interpotation Data 06638 //interpolationValPlus = 1.0 - VIntp[1].GetX(); 06639 // 06640 vertexList[ 0] = V[1] - interpolationValPlus*(V[1] - V[0]).Normalized()*CUBE_DIMENSIONS[0]; 06641 grad[0] = G[1] - interpolationValPlus*(G[1] - G[0]).Normalized()*CUBE_DIMENSIONS[0]; 06642 texCoordList[0] = VTC[1] - interpolationValPlus*(VTC[1] - VTC[0]).Normalized()*CUBE_DIMENSIONS[0]; 06643 } 06644 grad[0].Normalized(); 06645 } 06646 if ( EdgeTable[cubeClass] & 2 ) { 06647 if ( dataForPosition[idx[1] + 3] > threshold ) { 06648 // 06649 // Interpotation Data 06650 //interpolationValPlus = VIntp[1].GetY(); 06651 // 06652 vertexList[ 1] = V[1] + interpolationValPlus*(V[2] - V[1]).Normalized()*CUBE_DIMENSIONS[1]; 06653 grad[1] = G[1] + interpolationValPlus*(G[2] - G[1]).Normalized()*CUBE_DIMENSIONS[1]; 06654 texCoordList[1] = VTC[1] + interpolationValPlus*(VTC[2] - VTC[1]).Normalized()*CUBE_DIMENSIONS[1]; 06655 } 06656 else { 06657 // 06658 // Interpotation Data 06659 //interpolationValPlus = 1.0 - VIntp[2].GetY(); 06660 // 06661 vertexList[ 1] = V[2] - interpolationValPlus*(V[2] - V[1]).Normalized()*CUBE_DIMENSIONS[1]; 06662 grad[1] = G[2] - interpolationValPlus*(G[2] - G[1]).Normalized()*CUBE_DIMENSIONS[1]; 06663 texCoordList[1] = VTC[2] - interpolationValPlus*(VTC[2] - VTC[1]).Normalized()*CUBE_DIMENSIONS[1]; 06664 } 06665 grad[1].Normalized(); 06666 } 06667 if ( EdgeTable[cubeClass] & 4 ) { 06668 if ( dataForPosition[idx[2] + 3] > threshold ) { 06669 // 06670 // Interpotation Data 06671 //interpolationValPlus = VIntp[2].GetX(); 06672 // 06673 vertexList[ 2] = V[2] + interpolationValPlus*(V[3] - V[2]).Normalized()*CUBE_DIMENSIONS[0]; 06674 grad[2] = G[2] + interpolationValPlus*(G[3] - G[2]).Normalized()*CUBE_DIMENSIONS[0]; 06675 texCoordList[2] = VTC[2] + interpolationValPlus*(VTC[3] - VTC[2]).Normalized()*CUBE_DIMENSIONS[0]; 06676 } 06677 else { 06678 // 06679 // Interpotation Data 06680 //interpolationValPlus = 1.0 - VIntp[3].GetX(); 06681 // 06682 vertexList[ 2] = V[3] - interpolationValPlus*(V[3] - V[2]).Normalized()*CUBE_DIMENSIONS[0]; 06683 grad[2] = G[3] - interpolationValPlus*(G[3] - G[2]).Normalized()*CUBE_DIMENSIONS[0]; 06684 texCoordList[2] = VTC[3] - interpolationValPlus*(VTC[3] - VTC[2]).Normalized()*CUBE_DIMENSIONS[0]; 06685 } 06686 grad[2].Normalized(); 06687 } 06688 if ( EdgeTable[cubeClass] & 8 ) { 06689 if ( dataForPosition[idx[0] + 3] > threshold ) { 06690 // 06691 // Interpotation Data 06692 //interpolationValPlus = VIntp[0].GetY(); 06693 // 06694 vertexList[ 3] = V[0] + interpolationValPlus*(V[3] - V[0]).Normalized()*CUBE_DIMENSIONS[1]; 06695 grad[3] = G[0] + interpolationValPlus*(G[3] - G[0]).Normalized()*CUBE_DIMENSIONS[1]; 06696 texCoordList[3] = VTC[0] + interpolationValPlus*(VTC[3] - VTC[0]).Normalized()*CUBE_DIMENSIONS[1]; 06697 } 06698 else { 06699 // 06700 // Interpotation Data 06701 //interpolationValPlus = 1.0 - VIntp[3].GetY(); 06702 // 06703 vertexList[ 3] = V[3] - interpolationValPlus*(V[3] - V[0]).Normalized()*CUBE_DIMENSIONS[1]; 06704 grad[3] = G[3] - interpolationValPlus*(G[3] - G[0]).Normalized()*CUBE_DIMENSIONS[1]; 06705 texCoordList[3] = VTC[3] - interpolationValPlus*(VTC[3] - VTC[0]).Normalized()*CUBE_DIMENSIONS[1]; 06706 } 06707 grad[3].Normalized(); 06708 } 06709 if ( EdgeTable[cubeClass] & 16 ) { 06710 if ( dataForPosition[idx[4] + 3] > threshold ) { 06711 // 06712 // Interpotation Data 06713 //interpolationValPlus = VIntp[4].GetX(); 06714 // 06715 vertexList[ 4] = V[4] + interpolationValPlus*(V[5] - V[4]).Normalized()*CUBE_DIMENSIONS[0]; 06716 grad[4] = G[4] + interpolationValPlus*(G[5] - G[4]).Normalized()*CUBE_DIMENSIONS[0]; 06717 texCoordList[4] = VTC[4] + interpolationValPlus*(VTC[5] - VTC[4]).Normalized()*CUBE_DIMENSIONS[0]; 06718 } 06719 else { 06720 // 06721 // Interpotation Data 06722 //interpolationValPlus = 1.0 - VIntp[5].GetX(); 06723 // 06724 vertexList[ 4] = V[5] - interpolationValPlus*(V[5] - V[4]).Normalized()*CUBE_DIMENSIONS[0]; 06725 grad[4] = G[5] - interpolationValPlus*(G[5] - G[4]).Normalized()*CUBE_DIMENSIONS[0]; 06726 texCoordList[4] = VTC[5] - interpolationValPlus*(VTC[5] - VTC[4]).Normalized()*CUBE_DIMENSIONS[0]; 06727 } 06728 grad[4].Normalized(); 06729 } 06730 if ( EdgeTable[cubeClass] & 32 ) { 06731 if ( dataForPosition[idx[5] + 3] > threshold ) { 06732 // 06733 // Interpotation Data 06734 //interpolationValPlus = VIntp[5].GetY(); 06735 // 06736 vertexList[ 5] = V[5] + interpolationValPlus*(V[6] - V[5]).Normalized()*CUBE_DIMENSIONS[1]; 06737 grad[5] = G[5] + interpolationValPlus*(G[6] - G[5]).Normalized()*CUBE_DIMENSIONS[1]; 06738 texCoordList[5] = VTC[5] + interpolationValPlus*(VTC[6] - VTC[5]).Normalized()*CUBE_DIMENSIONS[1]; 06739 } 06740 else { 06741 // 06742 // Interpotation Data 06743 //interpolationValPlus = 1.0 - VIntp[6].GetY(); 06744 // 06745 vertexList[ 5] = V[6] - interpolationValPlus*(V[6] - V[5]).Normalized()*CUBE_DIMENSIONS[1]; 06746 grad[5] = G[6] - interpolationValPlus*(G[6] - G[5]).Normalized()*CUBE_DIMENSIONS[1]; 06747 texCoordList[5] = VTC[6] - interpolationValPlus*(VTC[6] - VTC[5]).Normalized()*CUBE_DIMENSIONS[1]; 06748 } 06749 grad[5].Normalized(); 06750 } 06751 if ( EdgeTable[cubeClass] & 64 ) { 06752 if ( dataForPosition[idx[6] + 3] > threshold ) { 06753 // 06754 // Interpotation Data 06755 //interpolationValPlus = VIntp[6].GetX(); 06756 // 06757 vertexList[ 6] = V[6] + interpolationValPlus*(V[7] - V[6]).Normalized()*CUBE_DIMENSIONS[0]; 06758 grad[6] = G[6] + interpolationValPlus*(G[7] - G[6]).Normalized()*CUBE_DIMENSIONS[0]; 06759 texCoordList[6] = VTC[6] + interpolationValPlus*(VTC[7] - VTC[6]).Normalized()*CUBE_DIMENSIONS[0]; 06760 } 06761 else { 06762 // 06763 // Interpotation Data 06764 //interpolationValPlus = 1.0 - VIntp[7].GetX(); 06765 // 06766 vertexList[ 6] = V[7] - interpolationValPlus*(V[7] - V[6]).Normalized()*CUBE_DIMENSIONS[0]; 06767 grad[6] = G[7] - interpolationValPlus*(G[7] - G[6]).Normalized()*CUBE_DIMENSIONS[0]; 06768 texCoordList[6] = VTC[7] - interpolationValPlus*(VTC[7] - VTC[6]).Normalized()*CUBE_DIMENSIONS[0]; 06769 } 06770 grad[6].Normalized(); 06771 } 06772 if ( EdgeTable[cubeClass] & 128 ) { 06773 if ( dataForPosition[idx[4] + 3] > threshold ) { 06774 // 06775 // Interpotation Data 06776 //interpolationValPlus = VIntp[4].GetY(); 06777 // 06778 vertexList[ 7] = V[4] + interpolationValPlus*(V[7] - V[4]).Normalized()*CUBE_DIMENSIONS[1]; 06779 grad[7] = G[4] + interpolationValPlus*(G[7] - G[4]).Normalized()*CUBE_DIMENSIONS[1]; 06780 texCoordList[7] = VTC[4] + interpolationValPlus*(VTC[7] - VTC[4]).Normalized()*CUBE_DIMENSIONS[1]; 06781 } 06782 else { 06783 // 06784 // Interpotation Data 06785 //interpolationValPlus = 1.0 - VIntp[7].GetY(); 06786 // 06787 vertexList[ 7] = V[7] - interpolationValPlus*(V[7] - V[4]).Normalized()*CUBE_DIMENSIONS[1]; 06788 grad[7] = G[7] - interpolationValPlus*(G[7] - G[4]).Normalized()*CUBE_DIMENSIONS[1]; 06789 texCoordList[7] = VTC[7] - interpolationValPlus*(VTC[7] - VTC[4]).Normalized()*CUBE_DIMENSIONS[1]; 06790 } 06791 grad[7].Normalized(); 06792 } 06793 if ( EdgeTable[cubeClass] & 256 ) { 06794 if ( dataForPosition[idx[0] + 3] > threshold ) { 06795 // 06796 // Interpotation Data 06797 //interpolationValPlus = VIntp[0].GetZ(); 06798 // 06799 vertexList[ 8] = V[0] + interpolationValPlus*(V[4] - V[0]).Normalized()*CUBE_DIMENSIONS[2]; 06800 grad[8] = G[0] + interpolationValPlus*(G[4] - G[0]).Normalized()*CUBE_DIMENSIONS[2]; 06801 texCoordList[8] = VTC[0] + interpolationValPlus*(VTC[4] - VTC[0]).Normalized()*CUBE_DIMENSIONS[2]; 06802 } 06803 else { 06804 // 06805 // Interpotation Data 06806 //interpolationValPlus = 1.0 - VIntp[4].GetZ(); 06807 // 06808 vertexList[ 8] = V[4] - interpolationValPlus*(V[4] - V[0]).Normalized()*CUBE_DIMENSIONS[2]; 06809 grad[8] = G[4] - interpolationValPlus*(G[4] - G[0]).Normalized()*CUBE_DIMENSIONS[2]; 06810 texCoordList[8] = VTC[4] - interpolationValPlus*(VTC[4] - VTC[0]).Normalized()*CUBE_DIMENSIONS[2]; 06811 } 06812 grad[8].Normalized(); 06813 } 06814 if ( EdgeTable[cubeClass] & 512 ) { 06815 if ( dataForPosition[idx[1] + 3] > threshold ) { 06816 // 06817 // Interpotation Data 06818 //interpolationValPlus = VIntp[1].GetZ(); 06819 // 06820 vertexList[ 9] = V[1] + interpolationValPlus*(V[5] - V[1]).Normalized()*CUBE_DIMENSIONS[2]; 06821 grad[9] = G[1] + interpolationValPlus*(G[5] - G[1]).Normalized()*CUBE_DIMENSIONS[2]; 06822 texCoordList[9] = VTC[1] + interpolationValPlus*(VTC[5] - VTC[1]).Normalized()*CUBE_DIMENSIONS[2]; 06823 } 06824 else { 06825 // 06826 // Interpotation Data 06827 //interpolationValPlus = 1.0 - VIntp[5].GetZ(); 06828 // 06829 vertexList[ 9] = V[5] - interpolationValPlus*(V[5] - V[1]).Normalized()*CUBE_DIMENSIONS[2]; 06830 grad[9] = G[5] - interpolationValPlus*(G[5] - G[1]).Normalized()*CUBE_DIMENSIONS[2]; 06831 texCoordList[9] = VTC[5] - interpolationValPlus*(VTC[5] - VTC[1]).Normalized()*CUBE_DIMENSIONS[2]; 06832 } 06833 grad[9].Normalized(); 06834 } 06835 if ( EdgeTable[cubeClass] & 1024 ) { 06836 if ( dataForPosition[idx[2] + 3] > threshold ) { 06837 // 06838 // Interpotation Data 06839 //interpolationValPlus = VIntp[2].GetZ(); 06840 // 06841 vertexList[10] = V[2] + interpolationValPlus*(V[6] - V[2]).Normalized()*CUBE_DIMENSIONS[2]; 06842 grad[10] = G[2] + interpolationValPlus*(G[6] - G[2]).Normalized()*CUBE_DIMENSIONS[2]; 06843 texCoordList[10] = VTC[2] + interpolationValPlus*(VTC[6] - VTC[2]).Normalized()*CUBE_DIMENSIONS[2]; 06844 } 06845 else { 06846 // 06847 // Interpotation Data 06848 //interpolationValPlus = 1.0 - VIntp[6].GetZ(); 06849 // 06850 vertexList[10] = V[6] - interpolationValPlus*(V[6] - V[2]).Normalized()*CUBE_DIMENSIONS[2]; 06851 grad[10] = G[6] - interpolationValPlus*(G[6] - G[2]).Normalized()*CUBE_DIMENSIONS[2]; 06852 texCoordList[10] = VTC[6] - interpolationValPlus*(VTC[6] - VTC[2]).Normalized()*CUBE_DIMENSIONS[2]; 06853 } 06854 grad[10].Normalized(); 06855 } 06856 if ( EdgeTable[cubeClass] & 2048 ) { 06857 if ( dataForPosition[idx[3] + 3] > threshold ) { 06858 // 06859 // Interpotation Data 06860 //interpolationValPlus = VIntp[3].GetZ(); 06861 // 06862 vertexList[11] = V[3] + interpolationValPlus*(V[7] - V[3]).Normalized()*CUBE_DIMENSIONS[2]; 06863 grad[11] = G[3] + interpolationValPlus*(G[7] - G[3]).Normalized()*CUBE_DIMENSIONS[2]; 06864 texCoordList[11] = VTC[3] + interpolationValPlus*(VTC[7] - VTC[3]).Normalized()*CUBE_DIMENSIONS[2]; 06865 } 06866 else { 06867 // 06868 // Interpotation Data 06869 //interpolationValPlus = 1.0 - VIntp[7].GetZ(); 06870 // 06871 vertexList[11] = V[7] - interpolationValPlus*(V[7] - V[3]).Normalized()*CUBE_DIMENSIONS[2]; 06872 grad[11] = G[7] - interpolationValPlus*(G[7] - G[3]).Normalized()*CUBE_DIMENSIONS[2]; 06873 texCoordList[11] = VTC[7] - interpolationValPlus*(VTC[7] - VTC[3]).Normalized()*CUBE_DIMENSIONS[2]; 06874 } 06875 grad[11].Normalized(); 06876 } 06877 //--------------------------------------- 06878 //======================================= 06879 //*************************************** 06880 //*/ 06881 06882 06883 06884 } // END: Use Global Interpolation Value 06885 //----------------------------------------------- 06886 // END: if/else statement for MC Interpolation 06887 //=============================================== 06888 06889 //=============================================== 06890 //----------------------------------------------- 06891 // Generate Triangle Index 06892 numOfTrisPerCell = 0; 06893 for ( d = 0; TriTable[cubeClass][d] != -1; ++d ) { 06894 triIndices[d] = TriTable[cubeClass][d]; 06895 } 06896 numOfTrisPerCell = d / 3; 06897 //----------------------------------------------- 06898 //=============================================== 06899 } 06900 06901 /* 06902 //------------------------------- 06903 // Draw (Gradient) Normals 06904 { 06905 glPushAttrib( GL_ALL_ATTRIB_BITS ); 06906 glBegin( GL_LINES ); 06907 glDisable( GL_TEXTURE_3D ); 06908 glDisable( GL_BLEND ); 06909 glDisable( GL_LIGHTING ); 06910 for ( int i = 0; i < numOfTrisPerCell*3; i+=3 ) { 06911 glColor3f( 1, 0, 0 ); 06912 glVertex3fv( vertexList[triIndices[i+2]].GetDataFloat() ); 06913 glVertex3fv( ( vertexList[triIndices[i+2]] + grad[triIndices[i+2]]*0.15 ).GetDataFloat() ); 06914 glColor3f( 0, 1, 0 ); 06915 glVertex3fv( vertexList[triIndices[i+1]].GetDataFloat() ); 06916 glVertex3fv( ( vertexList[triIndices[i+1]] + grad[triIndices[i+1]]*0.15 ).GetDataFloat() ); 06917 glColor3f( 0, 0, 1 ); 06918 glVertex3fv( vertexList[triIndices[i+0]].GetDataFloat() ); 06919 glVertex3fv( ( vertexList[triIndices[i+0]] + grad[triIndices[i+0]]*0.15 ).GetDataFloat() ); 06920 } 06921 glEnd(); 06922 glPopAttrib(); 06923 } 06924 //------------------------------- 06925 //*/ 06926 06927 //------------------------------- 06928 // Draw PN-Triangles generated 06929 // from Marching Cube Triangles 06930 if ( m_bDrawPNTriangle ) { 06931 int i = 0; 06932 while ( numOfTrisPerCell > 0 ) { 06933 PNTriangle<T>::DrawByOpenGL( 06934 vertexList[triIndices[i+2]], 06935 vertexList[triIndices[i+1]], 06936 vertexList[triIndices[i+0]], 06937 grad[triIndices[i+2]], 06938 grad[triIndices[i+1]], 06939 grad[triIndices[i+0]], 06940 texCoordList[triIndices[i+2]], 06941 texCoordList[triIndices[i+1]], 06942 texCoordList[triIndices[i+0]], 06943 m_PNTriangleSmoothness 06944 ); 06945 --numOfTrisPerCell; 06946 i += 3; 06947 } 06948 } 06949 // DEBUG for PNTri Drawing 06950 //glUseProgramObjectARB( g_PNTriProg ); 06951 // 06952 // DEBUG for PNTri Drawing 06953 //glUseProgramObjectARB( NULL ); 06954 06955 //------------------------------- 06956 // Draw Marching Cube Triangles 06957 else { 06958 06959 /* 06960 //************************************* 06961 // DEBUG 06962 { 06963 glPushAttrib( GL_ALL_ATTRIB_BITS ); 06964 glDisable( GL_LIGHTING ); 06965 glDisable( GL_BLEND ); 06966 glDisable( GL_TEXTURE_3D ); 06967 glColor3ub( 200, 50, 100 ); 06968 //glColor3f( 0.0, 0.0, 1.0 ); 06969 glBegin( GL_POINTS ); 06970 int count = numOfTrisPerCell; 06971 int i = 0; 06972 while ( count > 0 ) { 06973 //glTexCoord3fv( texCoordList[triIndices[i+2]].GetDataFloat() ); 06974 glColor3f( 1, 0, 0 ); 06975 glNormal3fv( grad[triIndices[i+2]].GetDataFloat() ); 06976 glVertex3fv( vertexList[triIndices[i+2]].GetDataFloat() ); 06977 // 06978 //glTexCoord3fv( texCoordList[triIndices[i+1]].GetDataFloat() ); 06979 glColor3f( 0, 1, 0 ); 06980 glNormal3fv( grad[triIndices[i+1]].GetDataFloat() ); 06981 glVertex3fv( vertexList[triIndices[i+1]].GetDataFloat() ); 06982 // 06983 //glTexCoord3fv( texCoordList[triIndices[i+0]].GetDataFloat() ); 06984 glColor3f( 0, 0, 1 ); 06985 glNormal3fv( grad[triIndices[i+0]].GetDataFloat() ); 06986 glVertex3fv( vertexList[triIndices[i+0]].GetDataFloat() ); 06987 // 06988 --count; 06989 i += 3; 06990 } 06991 glEnd(); 06992 glPopAttrib(); 06993 } 06994 //************************************* 06995 //*/ 06996 06997 //glBegin( GL_LINE_LOOP ); 06998 glBegin( GL_TRIANGLES ); 06999 int i = 0; 07000 while ( numOfTrisPerCell > 0 ) { 07001 glTexCoord3fv( texCoordList[triIndices[i+2]].GetDataFloat() ); 07002 glNormal3fv( grad[triIndices[i+2]].GetDataFloat() ); 07003 glVertex3fv( vertexList[triIndices[i+2]].GetDataFloat() ); 07004 // 07005 glTexCoord3fv( texCoordList[triIndices[i+1]].GetDataFloat() ); 07006 glNormal3fv( grad[triIndices[i+1]].GetDataFloat() ); 07007 glVertex3fv( vertexList[triIndices[i+1]].GetDataFloat() ); 07008 // 07009 glTexCoord3fv( texCoordList[triIndices[i+0]].GetDataFloat() ); 07010 glNormal3fv( grad[triIndices[i+0]].GetDataFloat() ); 07011 glVertex3fv( vertexList[triIndices[i+0]].GetDataFloat() ); 07012 // 07013 --numOfTrisPerCell; 07014 i += 3; 07015 } 07016 glEnd(); 07017 } 07018 07019 //#ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 07021 //if ( isFirstRun ) { 07022 // if ( cubeClass < 100 ) std::cout << " "; 07023 // if ( cubeClass < 10 ) std::cout << " "; 07024 // std::cout << " " << static_cast<int>( cubeClass ); 07025 //} 07026 //#endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 07027 07028 // Restore Reloaded Threshold Values 07029 for ( int R = 0; R < 8; ++R ) { 07030 dataForPosition[idx[R] + 3] = reloadedThresholdValues[R]; 07031 } 07032 07033 } // END: // TWO ITERATIONS FOR LEFT AND RIGHT CUBE CONFIGURATIONS 07034 07035 //------------------------------- 07036 // Next Cell 07037 for ( i = 0; i < 8; ++i ) { 07038 idx[i] += 4; 07039 // 07040 intpIdx[i] += 3; 07041 } 07042 //------------------------------- 07043 07044 } // END: for loop for X 07045 07046 //#ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 07048 //if ( isFirstRun ) std::cout << "\n"; 07049 //#endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 07050 07051 } // END: for loop for Y 07052 07053 //#ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 07055 //if ( isFirstRun ) std::cout << "\n"; 07056 //#endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 07057 07058 } // END: for loop for Z 07059 07060 //#ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 07062 //if ( isFirstRun ) { 07063 // std::cout << "-------------------------\n"; 07064 //} 07066 //#endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_GPU_MC_WITH_TRACKING_CUBES 07067 07068 glPopAttrib(); 07069 07070 #ifdef TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_SHADER_FOR_SHADING_SURFACE_FROM_SW 07071 m_glslProgramObjectForShaderSurfaceFromSW->EndGLSL(); 07072 #endif // TAPs_MODEL_DEFORMABLE_VISUALIZATION_RT_GEN_MESH_USE_SHADER_FOR_SHADING_SURFACE_FROM_SW 07073 //--------------------------------------------------------------- 07074 //=============================================================== 07075 //*/ 07076 07077 //--------------------------------------------------------------- 07078 //=============================================================== 07079 delete [] dataForPosition; 07080 delete [] dataForEllipsoidInfluence; 07081 } 07082 //----------------------------------------------------------------------------- 07083 // END: DrawByGL 07084 //***************************************************************************** 07085 07086 07087 //----------------------------------------------------------------------------- 07088 //============================================================================= 07089 END_NAMESPACE_TAPs__OpenGL 07090 //----------------------------------------------------------------------------- 07091 //34567890123456789012345678901234567890123456789012345678901234567890123456789 07092 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----