mirror of https://github.com/aap/librw.git
139 lines
3.2 KiB
C++
139 lines
3.2 KiB
C++
|
#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);
|
||
|
}
|
||
|
|