mirror of
https://github.com/PixarAnimationStudios/OpenSubdiv
synced 2024-11-26 21:40:07 +00:00
Merge pull request #1131 from davidgyu/mtl_viewer_options
Thanks, David
This commit is contained in:
commit
7e229cf095
BIN
examples/glFVarViewer/.glFVarViewer.cpp.swp
Normal file
BIN
examples/glFVarViewer/.glFVarViewer.cpp.swp
Normal file
Binary file not shown.
@ -87,12 +87,17 @@ enum {
|
|||||||
|
|
||||||
-(void)keyDown:(NSEvent *)event {
|
-(void)keyDown:(NSEvent *)event {
|
||||||
const auto key = [event.charactersIgnoringModifiers characterAtIndex:0];
|
const auto key = [event.charactersIgnoringModifiers characterAtIndex:0];
|
||||||
if(key == '=') {
|
if (hud.KeyDown(key)) {
|
||||||
|
return;
|
||||||
|
} else if(key == '=') {
|
||||||
_controller.osdRenderer.tessellationLevel = std::min(_controller.osdRenderer.tessellationLevel + 1, 16);
|
_controller.osdRenderer.tessellationLevel = std::min(_controller.osdRenderer.tessellationLevel + 1, 16);
|
||||||
} else if (key == '-') {
|
} else if (key == '-') {
|
||||||
_controller.osdRenderer.tessellationLevel = std::max(_controller.osdRenderer.tessellationLevel - 1, 0);
|
_controller.osdRenderer.tessellationLevel = std::max(_controller.osdRenderer.tessellationLevel - 1, 0);
|
||||||
} else if(!hud.KeyDown(key))
|
} else if (key == 'f') {
|
||||||
|
[_controller.osdRenderer fitFrame];
|
||||||
|
} else {
|
||||||
[super keyDown:event];
|
[super keyDown:event];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
-(void)scrollWheel:(NSEvent *)event {
|
-(void)scrollWheel:(NSEvent *)event {
|
||||||
@ -300,8 +305,8 @@ enum {
|
|||||||
hud.AddCheckBox("Fractional spacing (T)", _osdRenderer.useFractionalTessellation,
|
hud.AddCheckBox("Fractional spacing (T)", _osdRenderer.useFractionalTessellation,
|
||||||
10, y, callbackCheckbox, kHUD_CB_FRACTIONAL_SPACING, 't');
|
10, y, callbackCheckbox, kHUD_CB_FRACTIONAL_SPACING, 't');
|
||||||
y += 20;
|
y += 20;
|
||||||
hud.AddCheckBox("Frustum Patch Culling (F)", _osdRenderer.usePatchClipCulling,
|
hud.AddCheckBox("Frustum Patch Culling (P)", _osdRenderer.usePatchClipCulling,
|
||||||
10, y, callbackCheckbox, kHUD_CB_PATCH_CULL, 'f');
|
10, y, callbackCheckbox, kHUD_CB_PATCH_CULL, 'p');
|
||||||
y += 20;
|
y += 20;
|
||||||
hud.AddCheckBox("Backface Culling (B)", _osdRenderer.usePatchBackfaceCulling,
|
hud.AddCheckBox("Backface Culling (B)", _osdRenderer.usePatchBackfaceCulling,
|
||||||
10, y, callbackCheckbox, kHUD_CB_BACK_CULL, 'b');
|
10, y, callbackCheckbox, kHUD_CB_BACK_CULL, 'b');
|
||||||
@ -392,7 +397,7 @@ enum {
|
|||||||
hud.AddPullDownButton(endcap_pulldown, "Gregory",
|
hud.AddPullDownButton(endcap_pulldown, "Gregory",
|
||||||
kEndCapGregoryBasis,
|
kEndCapGregoryBasis,
|
||||||
_osdRenderer.endCapMode == kEndCapGregoryBasis);
|
_osdRenderer.endCapMode == kEndCapGregoryBasis);
|
||||||
if (true || _osdRenderer.legacyGregoryEnabled) {
|
if (_osdRenderer.legacyGregoryEnabled) {
|
||||||
hud.AddPullDownButton(endcap_pulldown, "LegacyGregory",
|
hud.AddPullDownButton(endcap_pulldown, "LegacyGregory",
|
||||||
kEndCapLegacyGregory,
|
kEndCapLegacyGregory,
|
||||||
_osdRenderer.endCapMode == kEndCapLegacyGregory);
|
_osdRenderer.endCapMode == kEndCapLegacyGregory);
|
||||||
@ -402,7 +407,7 @@ enum {
|
|||||||
for (int i = 1; i < 11; ++i) {
|
for (int i = 1; i < 11; ++i) {
|
||||||
char level[16];
|
char level[16];
|
||||||
sprintf(level, "Lv. %d", i);
|
sprintf(level, "Lv. %d", i);
|
||||||
hud.AddRadioButton(3, level, i==2, 10, 310+i*20, callbackLevel, i, '0'+(i%10));
|
hud.AddRadioButton(3, level, i==_osdRenderer.refinementLevel, 10, 310+i*20, callbackLevel, i, '0'+(i%10));
|
||||||
}
|
}
|
||||||
|
|
||||||
int shapes_pulldown = hud.AddPullDown("Shape (N)", -300, 10, 300, callbackModel, 'n');
|
int shapes_pulldown = hud.AddPullDown("Shape (N)", -300, 10, 300, callbackModel, 'n');
|
||||||
|
@ -86,6 +86,8 @@ typedef struct {
|
|||||||
|
|
||||||
-(id<MTLRenderCommandEncoder>)drawFrame:(id<MTLCommandBuffer>)commandBuffer;
|
-(id<MTLRenderCommandEncoder>)drawFrame:(id<MTLCommandBuffer>)commandBuffer;
|
||||||
|
|
||||||
|
-(void)fitFrame;
|
||||||
|
|
||||||
@property (readonly, nonatomic) id<OSDRendererDelegate> delegate;
|
@property (readonly, nonatomic) id<OSDRendererDelegate> delegate;
|
||||||
|
|
||||||
@property (nonatomic) unsigned refinementLevel;
|
@property (nonatomic) unsigned refinementLevel;
|
||||||
@ -109,6 +111,7 @@ typedef struct {
|
|||||||
@property (nonatomic) bool useStageIn;
|
@property (nonatomic) bool useStageIn;
|
||||||
@property (nonatomic) bool usePrimitiveBackfaceCulling;
|
@property (nonatomic) bool usePrimitiveBackfaceCulling;
|
||||||
@property (nonatomic) bool useAdaptive;
|
@property (nonatomic) bool useAdaptive;
|
||||||
|
@property (nonatomic) bool yup;
|
||||||
@property (nonatomic) bool freeze;
|
@property (nonatomic) bool freeze;
|
||||||
@property (nonatomic) bool animateVertices;
|
@property (nonatomic) bool animateVertices;
|
||||||
@property (nonatomic) bool displayControlMeshEdges;
|
@property (nonatomic) bool displayControlMeshEdges;
|
||||||
|
@ -47,11 +47,13 @@
|
|||||||
#import <opensubdiv/osd/mtlComputeEvaluator.h>
|
#import <opensubdiv/osd/mtlComputeEvaluator.h>
|
||||||
#import <opensubdiv/osd/mtlPatchShaderSource.h>
|
#import <opensubdiv/osd/mtlPatchShaderSource.h>
|
||||||
|
|
||||||
#import "../common/simple_math.h"
|
|
||||||
#import "../../regression/common/far_utils.h"
|
#import "../../regression/common/far_utils.h"
|
||||||
#import "init_shapes.h"
|
#import "../common/argOptions.h"
|
||||||
#import "../common/mtlUtils.h"
|
#import "../common/mtlUtils.h"
|
||||||
#import "../common/mtlControlMeshDisplay.h"
|
#import "../common/mtlControlMeshDisplay.h"
|
||||||
|
#import "../common/simple_math.h"
|
||||||
|
#import "../common/viewerArgsUtils.h"
|
||||||
|
#import "init_shapes.h"
|
||||||
|
|
||||||
#define VERTEX_BUFFER_INDEX 0
|
#define VERTEX_BUFFER_INDEX 0
|
||||||
#define PATCH_INDICES_BUFFER_INDEX 1
|
#define PATCH_INDICES_BUFFER_INDEX 1
|
||||||
@ -188,6 +190,7 @@ using PerFrameBuffer = MTLRingBuffer<DataType, FRAME_LAG>;
|
|||||||
bool _needsRebuild;
|
bool _needsRebuild;
|
||||||
NSString* _osdShaderSource;
|
NSString* _osdShaderSource;
|
||||||
simd::float3 _meshCenter;
|
simd::float3 _meshCenter;
|
||||||
|
float _meshSize;
|
||||||
NSMutableArray<NSString*>* _loadedModels;
|
NSMutableArray<NSString*>* _loadedModels;
|
||||||
int _patchCounts[DISPATCHSLOTS];
|
int _patchCounts[DISPATCHSLOTS];
|
||||||
}
|
}
|
||||||
@ -301,6 +304,38 @@ struct PipelineConfig {
|
|||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-(void)_processArgs {
|
||||||
|
|
||||||
|
NSEnumerator *argsArray =
|
||||||
|
[[[NSProcessInfo processInfo] arguments] objectEnumerator];
|
||||||
|
|
||||||
|
std::vector<char *> argsVector;
|
||||||
|
for (id arg in argsArray) {
|
||||||
|
argsVector.push_back((char *)[arg UTF8String]);
|
||||||
|
}
|
||||||
|
|
||||||
|
ArgOptions args;
|
||||||
|
|
||||||
|
args.Parse(argsVector.size(), argsVector.data());
|
||||||
|
|
||||||
|
// Parse remaining args
|
||||||
|
const std::vector<const char *> &rargs = args.GetRemainingArgs();
|
||||||
|
for (size_t i = 0; i < rargs.size(); ++i) {
|
||||||
|
|
||||||
|
if (!strcmp(rargs[i], "-lg")) {
|
||||||
|
self.legacyGregoryEnabled = true;
|
||||||
|
} else {
|
||||||
|
args.PrintUnrecognizedArgWarning(rargs[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.yup = args.GetYUp();
|
||||||
|
self.useAdaptive = args.GetAdaptive();
|
||||||
|
self.refinementLevel = args.GetLevel();
|
||||||
|
|
||||||
|
ViewerArgsUtils::PopulateShapes(args, &g_defaultShapes);
|
||||||
|
}
|
||||||
|
|
||||||
-(instancetype)initWithDelegate:(id<OSDRendererDelegate>)delegate {
|
-(instancetype)initWithDelegate:(id<OSDRendererDelegate>)delegate {
|
||||||
self = [super init];
|
self = [super init];
|
||||||
if (self) {
|
if (self) {
|
||||||
@ -316,12 +351,15 @@ struct PipelineConfig {
|
|||||||
self.usePatchBackfaceCulling = false;
|
self.usePatchBackfaceCulling = false;
|
||||||
self.usePrimitiveBackfaceCulling = false;
|
self.usePrimitiveBackfaceCulling = false;
|
||||||
self.useAdaptive = true;
|
self.useAdaptive = true;
|
||||||
|
self.yup = false;
|
||||||
self.kernelType = kMetal;
|
self.kernelType = kMetal;
|
||||||
self.refinementLevel = 2;
|
self.refinementLevel = 2;
|
||||||
self.tessellationLevel = 1;
|
self.tessellationLevel = 1;
|
||||||
self.shadingMode = kShadingPatchType;
|
self.shadingMode = kShadingPatchType;
|
||||||
self.displayStyle = kDisplayStyleWireOnShaded;
|
self.displayStyle = kDisplayStyleWireOnShaded;
|
||||||
self.legacyGregoryEnabled = true;
|
self.legacyGregoryEnabled = false;
|
||||||
|
|
||||||
|
[self _processArgs];
|
||||||
|
|
||||||
_frameCount = 0;
|
_frameCount = 0;
|
||||||
_animationFrames = 0;
|
_animationFrames = 0;
|
||||||
@ -411,6 +449,10 @@ struct PipelineConfig {
|
|||||||
return renderEncoder;
|
return renderEncoder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-(void)fitFrame {
|
||||||
|
_cameraData.dollyDistance = _meshSize;
|
||||||
|
}
|
||||||
|
|
||||||
-(void)_renderMesh:(id<MTLRenderCommandEncoder>)renderCommandEncoder {
|
-(void)_renderMesh:(id<MTLRenderCommandEncoder>)renderCommandEncoder {
|
||||||
|
|
||||||
auto patchVertexBuffer = _mesh->BindVertexBuffer();
|
auto patchVertexBuffer = _mesh->BindVertexBuffer();
|
||||||
@ -675,7 +717,6 @@ struct PipelineConfig {
|
|||||||
|
|
||||||
auto shapeDesc = &g_defaultShapes[[_loadedModels indexOfObject:_currentModel]];
|
auto shapeDesc = &g_defaultShapes[[_loadedModels indexOfObject:_currentModel]];
|
||||||
_shape.reset(Shape::parseObj(shapeDesc->data.c_str(), shapeDesc->scheme));
|
_shape.reset(Shape::parseObj(shapeDesc->data.c_str(), shapeDesc->scheme));
|
||||||
const auto scheme = shapeDesc->scheme;
|
|
||||||
|
|
||||||
// create Far mesh (topology)
|
// create Far mesh (topology)
|
||||||
Sdc::SchemeType sdctype = GetSdcType(*_shape);
|
Sdc::SchemeType sdctype = GetSdcType(*_shape);
|
||||||
@ -753,7 +794,6 @@ struct PipelineConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_vertexData.resize(refBaseLevel.GetNumVertices() * numElements);
|
_vertexData.resize(refBaseLevel.GetNumVertices() * numElements);
|
||||||
_meshCenter = simd::float3{0,0,0};
|
|
||||||
|
|
||||||
for(int i = 0; i < refBaseLevel.GetNumVertices(); ++i)
|
for(int i = 0; i < refBaseLevel.GetNumVertices(); ++i)
|
||||||
{
|
{
|
||||||
@ -762,14 +802,24 @@ struct PipelineConfig {
|
|||||||
_vertexData[i * numElements + 2] = _shape->verts[i * 3 + 2];
|
_vertexData[i * numElements + 2] = _shape->verts[i * 3 + 2];
|
||||||
}
|
}
|
||||||
|
|
||||||
for(auto vertexIdx = 0; vertexIdx < refBaseLevel.GetNumVertices(); ++vertexIdx)
|
// compute model bounding
|
||||||
{
|
float min[3] = { FLT_MAX, FLT_MAX, FLT_MAX};
|
||||||
_meshCenter[0] += _vertexData[vertexIdx * numElements + 0];
|
float max[3] = {-FLT_MAX,-FLT_MAX,-FLT_MAX};
|
||||||
_meshCenter[1] += _vertexData[vertexIdx * numElements + 1];
|
for (int i = 0; i < refBaseLevel.GetNumVertices(); ++i) {
|
||||||
_meshCenter[2] += _vertexData[vertexIdx * numElements + 2];
|
for (int j = 0; j < 3; ++j) {
|
||||||
|
float v = _vertexData[i*numElements+j];
|
||||||
|
min[j] = std::min(min[j], v);
|
||||||
|
max[j] = std::max(max[j], v);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_meshCenter /= (_shape->verts.size() / 3);
|
_meshSize = 0.0f;
|
||||||
|
for (int j = 0; j < 3; ++j) {
|
||||||
|
_meshCenter[j] = (min[j] + max[j]) * 0.5f;
|
||||||
|
_meshSize += (max[j]-min[j])*(max[j]-min[j]);
|
||||||
|
}
|
||||||
|
_meshSize = sqrt(_meshSize);
|
||||||
|
|
||||||
_mesh->UpdateVertexBuffer(_vertexData.data(), 0, refBaseLevel.GetNumVertices());
|
_mesh->UpdateVertexBuffer(_vertexData.data(), 0, refBaseLevel.GetNumVertices());
|
||||||
_mesh->Refine();
|
_mesh->Refine();
|
||||||
_mesh->Synchronize();
|
_mesh->Synchronize();
|
||||||
@ -1306,14 +1356,15 @@ struct PipelineConfig {
|
|||||||
translate(pData->ModelViewMatrix, 0, 0, -_cameraData.dollyDistance);
|
translate(pData->ModelViewMatrix, 0, 0, -_cameraData.dollyDistance);
|
||||||
rotate(pData->ModelViewMatrix, _cameraData.rotationY, 1, 0, 0);
|
rotate(pData->ModelViewMatrix, _cameraData.rotationY, 1, 0, 0);
|
||||||
rotate(pData->ModelViewMatrix, _cameraData.rotationX, 0, 1, 0);
|
rotate(pData->ModelViewMatrix, _cameraData.rotationX, 0, 1, 0);
|
||||||
rotate(pData->ModelViewMatrix, -90, 1, 0, 0); // z-up model
|
if (!_yup) {
|
||||||
|
rotate(pData->ModelViewMatrix, -90, 1, 0, 0);
|
||||||
|
}
|
||||||
translate(pData->ModelViewMatrix, -_meshCenter[0], -_meshCenter[1], -_meshCenter[2]);
|
translate(pData->ModelViewMatrix, -_meshCenter[0], -_meshCenter[1], -_meshCenter[2]);
|
||||||
inverseMatrix(pData->ModelViewInverseMatrix, pData->ModelViewMatrix);
|
inverseMatrix(pData->ModelViewInverseMatrix, pData->ModelViewMatrix);
|
||||||
|
|
||||||
identity(pData->ProjectionMatrix);
|
identity(pData->ProjectionMatrix);
|
||||||
perspective(pData->ProjectionMatrix, 45.0, _cameraData.aspectRatio, 0.01f, 500.0);
|
perspective(pData->ProjectionMatrix, 45.0, _cameraData.aspectRatio, 0.01f, 500.0);
|
||||||
multMatrix(pData->ModelViewProjectionMatrix, pData->ModelViewMatrix, pData->ProjectionMatrix);
|
multMatrix(pData->ModelViewProjectionMatrix, pData->ModelViewMatrix, pData->ProjectionMatrix);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
-(void)_initializeBuffers {
|
-(void)_initializeBuffers {
|
||||||
@ -1322,9 +1373,9 @@ struct PipelineConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
-(void)_initializeCamera {
|
-(void)_initializeCamera {
|
||||||
_cameraData.dollyDistance = 4;
|
|
||||||
_cameraData.rotationY = 0;
|
_cameraData.rotationY = 0;
|
||||||
_cameraData.rotationX = 0;
|
_cameraData.rotationX = 0;
|
||||||
|
_cameraData.dollyDistance = 5;
|
||||||
_cameraData.aspectRatio = 1;
|
_cameraData.aspectRatio = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user