Skip to content

Commit

Permalink
Merge pull request #112 from Autodesk/chenh/wireframe-bbox-reprs-and-…
Browse files Browse the repository at this point in the history
…proxy-transformation-visibility

* Optimized VP2RenderDelegate repr update.
* Added wireframe display for USD mesh.
* Added bbox display for USD mesh (BBox will be hidden for Rprims without authored extent).
* Added proxy shape transformation and visibility support.
  • Loading branch information
Huidong Chen authored Nov 13, 2019
2 parents f7be757 + 0e9a14d commit 247677c
Show file tree
Hide file tree
Showing 13 changed files with 1,354 additions and 663 deletions.
2 changes: 2 additions & 0 deletions lib/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ list(APPEND mayaUsd_src
listeners/notice.cpp
listeners/proxyShapeNotice.cpp
#
render/vp2RenderDelegate/bboxGeom.cpp
render/vp2RenderDelegate/debugCodes.cpp
render/vp2RenderDelegate/render_param.cpp
render/vp2RenderDelegate/instancer.cpp
Expand All @@ -68,6 +69,7 @@ list(APPEND mayaUsd_src
render/vp2RenderDelegate/proxyRenderDelegate.cpp
render/vp2RenderDelegate/render_delegate.cpp
render/vp2RenderDelegate/sampler.cpp
render/vp2RenderDelegate/tokens.cpp
#
render/vp2ShaderFragments/shaderFragments.cpp
#
Expand Down
78 changes: 78 additions & 0 deletions lib/render/vp2RenderDelegate/bboxGeom.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
//
// Copyright 2019 Autodesk
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#include "bboxGeom.h"

#include "pxr/base/arch/threads.h"
#include "pxr/base/tf/diagnostic.h"

PXR_NAMESPACE_OPEN_SCOPE

//! Constructor. Call from main thread only.
HdVP2BBoxGeom::HdVP2BBoxGeom()
: _range(GfVec3d(-0.5, -0.5, -0.5), GfVec3d(0.5, 0.5, 0.5))
{
// MVertexBuffer::commit() & MIndexBuffer::commit() can work only when being
// called from main thread.
TF_VERIFY(ArchIsMainThread(), "Creating HdVP2BBoxGeom from worker threads");

const MHWRender::MVertexBufferDescriptor vbDesc(
"", MGeometry::kPosition, MGeometry::kFloat, 3);

_positionBuffer.reset(new MHWRender::MVertexBuffer(vbDesc));

if (void* buffer = _positionBuffer->acquire(8, true)) {
constexpr float vertexData[] = {
-0.5f, -0.5f, -0.5f, // vtx 0
-0.5f, -0.5f, 0.5f, // vtx 1
-0.5f, 0.5f, -0.5f, // vtx 2
-0.5f, 0.5f, 0.5f, // vtx 3
0.5f, -0.5f, -0.5f, // vtx 4
0.5f, -0.5f, 0.5f, // vtx 5
0.5f, 0.5f, -0.5f, // vtx 6
0.5f, 0.5f, 0.5f // vtx 7
};

memcpy(buffer, vertexData, sizeof(vertexData));

_positionBuffer->commit(buffer);
}

_indexBuffer.reset(new MHWRender::MIndexBuffer(MGeometry::kUnsignedInt32));

if (void* buffer = _indexBuffer->acquire(24, true)) {
constexpr unsigned int indexData[] = {
0, 4, // edge 0
1, 5, // edge 1
2, 6, // edge 2
3, 7, // edge 3
0, 2, // edge 4
1, 3, // edge 5
4, 6, // edge 6
5, 7, // edge 7
0, 1, // edge 8
2, 3, // edge 9
4, 5, // edge 10
6, 7 // edge 11
};

memcpy(buffer, indexData, sizeof(indexData));

_indexBuffer->commit(buffer);
}
}

PXR_NAMESPACE_CLOSE_SCOPE
60 changes: 60 additions & 0 deletions lib/render/vp2RenderDelegate/bboxGeom.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
//
// Copyright 2019 Autodesk
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#ifndef HD_VP2_BBOX_GEOM
#define HD_VP2_BBOX_GEOM

#include "maya/MHWGeometry.h"

#include "pxr/pxr.h"
#include "pxr/base/gf/range3d.h"

#include <memory>

PXR_NAMESPACE_OPEN_SCOPE

/*! \brief Geometry used for bounding box display in VP2.
\class HdVP2BBoxGeom
The class defines a unit wire cube centered at origin. It can be used to
provide shared geometry for all Rprims to display bounding box in VP2.
The class can only be instantiated from main thread.
*/
class HdVP2BBoxGeom final
{
public:
HdVP2BBoxGeom();
~HdVP2BBoxGeom() = default;

const MHWRender::MVertexBuffer* GetPositionBuffer() const {
return _positionBuffer.get();
}

const MHWRender::MIndexBuffer* GetIndexBuffer() const {
return _indexBuffer.get();
}

const GfRange3d& GetRange() const { return _range; }

private:
std::unique_ptr<MVertexBuffer> _positionBuffer; //!< Position buffer of the geometry
std::unique_ptr<MIndexBuffer> _indexBuffer; //!< Index buffer of the geometry
GfRange3d _range; //!< Range of the geometry
};

PXR_NAMESPACE_CLOSE_SCOPE

#endif // HD_VP2_BBOX_GEOM
6 changes: 3 additions & 3 deletions lib/render/vp2RenderDelegate/draw_item.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,13 @@ HdVP2DrawItem::HdVP2DrawItem(
_renderItemName = GetRprimID().GetText();
_renderItemName += TfStringPrintf("/DrawItem_%p", this).c_str();

_mesh._indexBuffer.reset(
_renderItemData._indexBuffer.reset(
new MHWRender::MIndexBuffer(MHWRender::MGeometry::kUnsignedInt32));

if (desc.geomStyle == HdMeshGeomStyleHull) {
const MHWRender::MVertexBufferDescriptor desc("",
MHWRender::MGeometry::kNormal, MHWRender::MGeometry::kFloat, 3);
_mesh._normalsBuffer.reset(new MHWRender::MVertexBuffer(desc));
_renderItemData._normalsBuffer.reset(new MHWRender::MVertexBuffer(desc));
}
}

Expand All @@ -67,7 +67,7 @@ HdVP2DrawItem::~HdVP2DrawItem() {

//! \brief Get access to render item data.
HdVP2DrawItem::RenderItemData& HdVP2DrawItem::GetRenderItemData() {
return _mesh;
return _renderItemData;
}

PXR_NAMESPACE_CLOSE_SCOPE
89 changes: 70 additions & 19 deletions lib/render/vp2RenderDelegate/draw_item.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,17 @@
#include "pxr/pxr.h"
#include "pxr/base/gf/vec3f.h"
#include "pxr/base/vt/array.h"
#include "pxr/imaging/hd/changeTracker.h"
#include "pxr/imaging/hd/drawItem.h"
#include "pxr/imaging/hd/mesh.h"
#include "pxr/usd/usd/timeCode.h"

#include <maya/MBoundingBox.h>
#include <maya/MHWGeometry.h>
#include <maya/MMatrix.h>
#include <maya/MString.h>

PXR_NAMESPACE_OPEN_SCOPE

struct HdMeshReprDesc;
class HdVP2RenderDelegate;

/*! \brief Draw Item holds information necessary for accessing and updating VP2 render items
Expand All @@ -38,12 +39,6 @@ class HdVP2RenderDelegate;
class HdVP2DrawItem final : public HdDrawItem
{
public:
//! Helper struct providing storage for per frame cache data
struct CachedData {
MBoundingBox _boundingBox; //!< Bounding box cache
VtArray<GfVec3f> _normals; //!< Normals cache
};

//! A primvar vertex buffer map indexed by primvar name.
using PrimvarBufferMap = std::unordered_map<
TfToken,
Expand All @@ -61,12 +56,30 @@ class HdVP2DrawItem final : public HdDrawItem
PrimvarBufferMap _primvarBuffers;
//! Render item index buffer - use when updating data
std::unique_ptr<MHWRender::MIndexBuffer> _indexBuffer;
//! Bounding box of the render item.
MBoundingBox _boundingBox;
//! World matrix of the render item.
MMatrix _worldMatrix;

//! Shader instance assigned to the render item. No ownership is held.
MHWRender::MShaderInstance* _shader{ nullptr };

//! Whether or not the render item is enabled
bool _enabled{ true };

//! Number of instances currently allocated for render item
unsigned int _instanceCount{ 0 };

//! Per frame cache
std::map<UsdTimeCode, CachedData> _cache;
//! Whether or not the render item is using GPU instanced draw.
bool _usingInstancedDraw{ false };
};

//! Bit fields indicating what the render item is created for. A render item
//! can be created for multiple usages.
enum RenderItemUsage
{
kRegular = 1 << 0, //!< Regular drawing (shaded, wireframe etc.)
kSelectionHighlight = 1 << 1 //!< Selection highlight.
};

public:
Expand All @@ -80,24 +93,62 @@ class HdVP2DrawItem final : public HdDrawItem
*/
const MString& GetRenderItemName() const { return _renderItemName; }

/*! \brief Whether the draw item is enabled.
/*! \brief Get pointer of the associated render item
*/
bool IsEnabled() const { return _enabled; }
MHWRender::MRenderItem* GetRenderItem() const { return _renderItem; }

/*! \brief Enable or disable the draw item.
/*! \brief Set pointer of the associated render item
*/
void Enable(bool v) { _enabled = v; }
void SetRenderItem(MHWRender::MRenderItem* item) { _renderItem = item; }

/*! \brief Get the repr desc for which the draw item was created.
*/
const HdMeshReprDesc& GetReprDesc() const { return _reprDesc; }

/*! \brief Set a usage to the render item
*/
void SetUsage(RenderItemUsage usage) { _renderItemUsage = usage; }

/*! \brief Add a usage to the render item
*/
void AddUsage(RenderItemUsage usage) { _renderItemUsage |= usage; }

/*! \brief Is the render item created for this usage?
*/
bool ContainsUsage(RenderItemUsage usage) const { return (_renderItemUsage & usage) != 0; }

/*! \brief Is the render item created for this usage only?
*/
bool MatchesUsage(RenderItemUsage usage) const { return _renderItemUsage == usage; }

/*! \brief Bitwise OR with the input dirty bits.
*/
void SetDirtyBits(HdDirtyBits bits) {
_dirtyBits |= bits;
}

/*! \brief Reset the dirty bits to clean.
*/
void ResetDirtyBits() {
_dirtyBits = 0;
}

/*! \brief Get the dirty bits of the draw items.
*/
HdDirtyBits GetDirtyBits() const {
return _dirtyBits;
}

private:
HdVP2RenderDelegate* _delegate{ nullptr }; //!< VP2 render delegate for which this draw item was created
const HdMeshReprDesc _reprDesc; //!< The repr desc for which the draw item was created.
RenderItemData _mesh; //!< VP2 render item data
MString _renderItemName; //!< Unique name. Use this when searching for render item in subscene override container
bool _enabled{ true }; //!< Whether the draw item is enabled.

HdVP2RenderDelegate* _delegate{ nullptr }; //!< VP2 render delegate for which this draw item was created
const HdMeshReprDesc _reprDesc; //!< The repr desc for which the draw item was created.
MString _renderItemName; //!< Unique name for easier debugging and profiling.
MHWRender::MRenderItem* _renderItem{ nullptr }; //!< Pointer of the render item for fast access. No ownership is held.
RenderItemData _renderItemData; //!< VP2 render item data

uint32_t _renderItemUsage{ kRegular }; //!< What is the render item created for
HdDirtyBits _dirtyBits{ HdChangeTracker::AllDirty }; //!< Dirty bits to control data update of render item
};

PXR_NAMESPACE_CLOSE_SCOPE
Expand Down
Loading

0 comments on commit 247677c

Please sign in to comment.