updated translator + shaders

This commit is contained in:
turanszkij
2016-06-14 20:49:50 +02:00
parent 936315c724
commit 32030291de
6 changed files with 340 additions and 65 deletions
+1 -2
View File
@@ -70,10 +70,9 @@ float4 main(VertexToPixelPostProcess input ):SV_Target
float2 newTex = ep.xy + ray.xy;
//occFrag = xNormalMap.SampleLevel(Sampler, newTex,0).xyz;
occFrag = loadNormal(newTex).xyz;
occFrag = decode(loadNormal(newTex).xy);
if(!occFrag.x && !occFrag.y && !occFrag.z)
break;
occFrag = occFrag * 2 - 1;
depthDiff = ( depth - ( texture_lineardepth.SampleLevel(Sampler,newTex,0).r ) );
+13 -16
View File
@@ -1,6 +1,6 @@
#include "postProcessHF.hlsli"
#include "reconstructPositionHF.hlsli"
#include "brdf.hlsli"
// Ne lepegessunk 0-kat, akkor mar inkabb kicsit tobbet inkabb
static const float g_fMinRayStep = 0.01f;
@@ -82,21 +82,21 @@ float4 SSRRayMarch(float3 vDir, inout float3 vHitCoord)
float4 main(VertexToPixelPostProcess input) : SV_Target
{
float4 o = 1;
float4 g0 = texture_gbuffer0.Load(int3(input.pos.xy, 0));
float4 g3 = texture_gbuffer3.Load(int3(input.pos.xy, 0));
BRDF_HELPER_MAKEINPUTS(g0, g3.y, g3.z);
float4 vNormZ;
vNormZ.rgb = decode(texture_gbuffer1.Load(int3(input.pos.xy, 0)).rg);
vNormZ.a = texture_depth.Load(int3(input.pos.xy, 0));
float3 N = decode(texture_gbuffer1.Load(int3(input.pos.xy, 0)).xy);
float2 vRougnessSpec = loadVelocity(input.tex).zw; //specular_power,specular intensity
//float fSpecularModifier = (1 - clamp(vRougnessSpec.x, 0, 256) / 256.f)*vRougnessSpec.y;
float depth = texture_lineardepth.Load(int3(input.pos.xy, 0));
float3 vWorldPos = getPosition(input.tex, vNormZ.a);
float3 vWorldPos = getPosition(input.tex, depth);
//Reflection vector
float3 vViewPos = mul(float4(vWorldPos.xyz, 1), g_xCamera_View).xyz;
float3 vViewNor = mul(float4(vNormZ.xyz, 0), g_xCamera_View).xyz;
float3 vViewNor = mul(float4(N, 0), g_xCamera_View).xyz;
float3 vReflectDir = normalize(reflect(normalize(vViewPos.xyz), normalize(vViewNor.xyz)));
@@ -113,9 +113,8 @@ float4 main(VertexToPixelPostProcess input) : SV_Target
//Color
float fReflectionIntensity =
float reflectionIntensity =
saturate(
pow(vRougnessSpec.y, 2) * //specular fade
fScreenEdgeFactor * // screen fade
saturate(vReflectDir.z) // camera facing fade
//* saturate((g_fSearchDist - distance(vViewPos, vHitPos)) * g_fSearchDistInv) // reflected object distance fade
@@ -123,11 +122,9 @@ float4 main(VertexToPixelPostProcess input) : SV_Target
);
float3 vReflectionColor = xTexture.SampleLevel(sampler_linear_clamp, vCoords.xy, 0).rgb;
float3 vSceneColor = xTexture.Load(int3(input.pos.xy,0)).rgb;
float3 reflectionColor = xTexture.SampleLevel(sampler_linear_clamp, vCoords.xy, 0).rgb;
float3 sceneColor = xTexture.Load(int3(input.pos.xy,0)).rgb;
o = float4(lerp(vSceneColor, vReflectionColor, fReflectionIntensity), 1);
return o;
return float4(sceneColor.rgb + reflectionColor.rgb * f0 * reflectionIntensity, 1);
}
+1 -1
View File
@@ -386,7 +386,7 @@ void wiHairParticle::Draw(Camera* camera, GRAPHICSTHREAD threadID)
XMMATRIX camRot = XMMatrixRotationQuaternion(XMLoadFloat4(&camera->rotation));
At = XMVector3Normalize(XMVector3Transform(XMVector3Transform(At, camRot), inverseRenderMat));
Up = XMVector3Normalize(XMVector3Transform(XMVector3Transform(Up, camRot), inverseRenderMat));
Eye = XMVector3Transform(camera->GetEye(), inverseRenderMat);
Eye = XMVector4Transform(camera->GetEye(), inverseRenderMat);
View = XMMatrixLookToLH(Eye, At, Up);
+46 -7
View File
@@ -1594,10 +1594,11 @@ void wiRenderer::DrawTranslators(Camera* camera, GRAPHICSTHREAD threadID)
if(!renderableTranslators.empty()){
GetDevice()->EventBegin(L"Translators", threadID);
GetDevice()->BindPrimitiveTopology(LINELIST,threadID);
GetDevice()->BindPrimitiveTopology(LINELIST, threadID);
GetDevice()->BindRasterizerState(rasterizers[RSTYPE_WIRE_DOUBLESIDED], threadID);
GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_LINE],threadID);
GetDevice()->BindRasterizerState(rasterizers[RSTYPE_WIRE_DOUBLESIDED],threadID);
GetDevice()->BindDepthStencilState(depthStencils[DSSTYPE_XRAY],STENCILREF_EMPTY,threadID);
GetDevice()->BindBlendState(blendStates[BSTYPE_OPAQUE],threadID);
@@ -1605,17 +1606,55 @@ void wiRenderer::DrawTranslators(Camera* camera, GRAPHICSTHREAD threadID)
GetDevice()->BindPS(pixelShaders[PSTYPE_LINE],threadID);
GetDevice()->BindVS(vertexShaders[VSTYPE_LINE],threadID);
GetDevice()->BindVertexBuffer(wiTranslator::vertexBuffer, 0, sizeof(XMFLOAT4) + sizeof(XMFLOAT4), threadID);
XMMATRIX VP = camera->GetViewProjection();
MiscCB sb;
for (auto& x : renderableTranslators)
{
sb.mTransform = XMMatrixTranspose(x->getMatrix()*camera->GetViewProjection());
sb.mColor = XMFLOAT4(1, 1, 1, 1);
if (!x->enabled)
continue;
float fDist = wiMath::Distance(x->translation, camera->translation) * 0.05f;
XMMATRIX mat = XMMatrixScaling(fDist, fDist, fDist)*x->getMatrix()*VP;
// x
sb.mTransform = XMMatrixTranspose(mat);
sb.mColor = x->state == wiTranslator::TRANSLATOR_X ? XMFLOAT4(1, 1, 1, 1) : XMFLOAT4(1, 0, 0, 1);
GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_MISC], &sb, threadID);
GetDevice()->Draw(wiTranslator::vertexCount, threadID);
GetDevice()->BindVertexBuffer(wiTranslator::vertexBuffer_Axis, 0, sizeof(XMFLOAT4) + sizeof(XMFLOAT4), threadID);
GetDevice()->Draw(wiTranslator::vertexCount_Axis, threadID);
sb.mColor = x->state == wiTranslator::TRANSLATOR_XY ? XMFLOAT4(1, 1, 1, 1) : XMFLOAT4(1, 1, 0, 1);
GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_MISC], &sb, threadID);
GetDevice()->BindVertexBuffer(wiTranslator::vertexBuffer_Plane, 0, sizeof(XMFLOAT4) + sizeof(XMFLOAT4), threadID);
GetDevice()->Draw(wiTranslator::vertexCount_Plane, threadID);
// y
sb.mTransform = XMMatrixTranspose(XMMatrixRotationZ(XM_PIDIV2)*XMMatrixRotationY(XM_PIDIV2)*mat);
sb.mColor = x->state == wiTranslator::TRANSLATOR_Y ? XMFLOAT4(1, 1, 1, 1) : XMFLOAT4(0, 1, 0, 1);
GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_MISC], &sb, threadID);
GetDevice()->BindVertexBuffer(wiTranslator::vertexBuffer_Axis, 0, sizeof(XMFLOAT4) + sizeof(XMFLOAT4), threadID);
GetDevice()->Draw(wiTranslator::vertexCount_Axis, threadID);
sb.mColor = x->state == wiTranslator::TRANSLATOR_YZ ? XMFLOAT4(1, 1, 1, 1) : XMFLOAT4(1, 1, 0, 1);
GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_MISC], &sb, threadID);
GetDevice()->BindVertexBuffer(wiTranslator::vertexBuffer_Plane, 0, sizeof(XMFLOAT4) + sizeof(XMFLOAT4), threadID);
GetDevice()->Draw(wiTranslator::vertexCount_Plane, threadID);
// z
sb.mTransform = XMMatrixTranspose(XMMatrixRotationY(-XM_PIDIV2)*XMMatrixRotationZ(-XM_PIDIV2)*mat);
sb.mColor = x->state == wiTranslator::TRANSLATOR_Z ? XMFLOAT4(1, 1, 1, 1) : XMFLOAT4(0, 0, 1, 1);
GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_MISC], &sb, threadID);
GetDevice()->BindVertexBuffer(wiTranslator::vertexBuffer_Axis, 0, sizeof(XMFLOAT4) + sizeof(XMFLOAT4), threadID);
GetDevice()->Draw(wiTranslator::vertexCount_Axis, threadID);
sb.mColor = x->state == wiTranslator::TRANSLATOR_XZ ? XMFLOAT4(1, 1, 1, 1) : XMFLOAT4(1, 1, 0, 1);
GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_MISC], &sb, threadID);
GetDevice()->BindVertexBuffer(wiTranslator::vertexBuffer_Plane, 0, sizeof(XMFLOAT4) + sizeof(XMFLOAT4), threadID);
GetDevice()->Draw(wiTranslator::vertexCount_Plane, threadID);
// origin
sb.mTransform = XMMatrixTranspose(mat);
sb.mColor = x->state == wiTranslator::TRANSLATOR_XYZ ? XMFLOAT4(1, 1, 1, 1) : XMFLOAT4(0.5f, 0.5f, 0.5f, 1);
GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_MISC], &sb, threadID);
GetDevice()->BindPrimitiveTopology(TRIANGLELIST, threadID);
GetDevice()->BindRasterizerState(rasterizers[RSTYPE_FRONT], threadID);
GetDevice()->BindVertexBuffer(wiTranslator::vertexBuffer_Origin, 0, sizeof(XMFLOAT4) + sizeof(XMFLOAT4), threadID);
GetDevice()->Draw(wiTranslator::vertexCount_Origin, threadID);
}
GetDevice()->EventEnd(threadID);
+259 -36
View File
@@ -5,42 +5,129 @@
using namespace wiGraphicsTypes;
GPUBuffer* wiTranslator::vertexBuffer = nullptr;
int wiTranslator::vertexCount = 0;
GPUBuffer* wiTranslator::vertexBuffer_Axis = nullptr;
GPUBuffer* wiTranslator::vertexBuffer_Plane = nullptr;
GPUBuffer* wiTranslator::vertexBuffer_Origin = nullptr;
int wiTranslator::vertexCount_Axis = 0;
int wiTranslator::vertexCount_Plane = 0;
int wiTranslator::vertexCount_Origin = 0;
wiTranslator::wiTranslator() :Transform()
{
prevPointer = XMFLOAT4(0, 0, 0, 0);
dragStart = XMFLOAT3(0, 0, 0);
dragging = false;
enabled = true;
if (vertexBuffer == nullptr)
state = TRANSLATOR_IDLE;
if (vertexBuffer_Axis == nullptr)
{
vertexBuffer = new GPUBuffer;
{
XMFLOAT4 verts[] = {
XMFLOAT4(0,0,0,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(3,0,0,1), XMFLOAT4(1,1,1,1),
};
vertexCount_Axis = ARRAYSIZE(verts) / 2;
XMFLOAT4 verts[] = {
XMFLOAT4(0,0,0,1), XMFLOAT4(1,0,0,1),
XMFLOAT4(1,0,0,1), XMFLOAT4(1,0,0,1),
GPUBufferDesc bd;
ZeroMemory(&bd, sizeof(bd));
bd.Usage = USAGE_DEFAULT;
bd.ByteWidth = sizeof(verts);
bd.BindFlags = BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = 0;
SubresourceData InitData;
ZeroMemory(&InitData, sizeof(InitData));
InitData.pSysMem = verts;
vertexBuffer_Axis = new GPUBuffer;
wiRenderer::GetDevice()->CreateBuffer(&bd, &InitData, vertexBuffer_Axis);
}
}
XMFLOAT4(0,0,0,1), XMFLOAT4(0,1,0,1),
XMFLOAT4(0,1,0,1), XMFLOAT4(0,1,0,1),
if (vertexBuffer_Plane == nullptr)
{
{
XMFLOAT4 verts[] = {
XMFLOAT4(1,0,0,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(1,1,0,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(1,1,0,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(0,1,0,1), XMFLOAT4(1,1,1,1),
};
vertexCount_Plane = ARRAYSIZE(verts) / 2;
XMFLOAT4(0,0,0,1), XMFLOAT4(0,0,1,1),
XMFLOAT4(0,0,1,1), XMFLOAT4(0,0,1,1),
};
vertexCount = ARRAYSIZE(verts);
GPUBufferDesc bd;
ZeroMemory(&bd, sizeof(bd));
bd.Usage = USAGE_DEFAULT;
bd.ByteWidth = sizeof(verts);
bd.BindFlags = BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = 0;
SubresourceData InitData;
ZeroMemory(&InitData, sizeof(InitData));
InitData.pSysMem = verts;
vertexBuffer_Plane = new GPUBuffer;
wiRenderer::GetDevice()->CreateBuffer(&bd, &InitData, vertexBuffer_Plane);
}
}
GPUBufferDesc bd;
ZeroMemory(&bd, sizeof(bd));
bd.Usage = USAGE_DEFAULT;
bd.ByteWidth = sizeof(verts);
bd.BindFlags = BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = 0;
SubresourceData InitData;
ZeroMemory(&InitData, sizeof(InitData));
InitData.pSysMem = verts;
wiRenderer::GetDevice()->CreateBuffer(&bd, &InitData, vertexBuffer);
if (vertexBuffer_Origin == nullptr)
{
{
float edge = 0.2f;
XMFLOAT4 verts[] = {
XMFLOAT4(-edge,edge,edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(-edge,-edge,edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(-edge,-edge,-edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(edge,edge,edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(edge,-edge,edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(-edge,-edge,edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(edge,edge,-edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(edge,-edge,-edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(edge,-edge,edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(-edge,edge,-edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(-edge,-edge,-edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(edge,-edge,-edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(-edge,-edge,edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(edge,-edge,edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(edge,-edge,-edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(edge,edge,edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(-edge,edge,edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(-edge,edge,-edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(-edge,edge,-edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(-edge,edge,edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(-edge,-edge,-edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(-edge,edge,edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(edge,edge,edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(-edge,-edge,edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(edge,edge,edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(edge,edge,-edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(edge,-edge,edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(edge,edge,-edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(-edge,edge,-edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(edge,-edge,-edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(-edge,-edge,-edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(-edge,-edge,edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(edge,-edge,-edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(edge,edge,-edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(edge,edge,edge,1), XMFLOAT4(1,1,1,1),
XMFLOAT4(-edge,edge,-edge,1), XMFLOAT4(1,1,1,1),
};
vertexCount_Origin = ARRAYSIZE(verts) / 2;
GPUBufferDesc bd;
ZeroMemory(&bd, sizeof(bd));
bd.Usage = USAGE_DEFAULT;
bd.ByteWidth = sizeof(verts);
bd.BindFlags = BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = 0;
SubresourceData InitData;
ZeroMemory(&InitData, sizeof(InitData));
InitData.pSysMem = verts;
vertexBuffer_Origin = new GPUBuffer;
wiRenderer::GetDevice()->CreateBuffer(&bd, &InitData, vertexBuffer_Origin);
}
}
}
@@ -52,24 +139,160 @@ wiTranslator::~wiTranslator()
void wiTranslator::Update()
{
XMFLOAT4 pointer = wiInputManager::GetInstance()->getpointer();
if (enabled && wiInputManager::GetInstance()->down(VK_LBUTTON))
Camera* cam = wiRenderer::getCamera();
XMVECTOR pos = XMLoadFloat3(&translation);
if (enabled)
{
Camera* cam = wiRenderer::getCamera();
float dist = wiMath::Distance(cam->translation, translation);
XMVECTOR pos = XMLoadFloat3(&translation);
XMVECTOR plane = XMPlaneFromPointNormal(pos, XMVector3Normalize(cam->GetAt()));
if (!dragging)
{
float fDist = wiMath::Distance(translation, cam->translation) * 0.05f;
RAY ray = wiRenderer::getPickRay((long)pointer.x, (long)pointer.y);
XMVECTOR rayOrigin = XMLoadFloat3(&ray.origin);
XMVECTOR rayDir = XMLoadFloat3(&ray.direction);
XMVECTOR intersection = XMPlaneIntersectLine(plane, rayOrigin, rayOrigin + rayDir*cam->zFarP);
XMVECTOR o, x, y, z, p, xy, xz, yz;
XMFLOAT3 delta;
XMStoreFloat3(&delta, intersection - pos);
o = pos;
x = o + XMVectorSet(3, 0, 0, 0) * fDist;
y = o + XMVectorSet(0, 3, 0, 0) * fDist;
z = o + XMVectorSet(0, 0, 3, 0) * fDist;
p = XMLoadFloat4(&pointer);
xy = o + XMVectorSet(1, 1, 0, 0) * fDist;
xz = o + XMVectorSet(1, 0, 1, 0) * fDist;
yz = o + XMVectorSet(0, 1, 1, 0) * fDist;
Translate(delta);
XMMATRIX P = cam->GetProjection();
XMMATRIX V = cam->GetView();
XMMATRIX W = XMMatrixIdentity();
o = XMVector3Project(o, 0, 0, cam->width, cam->height, 0, 1, P, V, W);
x = XMVector3Project(x, 0, 0, cam->width, cam->height, 0, 1, P, V, W);
y = XMVector3Project(y, 0, 0, cam->width, cam->height, 0, 1, P, V, W);
z = XMVector3Project(z, 0, 0, cam->width, cam->height, 0, 1, P, V, W);
xy = XMVector3Project(xy, 0, 0, cam->width, cam->height, 0, 1, P, V, W);
xz = XMVector3Project(xz, 0, 0, cam->width, cam->height, 0, 1, P, V, W);
yz = XMVector3Project(yz, 0, 0, cam->width, cam->height, 0, 1, P, V, W);
XMVECTOR xDisV = XMVector2LinePointDistance(o, x, p);
XMVECTOR yDisV = XMVector2LinePointDistance(o, y, p);
XMVECTOR zDisV = XMVector2LinePointDistance(o, z, p);
XMVECTOR oDisV = XMVector3Length(o - p);
XMVECTOR xyDisV = XMVector3Length(xy - p);
XMVECTOR xzDisV = XMVector3Length(xz - p);
XMVECTOR yzDisV = XMVector3Length(yz - p);
float xDis = XMVectorGetX(xDisV);
float yDis = XMVectorGetX(yDisV);
float zDis = XMVectorGetX(zDisV);
float oDis = XMVectorGetX(oDisV);
float xyDis = XMVectorGetX(xyDisV);
float xzDis = XMVectorGetX(xzDisV);
float yzDis = XMVectorGetX(yzDisV);
if (oDis < 10)
{
state = TRANSLATOR_XYZ;
}
else if (xyDis < 10)
{
state = TRANSLATOR_XY;
}
else if (xzDis < 10)
{
state = TRANSLATOR_XZ;
}
else if (yzDis < 10)
{
state = TRANSLATOR_YZ;
}
else if (xDis < 10)
{
state = TRANSLATOR_X;
}
else if (yDis < 10)
{
state = TRANSLATOR_Y;
}
else if (zDis < 10)
{
state = TRANSLATOR_Z;
}
else if (!dragging)
{
state = TRANSLATOR_IDLE;
}
}
if (dragging || (state != TRANSLATOR_IDLE && wiInputManager::GetInstance()->down(VK_LBUTTON)))
{
XMVECTOR dragStartV = XMLoadFloat3(&dragStart);
XMVECTOR plane;
if (state == TRANSLATOR_XY)
{
plane = XMPlaneFromPointNormal(pos, XMVectorSet(0, 0, 1, 1));
}
else if (state == TRANSLATOR_XZ)
{
plane = XMPlaneFromPointNormal(pos, XMVectorSet(0, 1, 0, 1));
}
else if (state == TRANSLATOR_YZ)
{
plane = XMPlaneFromPointNormal(pos, XMVectorSet(1, 0, 0, 1));
}
else
{
// xyz
plane = XMPlaneFromPointNormal(pos, XMVector3Normalize(cam->GetAt()));
}
RAY ray = wiRenderer::getPickRay((long)pointer.x, (long)pointer.y);
XMVECTOR rayOrigin = XMLoadFloat3(&ray.origin);
XMVECTOR rayDir = XMLoadFloat3(&ray.direction);
XMVECTOR intersection = XMPlaneIntersectLine(plane, rayOrigin, rayOrigin + rayDir*cam->zFarP);
ray = wiRenderer::getPickRay((long)prevPointer.x, (long)prevPointer.y);
rayOrigin = XMLoadFloat3(&ray.origin);
rayDir = XMLoadFloat3(&ray.direction);
XMVECTOR intersectionPrev = XMPlaneIntersectLine(plane, rayOrigin, rayOrigin + rayDir*cam->zFarP);
XMFLOAT3 delta;
XMStoreFloat3(&delta, intersection - intersectionPrev);
if (state == TRANSLATOR_X)
{
delta.y = delta.z = 0;
}
else if (state == TRANSLATOR_Y)
{
delta.x = delta.z = 0;
}
else if (state == TRANSLATOR_Z)
{
delta.x = delta.y = 0;
}
Translate(delta);
Transform::UpdateTransform();
if (!dragging)
{
// drag start
XMStoreFloat3(&dragStart, intersection);
}
dragging = true;
}
if (!wiInputManager::GetInstance()->down(VK_LBUTTON))
{
dragging = false;
}
Transform::UpdateTransform();
}
else
{
dragging = false;
}
prevPointer = pointer;
}
+20 -3
View File
@@ -6,16 +6,33 @@ class wiTranslator : public Transform
{
private:
XMFLOAT4 prevPointer;
XMFLOAT3 dragStart;
bool dragging;
public:
wiTranslator();
~wiTranslator();
void Update();
bool enabled;
static wiGraphicsTypes::GPUBuffer* vertexBuffer;
static int vertexCount;
enum TRANSLATOR_STATE
{
TRANSLATOR_IDLE,
TRANSLATOR_X,
TRANSLATOR_Y,
TRANSLATOR_Z,
TRANSLATOR_XY,
TRANSLATOR_XZ,
TRANSLATOR_YZ,
TRANSLATOR_XYZ,
} state;
static wiGraphicsTypes::GPUBuffer* vertexBuffer_Axis;
static wiGraphicsTypes::GPUBuffer* vertexBuffer_Plane;
static wiGraphicsTypes::GPUBuffer* vertexBuffer_Origin;
static int vertexCount_Axis;
static int vertexCount_Plane;
static int vertexCount_Origin;
};