00001 #include "OpenGL\GL_Range_Sensor.h"
00002
00003 #ifndef NOGL
00004 #include "glos.h"
00005 #include <gl\gl.h>
00006 #endif
00007
00008 GL_Range_Sensor::GL_Range_Sensor (const GL_Range_Sensor& right)
00009
00010 : Range_Sensor( right )
00011 {
00012 }
00013
00014 GL_Range_Sensor::GL_Range_Sensor (FrameManager* frameManager)
00015 :Range_Sensor( frameManager )
00016 {
00017 }
00018
00019
00020 GL_Range_Sensor::~GL_Range_Sensor()
00021 {
00022 }
00023
00024
00025 Entity* GL_Range_Sensor::Clone () const
00026 {
00027 return new GL_Range_Sensor( *this ) ;
00028 }
00029
00030
00031 bool GL_Range_Sensor::DrawExplicit () const
00032 {
00033
00034 int i,j;
00035
00036
00037
00038 double newdir[3], temp[3];
00039
00040
00041 double tempvalues[3][3];
00042 double rayedgevalues[4][3];
00043 double pyramidvert[4][3];
00044
00045 double angleratio;
00046
00047
00048
00049
00050
00051 newdir[0] = ray_half_limit*this->absFrame.values[0][0];
00052 newdir[1] = ray_half_limit*this->absFrame.values[1][0];
00053 newdir[2] = ray_half_limit*this->absFrame.values[2][0];
00054
00055
00056 angleratio = tan((this->angle)/2);
00057 for (i=0; i< 3; i++)
00058 {
00059 for (j=0; j < 3; j++)
00060 {
00061 tempvalues[i][j] = angleratio * this->absFrame.values[i][j];
00062 }
00063 }
00064
00065
00066 temp[0] = newdir[0] + (lower_ray_lim_y - ray_half_limit)*tempvalues[0][1];
00067 temp[1] = newdir[1] + (lower_ray_lim_y - ray_half_limit)*tempvalues[1][1];
00068 temp[2] = newdir[2] + (lower_ray_lim_y - ray_half_limit)*tempvalues[2][1];
00069
00070 rayedgevalues[0][0] = temp[0] + (lower_ray_lim_z - ray_half_limit)*tempvalues[0][2];
00071 rayedgevalues[0][1] = temp[1] + (lower_ray_lim_z - ray_half_limit)*tempvalues[1][2];
00072 rayedgevalues[0][2] = temp[2] + (lower_ray_lim_z - ray_half_limit)*tempvalues[2][2];
00073 normalize ( rayedgevalues[0][0], rayedgevalues[0][1], rayedgevalues[0][2] );
00074
00075
00076 temp[0] = newdir[0] + (lower_ray_lim_y - ray_half_limit)*tempvalues[0][1];
00077 temp[1] = newdir[1] + (lower_ray_lim_y - ray_half_limit)*tempvalues[1][1];
00078 temp[2] = newdir[2] + (lower_ray_lim_y - ray_half_limit)*tempvalues[2][1];
00079
00080 rayedgevalues[1][0] = temp[0] + (upper_ray_lim_z - ray_half_limit)*tempvalues[0][2];
00081 rayedgevalues[1][1] = temp[1] + (upper_ray_lim_z - ray_half_limit)*tempvalues[1][2];
00082 rayedgevalues[1][2] = temp[2] + (upper_ray_lim_z - ray_half_limit)*tempvalues[2][2];
00083 normalize ( rayedgevalues[1][0], rayedgevalues[1][1], rayedgevalues[1][2] );
00084
00085
00086 temp[0] = newdir[0] + (upper_ray_lim_y - ray_half_limit)*tempvalues[0][1];
00087 temp[1] = newdir[1] + (upper_ray_lim_y - ray_half_limit)*tempvalues[1][1];
00088 temp[2] = newdir[2] + (upper_ray_lim_y - ray_half_limit)*tempvalues[2][1];
00089
00090 rayedgevalues[2][0] = temp[0] + (upper_ray_lim_z - ray_half_limit)*tempvalues[0][2];
00091 rayedgevalues[2][1] = temp[1] + (upper_ray_lim_z - ray_half_limit)*tempvalues[1][2];
00092 rayedgevalues[2][2] = temp[2] + (upper_ray_lim_z - ray_half_limit)*tempvalues[2][2];
00093 normalize ( rayedgevalues[2][0], rayedgevalues[2][1], rayedgevalues[2][2] );
00094
00095
00096 temp[0] = newdir[0] + (upper_ray_lim_y - ray_half_limit)*tempvalues[0][1];
00097 temp[1] = newdir[1] + (upper_ray_lim_y - ray_half_limit)*tempvalues[1][1];
00098 temp[2] = newdir[2] + (upper_ray_lim_y - ray_half_limit)*tempvalues[2][1];
00099
00100 rayedgevalues[3][0] = temp[0] + (lower_ray_lim_z - ray_half_limit)*tempvalues[0][2];
00101 rayedgevalues[3][1] = temp[1] + (lower_ray_lim_z - ray_half_limit)*tempvalues[1][2];
00102 rayedgevalues[3][2] = temp[2] + (lower_ray_lim_z - ray_half_limit)*tempvalues[2][2];
00103 normalize ( rayedgevalues[3][0], rayedgevalues[3][1], rayedgevalues[3][2] );
00104
00105 #ifndef NOGL
00106
00107 glPushAttrib( GL_ENABLE_BIT );
00108 glDisable( GL_LIGHTING );
00109
00110
00111 for (i=0; i < 4; i++)
00112 {
00113 pyramidvert[i][0] = absFrame.values[0][3] + rayedgevalues[i][0] * maxrange;
00114 pyramidvert[i][1] = absFrame.values[1][3] + rayedgevalues[i][1] * maxrange;
00115 pyramidvert[i][2] = absFrame.values[2][3] + rayedgevalues[i][2] * maxrange;
00116
00117 glBegin( GL_LINES ) ;
00118 glVertex3d( absFrame.values[0][3], absFrame.values[1][3], absFrame.values[2][3] ) ;
00119 glVertex3d( pyramidvert[i][0], pyramidvert[i][1], pyramidvert[i][2] ) ;
00120 glEnd() ;
00121
00122 }
00123
00124 for (i=0; i < 3; i++)
00125 {
00126 glBegin( GL_LINES ) ;
00127 glVertex3d( pyramidvert[i][0], pyramidvert[i][1], pyramidvert[i][2] ) ;
00128 glVertex3d( pyramidvert[i+1][0], pyramidvert[i+1][1], pyramidvert[i+1][2] ) ;
00129 glEnd() ;
00130 }
00131 glBegin( GL_LINES ) ;
00132 glVertex3d( pyramidvert[3][0], pyramidvert[3][1], pyramidvert[3][2] ) ;
00133 glVertex3d( pyramidvert[0][0], pyramidvert[0][1], pyramidvert[0][2] ) ;
00134 glEnd() ;
00135 glPopAttrib();
00136 #endif
00137 return true ;
00138 }