diff options
Diffstat (limited to 'tools/im3d/trifan.cpp')
| -rw-r--r-- | tools/im3d/trifan.cpp | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/tools/im3d/trifan.cpp b/tools/im3d/trifan.cpp new file mode 100644 index 0000000..3bef64b --- /dev/null +++ b/tools/im3d/trifan.cpp @@ -0,0 +1,152 @@ +#include <rw.h> +#include <skeleton.h> + +#include "im3d.h" + +float TriFanData[34][5] = { + { 0.000f, 0.000f, -1.000f, 0.500f, 0.500f}, + + { 0.000f, 1.000f, 0.000f, 0.500f, 1.000f}, + { 0.383f, 0.924f, 0.000f, 0.691f, 0.962f}, + { 0.707f, 0.707f, 0.000f, 0.854f, 0.854f}, + { 0.924f, 0.383f, 0.000f, 0.962f, 0.691f}, + { 1.000f, 0.000f, 0.000f, 1.000f, 0.500f}, + { 0.924f, -0.383f, 0.000f, 0.962f, 0.309f}, + { 0.707f, -0.707f, 0.000f, 0.854f, 0.146f}, + { 0.383f, -0.924f, 0.000f, 0.691f, 0.038f}, + { 0.000f, -1.000f, 0.000f, 0.500f, 0.000f}, + {-0.383f, -0.924f, 0.000f, 0.309f, 0.038f}, + {-0.707f, -0.707f, 0.000f, 0.146f, 0.146f}, + {-0.924f, -0.383f, 0.000f, 0.038f, 0.309f}, + {-1.000f, -0.000f, 0.000f, 0.000f, 0.500f}, + {-0.924f, 0.383f, 0.000f, 0.038f, 0.691f}, + {-0.707f, 0.707f, 0.000f, 0.146f, 0.854f}, + {-0.383f, 0.924f, 0.000f, 0.309f, 0.962f}, + + { 0.000f, 1.000f, 0.000f, 0.500f, 1.000f}, + + {-0.383f, 0.924f, 0.000f, 0.309f, 0.962f}, + {-0.707f, 0.707f, 0.000f, 0.146f, 0.854f}, + {-0.924f, 0.383f, 0.000f, 0.038f, 0.691f}, + {-1.000f, -0.000f, 0.000f, 0.000f, 0.500f}, + {-0.924f, -0.383f, 0.000f, 0.038f, 0.309f}, + {-0.707f, -0.707f, 0.000f, 0.146f, 0.146f}, + {-0.383f, -0.924f, 0.000f, 0.309f, 0.038f}, + { 0.000f, -1.000f, 0.000f, 0.500f, 0.000f}, + { 0.383f, -0.924f, 0.000f, 0.691f, 0.038f}, + { 0.707f, -0.707f, 0.000f, 0.854f, 0.146f}, + { 0.924f, -0.383f, 0.000f, 0.962f, 0.309f}, + { 1.000f, 0.000f, 0.000f, 1.000f, 0.500f}, + { 0.924f, 0.383f, 0.000f, 0.962f, 0.691f}, + { 0.707f, 0.707f, 0.000f, 0.854f, 0.854f}, + { 0.383f, 0.924f, 0.000f, 0.691f, 0.962f}, + { 0.000f, 1.000f, 0.000f, 0.500f, 1.000f} +}; + +float IndexedTriFanData[17][5] = { + /* top */ + { 0.000f, 0.000f, -1.000f, 0.500f, 0.500f}, + /* circle */ + { 0.000f, 1.000f, 0.000f, 0.500f, 1.000f}, + { 0.383f, 0.924f, 0.000f, 0.691f, 0.962f}, + { 0.707f, 0.707f, 0.000f, 0.854f, 0.854f}, + { 0.924f, 0.383f, 0.000f, 0.962f, 0.691f}, + { 1.000f, 0.000f, 0.000f, 1.000f, 0.500f}, + { 0.924f, -0.383f, 0.000f, 0.962f, 0.309f}, + { 0.707f, -0.707f, 0.000f, 0.854f, 0.146f}, + { 0.383f, -0.924f, 0.000f, 0.691f, 0.038f}, + { 0.000f, -1.000f, 0.000f, 0.500f, 0.000f}, + {-0.383f, -0.924f, 0.000f, 0.309f, 0.038f}, + {-0.707f, -0.707f, 0.000f, 0.146f, 0.146f}, + {-0.924f, -0.383f, 0.000f, 0.038f, 0.309f}, + {-1.000f, -0.000f, 0.000f, 0.000f, 0.500f}, + {-0.924f, 0.383f, 0.000f, 0.038f, 0.691f}, + {-0.707f, 0.707f, 0.000f, 0.146f, 0.854f}, + {-0.383f, 0.924f, 0.000f, 0.309f, 0.962f} +}; + +rw::uint16 IndexedTriFanIndices[34] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, + 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 +}; + +rw::RWDEVICE::Im3DVertex TriFan[34]; +rw::RWDEVICE::Im3DVertex IndexedTriFan[17]; + + +void +TriFanCreate(void) +{ + for(int i = 0; i < 34; i++){ + TriFan[i].setX(TriFanData[i][0]); + TriFan[i].setY(TriFanData[i][1]); + TriFan[i].setZ(TriFanData[i][2]); + TriFan[i].setU(TriFanData[i][3]); + TriFan[i].setV(TriFanData[i][4]); + } +} + +void +TriFanSetColor(bool white) +{ + rw::RGBA SolidColor1 = SolidYellow; + rw::RGBA SolidColor2 = SolidBlue; + + if(white){ + SolidColor1 = SolidWhite; + SolidColor2 = SolidWhite; + } + + TriFan[0].setColor(SolidColor1.red, SolidColor1.green, + SolidColor1.blue, SolidColor1.alpha); + for(int i = 1; i < 34; i++) + TriFan[i].setColor(SolidColor2.red, SolidColor2.green, + SolidColor2.blue, SolidColor2.alpha); +} + +void +TriFanRender(rw::Matrix *transform, rw::uint32 transformFlags) +{ + rw::im3d::Transform(TriFan, 34, transform, transformFlags); + rw::im3d::RenderPrimitive(rw::PRIMTYPETRIFAN); + rw::im3d::End(); +} + + +void +IndexedTriFanCreate(void) +{ + for(int i = 0; i < 17; i++){ + IndexedTriFan[i].setX(IndexedTriFanData[i][0]); + IndexedTriFan[i].setY(IndexedTriFanData[i][1]); + IndexedTriFan[i].setZ(IndexedTriFanData[i][2]); + IndexedTriFan[i].setU(IndexedTriFanData[i][3]); + IndexedTriFan[i].setV(IndexedTriFanData[i][4]); + } +} + +void +IndexedTriFanSetColor(bool white) +{ + rw::RGBA SolidColor1 = SolidGreen; + rw::RGBA SolidColor2 = SolidBlack; + + if(white){ + SolidColor1 = SolidWhite; + SolidColor2 = SolidWhite; + } + + IndexedTriFan[0].setColor(SolidColor1.red, SolidColor1.green, + SolidColor1.blue, SolidColor1.alpha); + for(int i = 1; i < 17; i++) + IndexedTriFan[i].setColor(SolidColor2.red, SolidColor2.green, + SolidColor2.blue, SolidColor2.alpha); +} + +void +IndexedTriFanRender(rw::Matrix *transform, rw::uint32 transformFlags) +{ + rw::im3d::Transform(IndexedTriFan, 17, transform, transformFlags); + rw::im3d::RenderIndexedPrimitive(rw::PRIMTYPETRIFAN, IndexedTriFanIndices, 34); + rw::im3d::End(); +} |
