#include "TessellatedQuadGeomOverride.h"
#include "CrackFreePrimitiveGenerator.h"
#include <maya/MViewport2Renderer.h>
#include <maya/MHWGeometryUtilities.h>
#include <maya/MFragmentManager.h>
#include <maya/MShaderManager.h>
#include <maya/MTextureManager.h>
#include <maya/MUintArray.h>
#include <maya/MSelectionMask.h>
#include <maya/MGlobal.h>
#include <string.h>
#include <iostream>
namespace
{
const MString kWireframeItemName(
"tessellatedQuadWireframe");
const MString kTessellatedItemName(
"tessellatedQuadTessellated");
const MString kTessellatedSelectorItemName(
"tessellatedQuadTessellatedSelector");
const MString kTessellatedWireframeItemName(
"tessellatedQuadTessellatedWireframe");
const MString kTessellatedWireframeSelectorItemName(
"tessellatedQuadTessellatedWireframeSelector");
const unsigned int kNumPoints = 4;
const unsigned int kNumTris = 2;
const float kPlanePnts[kNumPoints][3] = {
{-1.0, 0.0, -1.0},
{1.0, 0.0, -1.0},
{1.0, 0.0, 1.0},
{-1.0, 0.0, 1.0}
};
const unsigned int kPlaneTriVertIndexes[kNumTris][3] = {
{0, 1, 2},
{2, 3, 0}
};
const float kPlaneUVs[kNumPoints][2] = {
{0.0, 1.0},
{1.0, 1.0},
{1.0, 0.0},
{0.0, 0.0}
};
const unsigned int kPlaneWireVertIndexes[kNumPoints][2] = {
{0, 1},
{1, 2},
{2, 3},
{3, 0}
};
}
void TessellatedQuadGeomOverride::updateRenderItems(
{
if (!renderer) return;
if (!shaderMgr || !textureMgr) return;
int idx = list.
indexOf(kWireframeItemName);
if (idx >= 0)
{
wireframeItem = list.
itemAt(idx);
}
else
{
1);
}
if (wireframeItem)
{
MHWRender::MShaderManager::MStockShader::k3dThickLineShader);
if (shader)
{
const float color[4] = { wireColor.
r, wireColor.
g, wireColor.
b, 1.0f };
}
}
const unsigned int triStride = CrackFreePrimitiveGenerator::computeTriangleSize(
true , true , true );
{
devkitLocation =
MString(getenv(
"MAYA_LOCATION")) +
MString(
"/devkit");
}
MString shaderLocation = devkitLocation +
"/plug-ins/tessellatedQuad/TessellationExample.fx" :
"/plug-ins/tessellatedQuad/TessellationExample.ogsfx");
MString textureLocation = devkitLocation +
MString(
"/plug-ins/tessellatedQuad/moonHeightMapSharp.jpg");
if (list.
indexOf(kTessellatedItemName) < 0)
{
triStride);
if (tessellationShader)
{
MTextureAssignment assignment;
assignment.texture = texture;
}
else
{
std::cerr << "Error when loading: " << er << std::endl;
std::cerr << erSrc << std::endl;
}
}
if (list.
indexOf(kTessellatedSelectorItemName) < 0)
{
triStride);
if (selectionShader)
{
MTextureAssignment assignment;
assignment.texture = texture;
}
else
{
std::cerr << "Error when loading: " << er << std::endl;
std::cerr << erSrc << std::endl;
}
}
if (list.
indexOf(kTessellatedWireframeItemName) < 0)
{
kTessellatedWireframeItemName,
triStride);
if (tessellationShader)
{
MTextureAssignment assignment;
assignment.texture = texture;
}
else
{
std::cerr << "Error when loading: " << er << std::endl;
std::cerr << erSrc << std::endl;
}
}
if (list.
indexOf(kTessellatedWireframeSelectorItemName) < 0)
{
triStride);
if (selectionShader)
{
MTextureAssignment assignment;
assignment.texture = texture;
}
else
{
std::cerr << "Error when loading: " << er << std::endl;
std::cerr << erSrc << std::endl;
}
}
}
void TessellatedQuadGeomOverride::populateGeometry(
{
for (
int ri = 0; ri < vbDescriptors.
length(); ++ri )
{
continue;
{
{
if (positionBuffer)
{
float *verts = (
float *) positionBuffer->
acquire(kNumPoints,
false);
memcpy(verts, kPlanePnts, sizeof(float) * kNumPoints * 3);
positionBuffer->
commit(verts);
}
}
break;
{
if (vb)
{
float *normals= (
float *) vb->
acquire(kNumPoints,
true);
for ( unsigned int ni=0; ni<kNumPoints; ++ni )
{
normals[ni*3 + 0] = 0.0f;
normals[ni*3 + 1] = 1.0f;
normals[ni*3 + 2] = 0.0f;
}
}
}
break;
{
if (uvBuffer)
{
float *uvs = (
float *) uvBuffer->
acquire(kNumPoints,
false);
memcpy(uvs, kPlaneUVs, sizeof(float) * kNumPoints * 2);
}
}
break;
default:
std::cerr <<
"Unexpected vb descriptor: " << vbDescriptor.
semanticName() << std::endl;
break;
};
}
const unsigned int triStride = CrackFreePrimitiveGenerator::computeTriangleSize(
true , true , true );
for (
int ri = 0; ri < renderItems.
length(); ++ri )
{
if ( !item )
continue;
if ( itemName == kWireframeItemName )
{
if (ib)
{
unsigned int* indexes = (
unsigned int *) ib->
acquire(kNumPoints * 2,
false);
memcpy(indexes, kPlaneWireVertIndexes, sizeof(unsigned int) * kNumPoints * 2);
}
}
else if (
itemName == kTessellatedItemName ||
itemName == kTessellatedSelectorItemName ||
itemName == kTessellatedWireframeItemName ||
itemName == kTessellatedWireframeSelectorItemName )
{
if (!patchIB)
{
if (patchIB)
{
MUintArray triIndices(kPlaneTriVertIndexes[0], kNumTris * 3);
float * positionBufferFloat = (
float *)positionBuffer->
map();
float * uvBufferFloat = NULL;
if (uvBuffer) uvBufferFloat = (
float *)uvBuffer->
map();
const unsigned int bufferSize = kNumTris * triStride;
unsigned int* indexes = (
unsigned int*)patchIB->
acquire(bufferSize,
true );
CrackFreePrimitiveGenerator::mutateIndexBuffer(triIndices,
positionBufferFloat,
uvBufferFloat,
true ,
true ,
true ,
indexes);
if (positionBuffer) positionBuffer->
unmap();
if (uvBuffer) uvBuffer->
unmap();
}
}
if (patchIB)
{
}
}
}
}