00001 /* 00002 File: MRFaceCluster.cc 00003 00004 Function: 00005 00006 Author: Andrew Willmott 00007 00008 Notes: 00009 */ 00010 00011 #include "gcl/MRFaceCluster.h" 00012 #include "gcl/Renderer.h" 00013 #include "gcl/Draw.h" 00014 00015 FaceCluster::FaceCluster() 00016 { 00017 } 00018 00019 Void FaceCluster::DrawPlane(Renderer &r) 00020 { 00021 Point corners[8]; 00022 Int i; 00023 00024 MakeBoxCorners(min, max, corners); 00025 r.Push(); 00026 r.SetTransform(trans(Rotation(axesQuat))); 00027 00028 r.N(vl_z).Begin(renPoly) 00029 .P((corners[0] + corners[4]) * 0.5).P((corners[1] + corners[5]) * 0.5) 00030 .P((corners[2] + corners[6]) * 0.5).P((corners[3] + corners[7]) * 0.5).End(); 00031 00032 r.Pop(); 00033 } 00034 00035 Void FaceCluster::DrawBox(Renderer &r, Bool solid) 00036 { 00037 Point corners[8]; 00038 Int i; 00039 00040 MakeBoxCorners(min, max, corners); 00041 r.Push(); 00042 r.SetTransform(trans(Rotation(axesQuat))); 00043 00044 if (solid) 00045 PaintBox(r, corners); 00046 else 00047 FrameBox(r, corners); 00048 00049 r.Pop(); 00050 } 00051 00052 Void FaceCluster::DrawSideAreas(Renderer &r) 00053 { 00054 Point corners[8]; 00055 Int i; 00056 00057 MakeBoxCorners(min, max, corners); 00058 r.Push(); 00059 r.SetTransform(trans(Rotation(axesQuat))); 00060 00061 Point centre = 0.5 * (min + max); 00062 Vector delta; 00063 00064 delta = Vector(max[0], centre[1], centre[2]); 00065 r.Push().SetTransform(Shift(delta) * Scalef(sqrt(sideArea[0] / 255.0)) * Shift(-delta)); 00066 r.N(vl_x).Begin(renPoly) 00067 .P(corners[1]).P(corners[2]).P(corners[6]).P(corners[5]).End(); 00068 r.Pop(); 00069 00070 delta = Vector(min[0], centre[1], centre[2]); 00071 r.Push().SetTransform(Shift(delta) * Scalef(sqrt(sideArea[3] / 255.0)) * Shift(-delta)); 00072 r.N(-Vector(vl_x)).Begin(renPoly) 00073 .P(corners[0]).P(corners[4]).P(corners[7]).P(corners[3]).End(); 00074 r.Pop(); 00075 00076 delta = Vector(centre[0], max[1], centre[2]); 00077 r.Push().SetTransform(Shift(delta) * Scalef(sqrt(sideArea[1] / 255.0)) * Shift(-delta)); 00078 r.N(vl_y).Begin(renPoly) 00079 .P(corners[7]).P(corners[6]).P(corners[2]).P(corners[3]).End(); 00080 r.Pop(); 00081 00082 delta = Vector(centre[0], min[1], centre[2]); 00083 r.Push().SetTransform(Shift(delta) * Scalef(sqrt(sideArea[4] / 255.0)) * Shift(-delta)); 00084 r.N(-Vector(vl_y)).Begin(renPoly) 00085 .P(corners[0]).P(corners[1]).P(corners[5]).P(corners[4]).End(); 00086 r.Pop(); 00087 00088 delta = Vector(centre[0], centre[1], max[2]); 00089 r.Push().SetTransform(Shift(delta) * Scalef(sqrt(sideArea[2] / 255.0)) * Shift(-delta)); 00090 r.N(vl_z).Begin(renPoly) 00091 .P(corners[4]).P(corners[5]).P(corners[6]).P(corners[7]).End(); 00092 r.Pop(); 00093 00094 delta = Vector(centre[0], centre[1], min[2]); 00095 r.Push().SetTransform(Shift(delta) * Scalef(sqrt(sideArea[5] / 255.0)) * Shift(-delta)); 00096 r.N(-Vector(vl_z)).Begin(renPoly) 00097 .P(corners[3]).P(corners[2]).P(corners[1]).P(corners[0]).End(); 00098 r.Pop(); 00099 00100 r.Pop(); 00101 } 00102 00103 Void FaceCluster::Draw(Renderer &r) 00104 { 00105 #ifdef ANCIENT 00106 DrawPlane(r); 00107 r.SetColour(cGreen); 00108 r.N(vl_z); 00109 DrawBox(r, true); 00110 #endif 00111 00112 DrawBox(r, true); 00113 // DrawPlane(r); 00114 }