updated translator + shaders
This commit is contained in:
@@ -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
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user