summaryrefslogtreecommitdiff
path: root/tools/im3d
diff options
context:
space:
mode:
authorclaude-bot <[email protected]>2026-07-13 12:40:03 +0000
committerclaude-bot <[email protected]>2026-07-13 12:40:03 +0000
commit847962910f0bff071f3bf07c9abb87764fb6cac3 (patch)
treeddcd429e134c7fd5f72ddc97ced175de8d66fcd0 /tools/im3d
downloadlibrw-847962910f0bff071f3bf07c9abb87764fb6cac3.tar.gz
librw-847962910f0bff071f3bf07c9abb87764fb6cac3.zip
Import aap/librw @ masterHEADmaster
Snapshot for re3/reVC vendoring, per @lzcnt. Source: https://github.com/aap/librw (master).
Diffstat (limited to 'tools/im3d')
-rw-r--r--tools/im3d/CMakeLists.txt23
-rw-r--r--tools/im3d/files/whiteash.pngbin0 -> 4313 bytes
-rw-r--r--tools/im3d/im3d.cpp138
-rw-r--r--tools/im3d/im3d.h62
-rw-r--r--tools/im3d/linelist.cpp176
-rw-r--r--tools/im3d/main.cpp268
-rw-r--r--tools/im3d/polyline.cpp157
-rw-r--r--tools/im3d/trifan.cpp152
-rw-r--r--tools/im3d/trilist.cpp202
-rw-r--r--tools/im3d/tristrip.cpp169
10 files changed, 1347 insertions, 0 deletions
diff --git a/tools/im3d/CMakeLists.txt b/tools/im3d/CMakeLists.txt
new file mode 100644
index 0000000..1a49114
--- /dev/null
+++ b/tools/im3d/CMakeLists.txt
@@ -0,0 +1,23 @@
+add_executable(im3d WIN32
+ im3d.cpp
+ linelist.cpp
+ main.cpp
+ polyline.cpp
+ trifan.cpp
+ trilist.cpp
+ tristrip.cpp
+)
+
+target_link_libraries(im3d
+ PRIVATE
+ librw::skeleton
+ librw::librw
+)
+
+add_custom_command(
+ TARGET im3d POST_BUILD
+ COMMAND "${CMAKE_COMMAND}" -E make_directory "$<TARGET_FILE_DIR:im3d>/files"
+ COMMAND "${CMAKE_COMMAND}" -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/files" "$<TARGET_FILE_DIR:im3d>/files"
+)
+
+librw_platform_target(im3d)
diff --git a/tools/im3d/files/whiteash.png b/tools/im3d/files/whiteash.png
new file mode 100644
index 0000000..aa60569
--- /dev/null
+++ b/tools/im3d/files/whiteash.png
Binary files differ
diff --git a/tools/im3d/im3d.cpp b/tools/im3d/im3d.cpp
new file mode 100644
index 0000000..4588bc1
--- /dev/null
+++ b/tools/im3d/im3d.cpp
@@ -0,0 +1,138 @@
+#include <rw.h>
+#include <skeleton.h>
+
+#include "im3d.h"
+
+bool Im3DColored = true;
+bool Im3DTextured;
+
+rw::int32 Im3DPrimType;
+
+rw::RGBA SolidWhite = {255, 255, 255, 255};
+rw::RGBA SolidBlack = {0, 0, 0, 255};
+rw::RGBA SolidRed = {200, 64, 64, 255};
+rw::RGBA SolidGreen = {64, 200, 64, 255};
+rw::RGBA SolidBlue = {64, 64, 200, 255};
+rw::RGBA SolidYellow = {200, 200, 64, 255};
+rw::RGBA SolidPurple = {200, 64, 200, 255};
+rw::RGBA SolidCyan = {64, 200, 200, 255};
+
+rw::Matrix *Im3DMatrix;
+rw::Texture *Im3DTexture;
+
+void
+Im3DInitialize(void)
+{
+ Im3DMatrix = rw::Matrix::create();
+ assert(Im3DMatrix);
+
+ rw::Matrix *cameraMatrix = &Camera->getFrame()->matrix;
+ rw::V3d pos = rw::scale(cameraMatrix->at, 6.0f);
+ Im3DMatrix->rotate(&cameraMatrix->up, 30.0f);
+ Im3DMatrix->translate(&pos);
+
+ rw::Image::setSearchPath("files/");
+ Im3DTexture = rw::Texture::read("whiteash", nil);
+
+ LineListCreate();
+ LineListSetColor(!Im3DColored);
+
+ IndexedLineListCreate();
+ IndexedLineListSetColor(!Im3DColored);
+
+ PolyLineCreate();
+ PolyLineSetColor(!Im3DColored);
+
+ IndexedPolyLineCreate();
+ IndexedPolyLineSetColor(!Im3DColored);
+
+ TriListCreate();
+ TriListSetColor(!Im3DColored);
+
+ IndexedTriListCreate();
+ IndexedTriListSetColor(!Im3DColored);
+
+ TriStripCreate();
+ TriStripSetColor(!Im3DColored);
+
+ IndexedTriStripCreate();
+ IndexedTriStripSetColor(!Im3DColored);
+
+ TriFanCreate();
+ TriFanSetColor(!Im3DColored);
+
+ IndexedTriFanCreate();
+ IndexedTriFanSetColor(!Im3DColored);
+}
+
+void
+Im3DTerminate(void)
+{
+ if(Im3DMatrix){
+ Im3DMatrix->destroy();
+ Im3DMatrix = nil;
+ }
+
+ if(Im3DTexture){
+ Im3DTexture->destroy();
+ Im3DTexture = nil;
+ }
+}
+
+void
+Im3DRender(void)
+{
+ rw::SetRenderState(rw::ZTESTENABLE, 1);
+ rw::SetRenderState(rw::ZWRITEENABLE, 1);
+ rw::SetRenderState(rw::SRCBLEND, rw::BLENDONE);
+ rw::SetRenderState(rw::DESTBLEND, rw::BLENDZERO);
+ rw::SetRenderState(rw::TEXTUREFILTER, rw::Texture::FilterMode::LINEAR);
+ rw::SetRenderState(rw::CULLMODE, rw::CULLBACK);
+
+ rw::uint32 flags;
+ if(Im3DTextured){
+ rw::SetRenderStatePtr(rw::TEXTURERASTER, Im3DTexture->raster);
+ flags = rw::im3d::VERTEXUV | rw::im3d::ALLOPAQUE;
+ }else{
+ rw::SetRenderStatePtr(rw::TEXTURERASTER, nil);
+ flags = rw::im3d::ALLOPAQUE;
+ }
+
+ switch(Im3DPrimType){
+ case 0: LineListRender(Im3DMatrix, flags); break;
+ case 1: IndexedLineListRender(Im3DMatrix, flags); break;
+ case 2: PolyLineRender(Im3DMatrix, flags); break;
+ case 3: IndexedPolyLineRender(Im3DMatrix, flags); break;
+ case 4: TriListRender(Im3DMatrix, flags); break;
+ case 5: IndexedTriListRender(Im3DMatrix, flags); break;
+ case 6: TriStripRender(Im3DMatrix, flags); break;
+ case 7: IndexedTriStripRender(Im3DMatrix, flags); break;
+ case 8: TriFanRender(Im3DMatrix, flags); break;
+ case 9: IndexedTriFanRender(Im3DMatrix, flags); break;
+ }
+}
+
+void
+Im3DRotate(float xAngle, float yAngle)
+{
+ rw::Matrix *cameraMatrix = &Camera->getFrame()->matrix;
+ rw::V3d pos = Im3DMatrix->pos;
+
+ pos = rw::scale(pos, -1.0f);
+ Im3DMatrix->translate(&pos);
+
+ Im3DMatrix->rotate(&cameraMatrix->up, xAngle);
+ Im3DMatrix->rotate(&cameraMatrix->right, yAngle);
+
+ pos = rw::scale(pos, -1.0f);
+ Im3DMatrix->translate(&pos);
+}
+
+void
+Im3DTranslateZ(float zDelta)
+{
+ rw::Matrix *cameraMatrix = &Camera->getFrame()->matrix;
+ rw::V3d delta = rw::scale(cameraMatrix->at, zDelta);
+ Im3DMatrix->translate(&delta);
+}
+
diff --git a/tools/im3d/im3d.h b/tools/im3d/im3d.h
new file mode 100644
index 0000000..a9651cf
--- /dev/null
+++ b/tools/im3d/im3d.h
@@ -0,0 +1,62 @@
+extern rw::Camera *Camera;
+
+extern bool Im3DColored;
+extern bool Im3DTextured;
+
+extern rw::int32 Im3DPrimType;
+
+extern rw::RGBA SolidWhite;
+extern rw::RGBA SolidBlack;
+extern rw::RGBA SolidRed;
+extern rw::RGBA SolidGreen;
+extern rw::RGBA SolidBlue;
+extern rw::RGBA SolidYellow;
+extern rw::RGBA SolidPurple;
+extern rw::RGBA SolidCyan;
+
+
+void Im3DInitialize(void);
+void Im3DTerminate(void);
+void Im3DRender(void);
+void Im3DRotate(float xAngle, float yAngle);
+void Im3DTranslateZ(float zDelta);
+
+void LineListCreate(void);
+void LineListSetColor(bool white);
+void LineListRender(rw::Matrix *transform, rw::uint32 transformFlags);
+
+void IndexedLineListCreate(void);
+void IndexedLineListSetColor(bool white);
+void IndexedLineListRender(rw::Matrix *transform, rw::uint32 transformFlags);
+
+void PolyLineCreate(void);
+void PolyLineSetColor(bool white);
+void PolyLineRender(rw::Matrix *transform, rw::uint32 transformFlags);
+
+void IndexedPolyLineCreate(void);
+void IndexedPolyLineSetColor(bool white);
+void IndexedPolyLineRender(rw::Matrix *transform, rw::uint32 transformFlags);
+
+void TriListCreate(void);
+void TriListSetColor(bool white);
+void TriListRender(rw::Matrix *transform, rw::uint32 transformFlags);
+
+void IndexedTriListCreate(void);
+void IndexedTriListSetColor(bool white);
+void IndexedTriListRender(rw::Matrix *transform, rw::uint32 transformFlags);
+
+void TriStripCreate(void);
+void TriStripSetColor(bool white);
+void TriStripRender(rw::Matrix *transform, rw::uint32 transformFlags);
+
+void IndexedTriStripCreate(void);
+void IndexedTriStripSetColor(bool white);
+void IndexedTriStripRender(rw::Matrix *transform, rw::uint32 transformFlags);
+
+void TriFanCreate(void);
+void TriFanSetColor(bool white);
+void TriFanRender(rw::Matrix *transform, rw::uint32 transformFlags);
+
+void IndexedTriFanCreate(void);
+void IndexedTriFanSetColor(bool white);
+void IndexedTriFanRender(rw::Matrix *transform, rw::uint32 transformFlags);
diff --git a/tools/im3d/linelist.cpp b/tools/im3d/linelist.cpp
new file mode 100644
index 0000000..768e87a
--- /dev/null
+++ b/tools/im3d/linelist.cpp
@@ -0,0 +1,176 @@
+#include <rw.h>
+#include <skeleton.h>
+
+#include "im3d.h"
+
+float LineListData[28][5] = {
+ { 0.000f, 0.000f, 0.000f, 0.000f, 0.000f},
+ { 0.000f, 1.000f, 0.000f, 1.000f, 1.000f},
+
+ { 0.000f, 0.000f, 0.000f, 0.000f, 0.000f},
+ { 0.000f, -1.000f, 0.000f, 1.000f, 1.000f},
+
+ { 0.000f, 0.000f, 0.000f, 0.000f, 0.000f},
+ { 0.000f, 0.000f, 1.000f, 1.000f, 1.000f},
+
+ { 0.000f, 0.000f, 0.000f, 0.000f, 0.000f},
+ { 0.000f, 0.000f, -1.000f, 1.000f, 1.000f},
+
+ { 0.000f, 0.000f, 0.000f, 0.000f, 0.000f},
+ { 1.000f, 0.000f, 0.000f, 1.000f, 1.000f},
+
+ { 0.000f, 0.000f, 0.000f, 0.000f, 0.000f},
+ {-1.000f, 0.000f, 0.000f, 1.000f, 1.000f},
+
+ { 0.000f, 0.000f, 0.000f, 0.000f, 0.000f},
+ { 0.577f, 0.577f, 0.577f, 1.000f, 1.000f},
+
+ { 0.000f, 0.000f, 0.000f, 0.000f, 0.000f},
+ { 0.577f, -0.577f, 0.577f, 1.000f, 1.000f},
+
+ { 0.000f, 0.000f, 0.000f, 0.000f, 0.000f},
+ {-0.577f, 0.577f, -0.577f, 1.000f, 1.000f},
+
+ { 0.000f, 0.000f, 0.000f, 0.000f, 0.000f},
+ {-0.577f, -0.577f, -0.577f, 1.000f, 1.000f},
+
+ { 0.000f, 0.000f, 0.000f, 0.000f, 0.000f},
+ { 0.577f, -0.577f, -0.577f, 1.000f, 1.000f},
+
+ { 0.000f, 0.000f, 0.000f, 0.000f, 0.000f},
+ { 0.577f, 0.577f, -0.577f, 1.000f, 1.000f},
+
+ { 0.000f, 0.000f, 0.000f, 0.000f, 0.000f},
+ {-0.577f, -0.577f, 0.577f, 1.000f, 1.000f},
+
+ { 0.000f, 0.000f, 0.000f, 0.000f, 0.000f},
+ {-0.577f, 0.577f, 0.577f, 1.000f, 1.000f}
+};
+
+float IndexedLineListData[18][5] = {
+ { 0.000f, 1.000f, 0.000f, 0.000f, 0.000f},
+
+ { 0.577f, 0.577f, 0.577f, 0.000f, 0.000f},
+ { 0.577f, 0.577f, -0.577f, 0.000f, 0.000f},
+ {-0.577f, 0.577f, -0.577f, 0.000f, 0.000f},
+ {-0.577f, 0.577f, 0.577f, 0.000f, 0.000f},
+
+ { 0.000f, 0.000f, 1.000f, 0.000f, 0.000f},
+ { 0.707f, 0.000f, 0.707f, 0.000f, 0.000f},
+ { 1.000f, 0.000f, 0.000f, 0.000f, 0.000f},
+ { 0.707f, 0.000f, -0.707f, 0.000f, 0.000f},
+ { 0.000f, 0.000f, -1.000f, 0.000f, 0.000f},
+ {-0.707f, 0.000f, -0.707f, 0.000f, 0.000f},
+ {-1.000f, 0.000f, 0.000f, 0.000f, 0.000f},
+ {-0.707f, 0.000f, 0.707f, 0.000f, 0.000f},
+
+ { 0.577f, -0.577f, 0.577f, 0.000f, 0.000f},
+ { 0.577f, -0.577f, -0.577f, 0.000f, 0.000f},
+ {-0.577f, -0.577f, -0.577f, 0.000f, 0.000f},
+ {-0.577f, -0.577f, 0.577f, 0.000f, 0.000f},
+
+ { 0.000f, -1.000f, 0.000f, 0.000f, 0.000f}
+};
+
+rw::uint16 IndexedLineListIndices[96] = {
+ 0,1, 0,2, 0,3, 0,4, 1,2, 2,3, 3,4, 4,1,
+
+ 1,5, 1,6, 1,7, 2,7, 2,8, 2,9, 3,9, 3,10, 3,11, 4,11, 4,12, 4,5,
+ 5,6, 6,7, 7,8, 8,9, 9,10, 10,11, 11,12, 12,5,
+ 13,5, 13,6, 13,7, 14,7, 14,8, 14,9, 15,9, 15,10, 15,11, 16,11, 16,12, 16,5,
+
+ 17,13, 17,14, 17,15, 17,16, 13,14, 14,15, 15,16, 16,13
+};
+
+rw::RWDEVICE::Im3DVertex LineList[28];
+rw::RWDEVICE::Im3DVertex IndexedLineList[18];
+
+
+void
+LineListCreate(void)
+{
+ for(int i = 0; i < 28; i++){
+ LineList[i].setX(LineListData[i][0]);
+ LineList[i].setY(LineListData[i][1]);
+ LineList[i].setZ(LineListData[i][2]);
+ LineList[i].setU(LineListData[i][3]);
+ LineList[i].setV(LineListData[i][4]);
+ }
+}
+
+void
+LineListSetColor(bool white)
+{
+ rw::RGBA SolidColor1 = SolidRed;
+ rw::RGBA SolidColor2 = SolidWhite;
+
+ if(white){
+ SolidColor1 = SolidWhite;
+ SolidColor2 = SolidWhite;
+ }
+
+ for(int i = 0; i < 28; i += 2){
+ LineList[i].setColor(SolidColor1.red, SolidColor1.green,
+ SolidColor1.blue, SolidColor1.alpha);
+ LineList[i+1].setColor(SolidColor2.red, SolidColor2.green,
+ SolidColor2.blue, SolidColor2.alpha);
+ }
+}
+
+void
+LineListRender(rw::Matrix *transform, rw::uint32 transformFlags)
+{
+ rw::im3d::Transform(LineList, 28, transform, transformFlags);
+ rw::im3d::RenderPrimitive(rw::PRIMTYPELINELIST);
+ rw::im3d::End();
+}
+
+
+void
+IndexedLineListCreate(void)
+{
+ for(int i = 0; i < 18; i++){
+ IndexedLineList[i].setX(IndexedLineListData[i][0]);
+ IndexedLineList[i].setY(IndexedLineListData[i][1]);
+ IndexedLineList[i].setZ(IndexedLineListData[i][2]);
+ IndexedLineList[i].setU(IndexedLineListData[i][3]);
+ IndexedLineList[i].setV(IndexedLineListData[i][4]);
+ }
+}
+
+void
+IndexedLineListSetColor(bool white)
+{
+ int i;
+ rw::RGBA SolidColor1 = SolidRed;
+ rw::RGBA SolidColor2 = SolidGreen;
+ rw::RGBA SolidColor3 = SolidBlue;
+
+ if(white){
+ SolidColor1 = SolidWhite;
+ SolidColor2 = SolidWhite;
+ SolidColor3 = SolidWhite;
+ }
+
+ IndexedLineList[0].setColor(SolidColor1.red, SolidColor1.green,
+ SolidColor1.blue, SolidColor1.alpha);
+ for(i = 1; i < 5; i++)
+ IndexedLineList[i].setColor(SolidColor2.red, SolidColor2.green,
+ SolidColor2.blue, SolidColor2.alpha);
+ for(; i < 13; i++)
+ IndexedLineList[i].setColor(SolidColor3.red, SolidColor3.green,
+ SolidColor3.blue, SolidColor3.alpha);
+ for(; i < 17; i++)
+ IndexedLineList[i].setColor(SolidColor2.red, SolidColor2.green,
+ SolidColor2.blue, SolidColor2.alpha);
+ IndexedLineList[i].setColor(SolidColor1.red, SolidColor1.green,
+ SolidColor1.blue, SolidColor1.alpha);
+}
+
+void
+IndexedLineListRender(rw::Matrix *transform, rw::uint32 transformFlags)
+{
+ rw::im3d::Transform(IndexedLineList, 18, transform, transformFlags);
+ rw::im3d::RenderIndexedPrimitive(rw::PRIMTYPELINELIST, IndexedLineListIndices, 96);
+ rw::im3d::End();
+}
diff --git a/tools/im3d/main.cpp b/tools/im3d/main.cpp
new file mode 100644
index 0000000..4949d2e
--- /dev/null
+++ b/tools/im3d/main.cpp
@@ -0,0 +1,268 @@
+#include <rw.h>
+#include <skeleton.h>
+#include <assert.h>
+
+#include "im3d.h"
+
+rw::EngineOpenParams engineOpenParams;
+
+rw::RGBA ForegroundColor = { 200, 200, 200, 255 };
+rw::RGBA BackgroundColor = { 64, 64, 64, 0 };
+
+rw::Camera *Camera;
+rw::Charset *Charset;
+
+float TimeDelta;
+
+rw::Camera*
+CreateCamera(void)
+{
+ Camera = sk::CameraCreate(sk::globals.width, sk::globals.height, 1);
+ assert(Camera);
+
+ Camera->setNearPlane(0.1f);
+ Camera->setFarPlane(50.0f);
+
+ return Camera;
+}
+
+void
+Initialize(void)
+{
+ sk::globals.windowtitle = "Im3D example";
+ sk::globals.width = 1280;
+ sk::globals.height = 800;
+ sk::globals.quit = 0;
+}
+
+bool
+Initialize3D(void)
+{
+ if(!sk::InitRW())
+ return false;
+
+ Charset = rw::Charset::create(&ForegroundColor, &BackgroundColor);
+
+ Camera = CreateCamera();
+
+ Im3DInitialize();
+
+ ImGui_ImplRW_Init();
+ ImGui::StyleColorsClassic();
+
+ rw::Rect r;
+ r.x = 0;
+ r.y = 0;
+ r.w = sk::globals.width;
+ r.h = sk::globals.height;
+ sk::CameraSize(::Camera, &r, 0.5f, 4.0f/3.0f);
+
+ return true;
+}
+
+void
+Terminate3D(void)
+{
+ Im3DTerminate();
+
+ if(Camera){
+ Camera->destroy();
+ Camera = nil;
+ }
+
+ if(Charset){
+ Charset->destroy();
+ Charset = nil;
+ }
+
+ sk::TerminateRW();
+}
+
+bool
+attachPlugins(void)
+{
+ rw::ps2::registerPDSPlugin(40);
+ rw::ps2::registerPluginPDSPipes();
+
+ rw::registerMeshPlugin();
+ rw::registerNativeDataPlugin();
+ rw::registerAtomicRightsPlugin();
+ rw::registerMaterialRightsPlugin();
+ rw::xbox::registerVertexFormatPlugin();
+ rw::registerSkinPlugin();
+ rw::registerUserDataPlugin();
+ rw::registerHAnimPlugin();
+ rw::registerMatFXPlugin();
+ rw::registerUVAnimPlugin();
+ rw::ps2::registerADCPlugin();
+ return true;
+}
+
+void
+DisplayOnScreenInfo(void)
+{
+}
+
+void
+Gui(void)
+{
+ static bool showWindow = true;
+ ImGui::Begin("Im2D", &showWindow);
+
+ ImGui::RadioButton("Line-list", &Im3DPrimType, 0);
+ ImGui::RadioButton("Line-list indexed", &Im3DPrimType, 1);
+ ImGui::RadioButton("Poly-line", &Im3DPrimType, 2);
+ ImGui::RadioButton("Poly-line indexed", &Im3DPrimType, 3);
+ ImGui::RadioButton("Tri-list", &Im3DPrimType, 4);
+ ImGui::RadioButton("Tri-list indexed", &Im3DPrimType, 5);
+ ImGui::RadioButton("Tri-strip", &Im3DPrimType, 6);
+ ImGui::RadioButton("Tri-strip indexed", &Im3DPrimType, 7);
+ ImGui::RadioButton("Tri-fan", &Im3DPrimType, 8);
+ ImGui::RadioButton("Tri-fan indexed", &Im3DPrimType, 9);
+
+ ImGui::NewLine();
+
+ ImGui::Checkbox("Textured", &Im3DTextured);
+ if(ImGui::Checkbox("Colored", &Im3DColored)){
+ LineListSetColor(!Im3DColored);
+ IndexedLineListSetColor(!Im3DColored);
+ PolyLineSetColor(!Im3DColored);
+ IndexedPolyLineSetColor(!Im3DColored);
+ TriListSetColor(!Im3DColored);
+ IndexedTriListSetColor(!Im3DColored);
+ TriStripSetColor(!Im3DColored);
+ IndexedTriStripSetColor(!Im3DColored);
+ TriFanSetColor(!Im3DColored);
+ IndexedTriFanSetColor(!Im3DColored);
+ }
+
+ ImGui::End();
+}
+
+void
+Render(void)
+{
+ Camera->clear(&BackgroundColor, rw::Camera::CLEARIMAGE|rw::Camera::CLEARZ);
+
+ Camera->beginUpdate();
+
+ ImGui_ImplRW_NewFrame(TimeDelta);
+
+ Im3DRender();
+ DisplayOnScreenInfo();
+
+ Gui();
+ ImGui::EndFrame();
+ ImGui::Render();
+
+ ImGui_ImplRW_RenderDrawLists(ImGui::GetDrawData());
+
+ Camera->endUpdate();
+
+ Camera->showRaster(0);
+}
+
+void
+Idle(float timeDelta)
+{
+ TimeDelta = timeDelta;
+ Render();
+}
+
+int MouseX, MouseY;
+int MouseDeltaX, MouseDeltaY;
+int MouseButtons;
+
+bool Rotate, Translate;
+
+void
+KeyUp(int key)
+{
+}
+
+void
+KeyDown(int key)
+{
+ switch(key){
+ case sk::KEY_ESC:
+ sk::globals.quit = 1;
+ break;
+ }
+}
+
+void
+MouseBtn(sk::MouseState *mouse)
+{
+ MouseButtons = mouse->buttons;
+ Rotate = !!(MouseButtons&1);
+ Translate = !!(MouseButtons&4);
+}
+
+void
+MouseMove(sk::MouseState *mouse)
+{
+ MouseDeltaX = mouse->posx - MouseX;
+ MouseDeltaY = mouse->posy - MouseY;
+ MouseX = mouse->posx;
+ MouseY = mouse->posy;
+ if(Rotate)
+ Im3DRotate(MouseDeltaX, -MouseDeltaY);
+ if(Translate)
+ Im3DTranslateZ(-MouseDeltaY*0.1f);
+}
+
+sk::EventStatus
+AppEventHandler(sk::Event e, void *param)
+{
+ using namespace sk;
+ Rect *r;
+ MouseState *ms;
+
+ ImGuiEventHandler(e, param);
+ ImGuiIO &io = ImGui::GetIO();
+
+ switch(e){
+ case INITIALIZE:
+ Initialize();
+ return EVENTPROCESSED;
+ case RWINITIALIZE:
+ return Initialize3D() ? EVENTPROCESSED : EVENTERROR;
+ case RWTERMINATE:
+ Terminate3D();
+ return EVENTPROCESSED;
+ case PLUGINATTACH:
+ return attachPlugins() ? EVENTPROCESSED : EVENTERROR;
+ case KEYDOWN:
+ KeyDown(*(int*)param);
+ return EVENTPROCESSED;
+ case KEYUP:
+ KeyUp(*(int*)param);
+ return EVENTPROCESSED;
+ case MOUSEBTN:
+ if(!io.WantCaptureMouse){
+ ms = (MouseState*)param;
+ MouseBtn(ms);
+ }else
+ MouseButtons = 0;
+ return EVENTPROCESSED;
+ case MOUSEMOVE:
+ MouseMove((MouseState*)param);
+ return EVENTPROCESSED;
+ case RESIZE:
+ r = (Rect*)param;
+ // TODO: register when we're minimized
+ if(r->w == 0) r->w = 1;
+ if(r->h == 0) r->h = 1;
+
+ sk::globals.width = r->w;
+ sk::globals.height = r->h;
+ if(::Camera){
+ sk::CameraSize(::Camera, r, 0.5f, 4.0f/3.0f);
+ }
+ break;
+ case IDLE:
+ Idle(*(float*)param);
+ return EVENTPROCESSED;
+ }
+ return sk::EVENTNOTPROCESSED;
+}
diff --git a/tools/im3d/polyline.cpp b/tools/im3d/polyline.cpp
new file mode 100644
index 0000000..1a206b0
--- /dev/null
+++ b/tools/im3d/polyline.cpp
@@ -0,0 +1,157 @@
+#include <rw.h>
+#include <skeleton.h>
+
+#include "im3d.h"
+
+float PolyLineData[21][5] = {
+ { 0.000f, 1.000f, 1.000f, 0.500f, 1.000f},
+ { 0.707f, 0.707f, 0.900f, 0.854f, 0.854f},
+ { 1.000f, 0.000f, 0.800f, 1.000f, 0.500f},
+ { 0.707f, -0.707f, 0.700f, 0.854f, 0.146f},
+ { 0.000f, -1.000f, 0.600f, 0.500f, 0.000f},
+ {-0.707f, -0.707f, 0.500f, 0.146f, 0.146f},
+ {-1.000f, -0.000f, 0.400f, 0.000f, 0.500f},
+ {-0.707f, 0.707f, 0.300f, 0.146f, 0.854f},
+
+ { 0.000f, 1.000f, 0.200f, 0.500f, 1.000f},
+ { 0.707f, 0.707f, 0.100f, 0.854f, 0.854f},
+ { 1.000f, 0.000f, 0.000f, 1.000f, 0.500f},
+ { 0.707f, -0.707f, -0.100f, 0.854f, 0.146f},
+ { 0.000f, -1.000f, -0.200f, 0.500f, 0.000f},
+ {-0.707f, -0.707f, -0.300f, 0.146f, 0.146f},
+ {-1.000f, -0.000f, -0.400f, 0.000f, 0.500f},
+ {-0.707f, 0.707f, -0.500f, 0.146f, 0.854f},
+
+ { 0.000f, 1.000f, -0.600f, 0.500f, 1.000f},
+ { 0.707f, 0.707f, -0.700f, 0.854f, 0.854f},
+ { 1.000f, 0.000f, -0.800f, 1.000f, 0.500f},
+ { 0.707f, -0.707f, -0.900f, 0.854f, 0.146f},
+ { 0.000f, -1.000f, -1.000f, 0.500f, 0.000f}
+};
+
+float IndexedPolyLineData[8][5] = {
+ { 1.000f, 1.000f, 1.000f, 1.000f, 0.000f},
+ {-1.000f, 1.000f, 1.000f, 1.000f, 1.000f},
+ {-1.000f, -1.000f, 1.000f, 0.500f, 1.000f},
+ { 1.000f, -1.000f, 1.000f, 0.500f, 0.000f},
+
+ { 1.000f, 1.000f, -1.000f, 0.500f, 0.000f},
+ {-1.000f, 1.000f, -1.000f, 0.500f, 1.000f},
+ {-1.000f, -1.000f, -1.000f, 0.000f, 1.000f},
+ { 1.000f, -1.000f, -1.000f, 0.000f, 0.000f}
+};
+
+rw::uint16 IndexedPolyLineIndices[25] = {
+ 0, 1, 2, 3, 0, 2, 6, 5, 1, 3, 7, 4, 0, 5, 4, 6, 1, 4, 3, 6, 7, 5, 2, 7, 0
+};
+
+rw::RWDEVICE::Im3DVertex PolyLine[21];
+rw::RWDEVICE::Im3DVertex IndexedPolyLine[8];
+
+
+void
+PolyLineCreate(void)
+{
+ for(int i = 0; i < 21; i++){
+ PolyLine[i].setX(PolyLineData[i][0]);
+ PolyLine[i].setY(PolyLineData[i][1]);
+ PolyLine[i].setZ(PolyLineData[i][2]);
+ PolyLine[i].setU(PolyLineData[i][3]);
+ PolyLine[i].setV(PolyLineData[i][4]);
+ }
+}
+
+void
+PolyLineSetColor(bool white)
+{
+ int i;
+ rw::RGBA SolidColor1 = SolidRed;
+ rw::RGBA SolidColor2 = SolidGreen;
+ rw::RGBA SolidColor3 = SolidBlue;
+
+ if(white){
+ SolidColor1 = SolidWhite;
+ SolidColor2 = SolidWhite;
+ SolidColor3 = SolidWhite;
+ }
+
+ for(i = 0; i < 7; i++)
+ PolyLine[i].setColor(SolidColor1.red, SolidColor1.green,
+ SolidColor1.blue, SolidColor1.alpha);
+ for(; i < 14; i++)
+ PolyLine[i].setColor(SolidColor2.red, SolidColor2.green,
+ SolidColor2.blue, SolidColor2.alpha);
+ for(; i < 21; i++)
+ PolyLine[i].setColor(SolidColor3.red, SolidColor3.green,
+ SolidColor3.blue, SolidColor3.alpha);
+}
+
+void
+PolyLineRender(rw::Matrix *transform, rw::uint32 transformFlags)
+{
+ rw::im3d::Transform(PolyLine, 21, transform, transformFlags);
+ rw::im3d::RenderPrimitive(rw::PRIMTYPEPOLYLINE);
+ rw::im3d::End();
+}
+
+
+void
+IndexedPolyLineCreate(void)
+{
+ for(int i = 0; i < 8; i++){
+ IndexedPolyLine[i].setX(IndexedPolyLineData[i][0]);
+ IndexedPolyLine[i].setY(IndexedPolyLineData[i][1]);
+ IndexedPolyLine[i].setZ(IndexedPolyLineData[i][2]);
+ IndexedPolyLine[i].setU(IndexedPolyLineData[i][3]);
+ IndexedPolyLine[i].setV(IndexedPolyLineData[i][4]);
+ }
+}
+
+void
+IndexedPolyLineSetColor(bool white)
+{
+ rw::RGBA SolidColor1 = SolidRed;
+ rw::RGBA SolidColor2 = SolidYellow;
+ rw::RGBA SolidColor3 = SolidBlack;
+ rw::RGBA SolidColor4 = SolidPurple;
+ rw::RGBA SolidColor5 = SolidGreen;
+ rw::RGBA SolidColor6 = SolidCyan;
+ rw::RGBA SolidColor7 = SolidBlue;
+ rw::RGBA SolidColor8 = SolidWhite;
+
+ if(white){
+ SolidColor1 = SolidWhite;
+ SolidColor2 = SolidWhite;
+ SolidColor3 = SolidWhite;
+ SolidColor4 = SolidWhite;
+ SolidColor5 = SolidWhite;
+ SolidColor6 = SolidWhite;
+ SolidColor7 = SolidWhite;
+ SolidColor8 = SolidWhite;
+ }
+
+ IndexedPolyLine[0].setColor(SolidColor1.red, SolidColor1.green,
+ SolidColor1.blue, SolidColor1.alpha);
+ IndexedPolyLine[1].setColor(SolidColor2.red, SolidColor2.green,
+ SolidColor2.blue, SolidColor2.alpha);
+ IndexedPolyLine[2].setColor(SolidColor3.red, SolidColor3.green,
+ SolidColor3.blue, SolidColor3.alpha);
+ IndexedPolyLine[3].setColor(SolidColor4.red, SolidColor4.green,
+ SolidColor4.blue, SolidColor4.alpha);
+ IndexedPolyLine[4].setColor(SolidColor5.red, SolidColor5.green,
+ SolidColor5.blue, SolidColor5.alpha);
+ IndexedPolyLine[5].setColor(SolidColor6.red, SolidColor6.green,
+ SolidColor6.blue, SolidColor6.alpha);
+ IndexedPolyLine[6].setColor(SolidColor7.red, SolidColor7.green,
+ SolidColor7.blue, SolidColor7.alpha);
+ IndexedPolyLine[7].setColor(SolidColor8.red, SolidColor8.green,
+ SolidColor8.blue, SolidColor8.alpha);
+}
+
+void
+IndexedPolyLineRender(rw::Matrix *transform, rw::uint32 transformFlags)
+{
+ rw::im3d::Transform(IndexedPolyLine, 8, transform, transformFlags);
+ rw::im3d::RenderIndexedPrimitive(rw::PRIMTYPEPOLYLINE, IndexedPolyLineIndices, 25);
+ rw::im3d::End();
+}
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();
+}
diff --git a/tools/im3d/trilist.cpp b/tools/im3d/trilist.cpp
new file mode 100644
index 0000000..6fa4014
--- /dev/null
+++ b/tools/im3d/trilist.cpp
@@ -0,0 +1,202 @@
+#include <rw.h>
+#include <skeleton.h>
+
+#include "im3d.h"
+
+float TriListData[36][5] = {
+ /* front */
+ { 1.000f, 1.000f, 1.000f, 1.000f, 1.000f},
+ {-1.000f, -1.000f, 1.000f, 0.000f, 0.000f},
+ { 1.000f, -1.000f, 1.000f, 1.000f, 0.000f},
+ { 1.000f, 1.000f, 1.000f, 1.000f, 1.000f},
+ {-1.000f, 1.000f, 1.000f, 0.000f, 1.000f},
+ {-1.000f, -1.000f, 1.000f, 0.000f, 0.000f},
+ /* back */
+ {-1.000f, -1.000f, -1.000f, 1.000f, 1.000f},
+ {-1.000f, 1.000f, -1.000f, 1.000f, 0.000f},
+ { 1.000f, 1.000f, -1.000f, 0.000f, 0.000f},
+ {-1.000f, -1.000f, -1.000f, 1.000f, 1.000f},
+ { 1.000f, 1.000f, -1.000f, 0.000f, 0.000f},
+ { 1.000f, -1.000f, -1.000f, 0.000f, 1.000f},
+ /* top */
+ { 1.000f, 1.000f, 1.000f, 1.000f, 1.000f},
+ { 1.000f, 1.000f, -1.000f, 1.000f, 0.000f},
+ {-1.000f, 1.000f, -1.000f, 0.000f, 0.000f},
+ { 1.000f, 1.000f, 1.000f, 1.000f, 1.000f},
+ {-1.000f, 1.000f, -1.000f, 0.000f, 0.000f},
+ {-1.000f, 1.000f, 1.000f, 0.000f, 1.000f},
+ /* bottom */
+ {-1.000f, -1.000f, -1.000f, 1.000f, 1.000f},
+ { 1.000f, -1.000f, 1.000f, 0.000f, 0.000f},
+ {-1.000f, -1.000f, 1.000f, 1.000f, 0.000f},
+ {-1.000f, -1.000f, -1.000f, 1.000f, 1.000f},
+ { 1.000f, -1.000f, -1.000f, 0.000f, 1.000f},
+ { 1.000f, -1.000f, 1.000f, 0.000f, 0.000f},
+ /* left */
+ {-1.000f, -1.000f, -1.000f, 1.000f, 1.000f},
+ {-1.000f, 1.000f, 1.000f, 0.000f, 0.000f},
+ {-1.000f, 1.000f, -1.000f, 1.000f, 0.000f},
+ {-1.000f, -1.000f, -1.000f, 1.000f, 1.000f},
+ {-1.000f, -1.000f, 1.000f, 0.000f, 1.000f},
+ {-1.000f, 1.000f, 1.000f, 0.000f, 0.000f},
+ /* right */
+ { 1.000f, 1.000f, 1.000f, 1.000f, 1.000f},
+ { 1.000f, -1.000f, 1.000f, 1.000f, 0.000f},
+ { 1.000f, -1.000f, -1.000f, 0.000f, 0.000f},
+ { 1.000f, 1.000f, 1.000f, 1.000f, 1.000f},
+ { 1.000f, -1.000f, -1.000f, 0.000f, 0.000f},
+ { 1.000f, 1.000f, -1.000f, 0.000f, 1.000f}
+};
+
+float IndexedTriListData[8][5] = {
+ { 1.000f, 1.000f, 1.000f, 1.000f, 0.000f},
+ {-1.000f, 1.000f, 1.000f, 1.000f, 1.000f},
+ {-1.000f, -1.000f, 1.000f, 0.500f, 1.000f},
+ { 1.000f, -1.000f, 1.000f, 0.500f, 0.000f},
+
+ { 1.000f, 1.000f, -1.000f, 0.500f, 0.000f},
+ {-1.000f, 1.000f, -1.000f, 0.500f, 1.000f},
+ {-1.000f, -1.000f, -1.000f, 0.000f, 1.000f},
+ { 1.000f, -1.000f, -1.000f, 0.000f, 0.000f}
+};
+
+rw::uint16 IndexedTriListIndices[36] = {
+ /* front */
+ 0, 1, 3, 1, 2, 3,
+ /* back */
+ 7, 5, 4, 5, 7, 6,
+ /* left */
+ 6, 2, 1, 1, 5, 6,
+ /* right */
+ 0, 3, 4, 4, 3, 7,
+ /* top */
+ 1, 0, 4, 1, 4, 5,
+ /* bottom */
+ 2, 6, 3, 6, 7, 3
+};
+
+rw::RWDEVICE::Im3DVertex TriList[36];
+rw::RWDEVICE::Im3DVertex IndexedTriList[8];
+
+
+void
+TriListCreate(void)
+{
+ for(int i = 0; i < 36; i++){
+ TriList[i].setX(TriListData[i][0]);
+ TriList[i].setY(TriListData[i][1]);
+ TriList[i].setZ(TriListData[i][2]);
+ TriList[i].setU(TriListData[i][3]);
+ TriList[i].setV(TriListData[i][4]);
+ }
+}
+
+void
+TriListSetColor(bool white)
+{
+ int i;
+ rw::RGBA SolidColor1 = SolidRed;
+ rw::RGBA SolidColor2 = SolidBlue;
+ rw::RGBA SolidColor3 = SolidGreen;
+ rw::RGBA SolidColor4 = SolidYellow;
+ rw::RGBA SolidColor5 = SolidCyan;
+ rw::RGBA SolidColor6 = SolidPurple;
+
+ if(white){
+ SolidColor1 = SolidWhite;
+ SolidColor2 = SolidWhite;
+ SolidColor3 = SolidWhite;
+ SolidColor4 = SolidWhite;
+ SolidColor5 = SolidWhite;
+ SolidColor6 = SolidWhite;
+ }
+
+ for(i = 0; i < 6; i++)
+ TriList[i].setColor(SolidColor1.red, SolidColor1.green,
+ SolidColor1.blue, SolidColor1.alpha);
+ for(; i < 12; i++)
+ TriList[i].setColor(SolidColor2.red, SolidColor2.green,
+ SolidColor2.blue, SolidColor2.alpha);
+ for(; i < 18; i++)
+ TriList[i].setColor(SolidColor3.red, SolidColor3.green,
+ SolidColor3.blue, SolidColor3.alpha);
+ for(; i < 24; i++)
+ TriList[i].setColor(SolidColor4.red, SolidColor4.green,
+ SolidColor4.blue, SolidColor4.alpha);
+ for(; i < 30; i++)
+ TriList[i].setColor(SolidColor5.red, SolidColor5.green,
+ SolidColor5.blue, SolidColor5.alpha);
+ for(; i < 36; i++)
+ TriList[i].setColor(SolidColor6.red, SolidColor6.green,
+ SolidColor6.blue, SolidColor6.alpha);
+}
+
+void
+TriListRender(rw::Matrix *transform, rw::uint32 transformFlags)
+{
+ rw::im3d::Transform(TriList, 36, transform, transformFlags);
+ rw::im3d::RenderPrimitive(rw::PRIMTYPETRILIST);
+ rw::im3d::End();
+}
+
+
+void
+IndexedTriListCreate(void)
+{
+ for(int i = 0; i < 8; i++){
+ IndexedTriList[i].setX(IndexedTriListData[i][0]);
+ IndexedTriList[i].setY(IndexedTriListData[i][1]);
+ IndexedTriList[i].setZ(IndexedTriListData[i][2]);
+ IndexedTriList[i].setU(IndexedTriListData[i][3]);
+ IndexedTriList[i].setV(IndexedTriListData[i][4]);
+ }
+}
+
+void
+IndexedTriListSetColor(bool white)
+{
+ rw::RGBA SolidColor1 = SolidRed;
+ rw::RGBA SolidColor2 = SolidYellow;
+ rw::RGBA SolidColor3 = SolidBlack;
+ rw::RGBA SolidColor4 = SolidPurple;
+ rw::RGBA SolidColor5 = SolidGreen;
+ rw::RGBA SolidColor6 = SolidCyan;
+ rw::RGBA SolidColor7 = SolidBlue;
+ rw::RGBA SolidColor8 = SolidWhite;
+
+ if(white){
+ SolidColor1 = SolidWhite;
+ SolidColor2 = SolidWhite;
+ SolidColor3 = SolidWhite;
+ SolidColor4 = SolidWhite;
+ SolidColor5 = SolidWhite;
+ SolidColor6 = SolidWhite;
+ SolidColor7 = SolidWhite;
+ SolidColor8 = SolidWhite;
+ }
+
+ IndexedTriList[0].setColor(SolidColor1.red, SolidColor1.green,
+ SolidColor1.blue, SolidColor1.alpha);
+ IndexedTriList[1].setColor(SolidColor2.red, SolidColor2.green,
+ SolidColor2.blue, SolidColor2.alpha);
+ IndexedTriList[2].setColor(SolidColor3.red, SolidColor3.green,
+ SolidColor3.blue, SolidColor3.alpha);
+ IndexedTriList[3].setColor(SolidColor4.red, SolidColor4.green,
+ SolidColor4.blue, SolidColor4.alpha);
+ IndexedTriList[4].setColor(SolidColor5.red, SolidColor5.green,
+ SolidColor5.blue, SolidColor5.alpha);
+ IndexedTriList[5].setColor(SolidColor6.red, SolidColor6.green,
+ SolidColor6.blue, SolidColor6.alpha);
+ IndexedTriList[6].setColor(SolidColor7.red, SolidColor7.green,
+ SolidColor7.blue, SolidColor7.alpha);
+ IndexedTriList[7].setColor(SolidColor8.red, SolidColor8.green,
+ SolidColor8.blue, SolidColor8.alpha);
+}
+
+void
+IndexedTriListRender(rw::Matrix *transform, rw::uint32 transformFlags)
+{
+ rw::im3d::Transform(IndexedTriList, 8, transform, transformFlags);
+ rw::im3d::RenderIndexedPrimitive(rw::PRIMTYPETRILIST, IndexedTriListIndices, 36);
+ rw::im3d::End();
+}
diff --git a/tools/im3d/tristrip.cpp b/tools/im3d/tristrip.cpp
new file mode 100644
index 0000000..93c1496
--- /dev/null
+++ b/tools/im3d/tristrip.cpp
@@ -0,0 +1,169 @@
+#include <rw.h>
+#include <skeleton.h>
+
+#include "im3d.h"
+
+float TriStripData[36][5] = {
+ { 0.000f, 1.000f, -1.000f, 0.000f, 0.000f},
+ { 0.000f, 1.000f, 1.000f, 0.000f, 1.000f},
+
+ { 0.707f, 0.707f, -1.000f, 0.125f, 0.000f},
+ { 0.707f, 0.707f, 1.000f, 0.125f, 1.000f},
+
+ { 1.000f, 0.000f, -1.000f, 0.250f, 0.000f},
+ { 1.000f, 0.000f, 1.000f, 0.250f, 1.000f},
+
+ { 0.707f, -0.707f, -1.000f, 0.375f, 0.000f},
+ { 0.707f, -0.707f, 1.000f, 0.375f, 1.000f},
+
+ { 0.000f, -1.000f, -1.000f, 0.500f, 0.000f},
+ { 0.000f, -1.000f, 1.000f, 0.500f, 1.000f},
+
+ {-0.707f, -0.707f, -1.000f, 0.625f, 0.000f},
+ {-0.707f, -0.707f, 1.000f, 0.625f, 1.000f},
+
+ {-1.000f, -0.000f, -1.000f, 0.750f, 0.000f},
+ {-1.000f, -0.000f, 1.000f, 0.750f, 1.000f},
+
+ {-0.707f, 0.707f, -1.000f, 0.875f, 0.000f},
+ {-0.707f, 0.707f, 1.000f, 0.875f, 1.000f},
+
+ { 0.000f, 1.000f, -1.000f, 1.000f, 0.000f},
+ { 0.000f, 1.000f, 1.000f, 1.000f, 1.000f},
+
+ { 0.000f, 1.000f, 1.000f, 0.000f, 0.000f},
+ { 0.000f, 1.000f, -1.000f, 0.000f, 1.000f},
+
+ { 0.707f, 0.707f, 1.000f, 0.125f, 0.000f},
+ { 0.707f, 0.707f, -1.000f, 0.125f, 1.000f},
+
+ { 1.000f, 0.000f, 1.000f, 0.250f, 0.000f},
+ { 1.000f, 0.000f, -1.000f, 0.250f, 1.000f},
+
+ { 0.707f, -0.707f, 1.000f, 0.375f, 0.000f},
+ { 0.707f, -0.707f, -1.000f, 0.375f, 1.000f},
+
+ { 0.000f, -1.000f, 1.000f, 0.500f, 0.000f},
+ { 0.000f, -1.000f, -1.000f, 0.500f, 1.000f},
+
+ {-0.707f, -0.707f, 1.000f, 0.625f, 0.000f},
+ {-0.707f, -0.707f, -1.000f, 0.625f, 1.000f},
+
+ {-1.000f, -0.000f, 1.000f, 0.750f, 0.000f},
+ {-1.000f, -0.000f, -1.000f, 0.750f, 1.000f},
+
+ {-0.707f, 0.707f, 1.000f, 0.875f, 0.000f},
+ {-0.707f, 0.707f, -1.000f, 0.875f, 1.000f},
+
+ { 0.000f, 1.000f, 1.000f, 1.000f, 0.000f},
+ { 0.000f, 1.000f, -1.000f, 1.000f, 1.000f}
+};
+
+float IndexedTriStripData[16][5] = {
+ { 0.000f, 1.000f, 1.000f, 0.000f, 0.000f},
+ { 0.707f, 0.707f, 1.000f, 0.250f, 0.000f},
+ { 1.000f, 0.000f, 1.000f, 0.500f, 0.000f},
+ { 0.707f, -0.707f, 1.000f, 0.750f, 0.000f},
+ { 0.000f, -1.000f, 1.000f, 1.000f, 0.000f},
+ {-0.707f, -0.707f, 1.000f, 0.750f, 0.000f},
+ {-1.000f, -0.000f, 1.000f, 0.500f, 0.000f},
+ {-0.707f, 0.707f, 1.000f, 0.250f, 0.000f},
+
+ { 0.000f, 1.000f, -1.000f, 0.000f, 1.000f},
+ { 0.707f, 0.707f, -1.000f, 0.250f, 1.000f},
+ { 1.000f, 0.000f, -1.000f, 0.500f, 1.000f},
+ { 0.707f, -0.707f, -1.000f, 0.750f, 1.000f},
+ { 0.000f, -1.000f, -1.000f, 1.000f, 1.000f},
+ {-0.707f, -0.707f, -1.000f, 0.750f, 1.000f},
+ {-1.000f, -0.000f, -1.000f, 0.500f, 1.000f},
+ {-0.707f, 0.707f, -1.000f, 0.250f, 1.000f},
+};
+
+rw::uint16 IndexedTriStripIndices[36] = {
+ 0, 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15, 0, 8,
+ 8, 0, 9, 1, 10, 2, 11, 3, 12, 4, 13, 5, 14, 6, 15, 7, 8, 0
+};
+
+rw::RWDEVICE::Im3DVertex TriStrip[36];
+rw::RWDEVICE::Im3DVertex IndexedTriStrip[16];
+
+
+void
+TriStripCreate(void)
+{
+ for(int i = 0; i < 36; i++){
+ TriStrip[i].setX(TriStripData[i][0]);
+ TriStrip[i].setY(TriStripData[i][1]);
+ TriStrip[i].setZ(TriStripData[i][2]);
+ TriStrip[i].setU(TriStripData[i][3]);
+ TriStrip[i].setV(TriStripData[i][4]);
+ }
+}
+
+void
+TriStripSetColor(bool white)
+{
+ rw::RGBA SolidColor1 = SolidRed;
+ rw::RGBA SolidColor2 = SolidYellow;
+
+ if(white){
+ SolidColor1 = SolidWhite;
+ SolidColor2 = SolidWhite;
+ }
+
+ for(int i = 0; i < 36; i += 2){
+ TriStrip[i].setColor(SolidColor1.red, SolidColor1.green,
+ SolidColor1.blue, SolidColor1.alpha);
+ TriStrip[i+1].setColor(SolidColor2.red, SolidColor2.green,
+ SolidColor2.blue, SolidColor2.alpha);
+ }
+}
+
+void
+TriStripRender(rw::Matrix *transform, rw::uint32 transformFlags)
+{
+ rw::im3d::Transform(TriStrip, 36, transform, transformFlags);
+ rw::im3d::RenderPrimitive(rw::PRIMTYPETRISTRIP);
+ rw::im3d::End();
+}
+
+
+void
+IndexedTriStripCreate(void)
+{
+ for(int i = 0; i < 16; i++){
+ IndexedTriStrip[i].setX(IndexedTriStripData[i][0]);
+ IndexedTriStrip[i].setY(IndexedTriStripData[i][1]);
+ IndexedTriStrip[i].setZ(IndexedTriStripData[i][2]);
+ IndexedTriStrip[i].setU(IndexedTriStripData[i][3]);
+ IndexedTriStrip[i].setV(IndexedTriStripData[i][4]);
+ }
+}
+
+void
+IndexedTriStripSetColor(bool white)
+{
+ int i;
+ rw::RGBA SolidColor1 = SolidBlue;
+ rw::RGBA SolidColor2 = SolidGreen;
+
+ if(white){
+ SolidColor1 = SolidWhite;
+ SolidColor2 = SolidWhite;
+ }
+
+ for(i = 0; i < 8; i++)
+ IndexedTriStrip[i].setColor(SolidColor1.red, SolidColor1.green,
+ SolidColor1.blue, SolidColor1.alpha);
+ for(; i < 16; i++)
+ IndexedTriStrip[i].setColor(SolidColor2.red, SolidColor2.green,
+ SolidColor2.blue, SolidColor2.alpha);
+}
+
+void
+IndexedTriStripRender(rw::Matrix *transform, rw::uint32 transformFlags)
+{
+ rw::im3d::Transform(IndexedTriStrip, 16, transform, transformFlags);
+ rw::im3d::RenderIndexedPrimitive(rw::PRIMTYPETRISTRIP, IndexedTriStripIndices, 36);
+ rw::im3d::End();
+}