mirror of
https://github.com/PixarAnimationStudios/OpenSubdiv
synced 2024-11-15 00:11:07 +00:00
Updated simpleCpu to use GLFW for all platforms
This commit is contained in:
parent
5a7e33a792
commit
e9b29cda95
@ -97,21 +97,12 @@ foreach(shader_file ${SHADER_FILES})
|
|||||||
)
|
)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
if(APPLE)
|
_add_glfw_executable(simpleCpu
|
||||||
_add_glfw_executable(simpleCpu
|
main.cpp
|
||||||
mainApple.mm
|
simpleCpuSubdivision.cpp
|
||||||
simpleCpuSubdivision.cpp
|
${SHADER_FILES}
|
||||||
${SHADER_FILES}
|
${INC_FILES}
|
||||||
${INC_FILES}
|
)
|
||||||
)
|
|
||||||
else()
|
|
||||||
_add_glfw_executable(simpleCpu
|
|
||||||
simpleCpuSubdivision.cpp
|
|
||||||
mainGlfw.cpp
|
|
||||||
${SHADER_FILES}
|
|
||||||
${INC_FILES}
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
target_link_libraries(simpleCpu
|
target_link_libraries(simpleCpu
|
||||||
${PLATFORM_LIBRARIES}
|
${PLATFORM_LIBRARIES}
|
||||||
|
158
examples/simpleCpu/main.cpp
Normal file
158
examples/simpleCpu/main.cpp
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
#include <OpenGL/gl3.h>
|
||||||
|
#define GLFW_INCLUDE_GL3
|
||||||
|
#define GLFW_NO_GLU
|
||||||
|
#include <stdio.h>
|
||||||
|
#else
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <GL/glew.h>
|
||||||
|
#if defined(WIN32)
|
||||||
|
#include <GL/wglew.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(GLFW_VERSION_3)
|
||||||
|
#include <GL/glfw3.h>
|
||||||
|
GLFWwindow* g_window=0;
|
||||||
|
GLFWmonitor* g_primary=0;
|
||||||
|
#else
|
||||||
|
#include <GL/glfw.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern void initOsd();
|
||||||
|
extern void updateGeom();
|
||||||
|
extern void display();
|
||||||
|
extern int g_width, g_height, g_frame;
|
||||||
|
|
||||||
|
static bool g_running = true;
|
||||||
|
|
||||||
|
static void
|
||||||
|
setGLCoreProfile()
|
||||||
|
{
|
||||||
|
#if GLFW_VERSION_MAJOR>=3
|
||||||
|
#define glfwOpenWindowHint glfwWindowHint
|
||||||
|
#define GLFW_OPENGL_VERSION_MAJOR GLFW_CONTEXT_VERSION_MAJOR
|
||||||
|
#define GLFW_OPENGL_VERSION_MINOR GLFW_CONTEXT_VERSION_MINOR
|
||||||
|
#endif
|
||||||
|
|
||||||
|
glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||||
|
#if not defined(__APPLE__)
|
||||||
|
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 4);
|
||||||
|
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2);
|
||||||
|
glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
|
||||||
|
#else
|
||||||
|
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3);
|
||||||
|
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// ### Misc. GLFW Callback Methods
|
||||||
|
|
||||||
|
// Reshape is called when the window is resized, here we need the width and
|
||||||
|
// height so that we can correctly adjust the aspect ratio of the projection
|
||||||
|
// matrix.
|
||||||
|
//
|
||||||
|
void
|
||||||
|
#if GLFW_VERSION_MAJOR>=3
|
||||||
|
reshape(GLFWwindow *, int width, int height) {
|
||||||
|
#else
|
||||||
|
reshape(int width, int height) {
|
||||||
|
#endif
|
||||||
|
g_width = width;
|
||||||
|
g_height = height;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if GLFW_VERSION_MAJOR>=3
|
||||||
|
int windowClose(GLFWwindow*) {
|
||||||
|
#else
|
||||||
|
int windowClose() {
|
||||||
|
#endif
|
||||||
|
g_running = false;
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Idle is called between frames, here we advance the frame number and update
|
||||||
|
// the procedural animation that is being applied to the mesh
|
||||||
|
//
|
||||||
|
void
|
||||||
|
idle()
|
||||||
|
{
|
||||||
|
g_frame++;
|
||||||
|
updateGeom();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char ** argv)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Setup GLFW, glew and some initial GL state
|
||||||
|
//
|
||||||
|
static const char windowTitle[] = "CPU Subdivision Example";
|
||||||
|
|
||||||
|
if (not glfwInit()) {
|
||||||
|
printf("Failed to initialize GLFW\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
setGLCoreProfile();
|
||||||
|
|
||||||
|
#if GLFW_VERSION_MAJOR>=3
|
||||||
|
if (not (g_window=glfwCreateWindow(g_width, g_height, windowTitle, NULL, NULL))) {
|
||||||
|
printf("Failed to open window.\n");
|
||||||
|
glfwTerminate();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
glfwMakeContextCurrent(g_window);
|
||||||
|
glfwSetWindowSizeCallback(g_window, reshape);
|
||||||
|
#else
|
||||||
|
if (glfwOpenWindow(g_width, g_height, 8, 8, 8, 8, 24, 8, GLFW_WINDOW) == GL_FALSE) {
|
||||||
|
printf("Failed to open window.\n");
|
||||||
|
glfwTerminate();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
glfwSetWindowTitle(windowTitle);
|
||||||
|
glfwSetWindowSizeCallback(reshape);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
glfwSetWindowCloseCallback(windowClose);
|
||||||
|
|
||||||
|
|
||||||
|
#if not defined(__APPLE__)
|
||||||
|
#ifdef CORE_PROFILE
|
||||||
|
// this is the only way to initialize glew correctly under core profile context.
|
||||||
|
glewExperimental = true;
|
||||||
|
#endif
|
||||||
|
if (GLenum r = glewInit() != GLEW_OK) {
|
||||||
|
printf("Failed to initialize glew. Error = %s\n", glewGetErrorString(r));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
#ifdef CORE_PROFILE
|
||||||
|
// clear GL errors which was generated during glewInit()
|
||||||
|
glGetError();
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
initOsd();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Start the main glut drawing loop
|
||||||
|
//
|
||||||
|
while (g_running) {
|
||||||
|
idle();
|
||||||
|
display();
|
||||||
|
|
||||||
|
#if GLFW_VERSION_MAJOR>=3
|
||||||
|
glfwPollEvents();
|
||||||
|
glfwSwapBuffers(g_window);
|
||||||
|
#else
|
||||||
|
glfwSwapBuffers();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
glFinish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,176 +0,0 @@
|
|||||||
#import <Cocoa/Cocoa.h>
|
|
||||||
#import <OpenGL/OpenGL.h>
|
|
||||||
#import <OpenGL/glu.h>
|
|
||||||
#import <wchar.h>
|
|
||||||
#import <iostream>
|
|
||||||
//
|
|
||||||
// Hooks back into the example code
|
|
||||||
//
|
|
||||||
extern void initOsd();
|
|
||||||
extern void updateGeom();
|
|
||||||
extern void display();
|
|
||||||
|
|
||||||
//
|
|
||||||
// Shared global state from the example
|
|
||||||
//
|
|
||||||
extern int g_width, g_height, g_frame;
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// OSX application bootstrap
|
|
||||||
//
|
|
||||||
@class View;
|
|
||||||
|
|
||||||
@interface View : NSOpenGLView <NSWindowDelegate> {
|
|
||||||
NSRect m_frameRect;
|
|
||||||
BOOL m_didInit;
|
|
||||||
uint64_t m_previousTime;
|
|
||||||
NSTimer* m_timer;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) animate;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation View
|
|
||||||
|
|
||||||
-(void)windowWillClose:(NSNotification *)note
|
|
||||||
{
|
|
||||||
[[NSApplication sharedApplication] terminate:self];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) timerFired:(NSTimer*) timer
|
|
||||||
{
|
|
||||||
[self animate];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (id) initWithFrame: (NSRect) frame
|
|
||||||
{
|
|
||||||
m_didInit = FALSE;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Various GL state, of note is the 3.2 Core profile selection
|
|
||||||
// and 8x antialiasing, which we might want to disable for performance
|
|
||||||
//
|
|
||||||
int attribs[] = {
|
|
||||||
NSOpenGLPFAAccelerated,
|
|
||||||
NSOpenGLPFADoubleBuffer,
|
|
||||||
NSOpenGLPFADepthSize, 24,
|
|
||||||
NSOpenGLPFAAlphaSize, 8,
|
|
||||||
NSOpenGLPFAColorSize, 32,
|
|
||||||
NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,
|
|
||||||
NSOpenGLPFANoRecovery,
|
|
||||||
kCGLPFASampleBuffers, 1,
|
|
||||||
kCGLPFASamples, 8,
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
NSOpenGLPixelFormat *fmt = [[NSOpenGLPixelFormat alloc]
|
|
||||||
initWithAttributes:(NSOpenGLPixelFormatAttribute*) attribs];
|
|
||||||
|
|
||||||
self = [self initWithFrame:frame pixelFormat:fmt];
|
|
||||||
[fmt release];
|
|
||||||
m_frameRect = frame;
|
|
||||||
m_timer = [[NSTimer
|
|
||||||
scheduledTimerWithTimeInterval:1.0f/120.0f
|
|
||||||
target:self
|
|
||||||
selector:@selector(timerFired:)
|
|
||||||
userInfo:nil
|
|
||||||
repeats:YES] retain];
|
|
||||||
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) drawRect:(NSRect) theRect
|
|
||||||
{
|
|
||||||
if (!m_didInit) {
|
|
||||||
initOsd();
|
|
||||||
|
|
||||||
m_didInit = YES;
|
|
||||||
|
|
||||||
[[self window] setLevel: NSFloatingWindowLevel];
|
|
||||||
[[self window] makeKeyAndOrderFront: self];
|
|
||||||
[[self window] setTitle: [NSString stringWithUTF8String: "SimpleCPU"]];
|
|
||||||
}
|
|
||||||
|
|
||||||
// run the example code
|
|
||||||
display();
|
|
||||||
|
|
||||||
// make sure GL state is clean
|
|
||||||
assert(glGetError() == GL_NO_ERROR);
|
|
||||||
|
|
||||||
[[self openGLContext] flushBuffer];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) animate
|
|
||||||
{
|
|
||||||
g_frame++;
|
|
||||||
updateGeom();
|
|
||||||
[self display];
|
|
||||||
}
|
|
||||||
@end
|
|
||||||
|
|
||||||
int main(int argc, const char *argv[])
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// It seems that some ATI cards fall back to software when rendering geometry shaders
|
|
||||||
// but only *sometimes*. Post this notice so it's obvious that OSD isn't the problem.
|
|
||||||
//
|
|
||||||
// XXX(jcowles): we should only use vertex and fragment shaders to avoid this potential confusion
|
|
||||||
//
|
|
||||||
std::cout << "--------------------------------------------------------------------------------" << std::endl;
|
|
||||||
std::cout << "NOTICE: Some Apple hardware runs geometry shaders in software, which will cause" << std::endl;
|
|
||||||
std::cout << " this demo to run extremely slowly. That slowness is not related to OSD" << std::endl;
|
|
||||||
std::cout << " and can be avoided by not using OpenGL geometry shaders." << std::endl;
|
|
||||||
std::cout << "--------------------------------------------------------------------------------" << std::endl;
|
|
||||||
|
|
||||||
NSAutoreleasePool *pool = [NSAutoreleasePool new];
|
|
||||||
NSApplication *NSApp = [NSApplication sharedApplication];
|
|
||||||
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
|
|
||||||
|
|
||||||
id menubar = [[NSMenu new] autorelease];
|
|
||||||
id appMenuItem = [[NSMenuItem new] autorelease];
|
|
||||||
[menubar addItem:appMenuItem];
|
|
||||||
[NSApp setMainMenu:menubar];
|
|
||||||
|
|
||||||
id appMenu = [[NSMenu new] autorelease];
|
|
||||||
id appName = [[NSProcessInfo processInfo] processName];
|
|
||||||
id quitTitle = [@"Quit " stringByAppendingString:appName];
|
|
||||||
id quitMenuItem = [[[NSMenuItem alloc] initWithTitle:quitTitle
|
|
||||||
action:@selector(terminate:) keyEquivalent:@"q"] autorelease];
|
|
||||||
[appMenu addItem:quitMenuItem];
|
|
||||||
[appMenuItem setSubmenu:appMenu];
|
|
||||||
|
|
||||||
NSRect screenBounds = [[NSScreen mainScreen] frame];
|
|
||||||
|
|
||||||
g_width = 512;
|
|
||||||
g_height = 512;
|
|
||||||
NSRect viewBounds = NSMakeRect(0, 0, g_width, g_height);
|
|
||||||
|
|
||||||
View* view = [[View alloc] initWithFrame:viewBounds];
|
|
||||||
|
|
||||||
NSRect centered = NSMakeRect(NSMidX(screenBounds) - NSMidX(viewBounds),
|
|
||||||
NSMidY(screenBounds) - NSMidY(viewBounds),
|
|
||||||
viewBounds.size.width, viewBounds.size.height);
|
|
||||||
|
|
||||||
NSWindow *window = [[NSWindow alloc]
|
|
||||||
initWithContentRect:centered
|
|
||||||
styleMask:NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask
|
|
||||||
backing:NSBackingStoreBuffered
|
|
||||||
defer:NO];
|
|
||||||
|
|
||||||
[window setContentView:view];
|
|
||||||
[window setDelegate:view];
|
|
||||||
[window makeKeyAndOrderFront:nil];
|
|
||||||
[NSApp activateIgnoringOtherApps:YES];
|
|
||||||
|
|
||||||
[view release];
|
|
||||||
|
|
||||||
[NSApp run];
|
|
||||||
|
|
||||||
|
|
||||||
[pool release];
|
|
||||||
return EXIT_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,74 +0,0 @@
|
|||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <GL/glew.h>
|
|
||||||
#include <GL/glut.h>
|
|
||||||
|
|
||||||
extern void initOsd();
|
|
||||||
extern void updateGeom();
|
|
||||||
extern void display();
|
|
||||||
extern int g_width, g_height, g_frame;
|
|
||||||
|
|
||||||
//
|
|
||||||
// ### Misc. GLUT Callback Methods
|
|
||||||
|
|
||||||
// Reshape is called when the window is resized, here we need the width and
|
|
||||||
// height so that we can correctly adjust the aspect ratio of the projection
|
|
||||||
// matrix.
|
|
||||||
//
|
|
||||||
void
|
|
||||||
reshape(int width, int height)
|
|
||||||
{
|
|
||||||
g_width = width;
|
|
||||||
g_height = height;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Idle is called between frames, here we advance the frame number and update
|
|
||||||
// the procedural animation that is being applied to the mesh
|
|
||||||
//
|
|
||||||
void
|
|
||||||
idle()
|
|
||||||
{
|
|
||||||
g_frame++;
|
|
||||||
updateGeom();
|
|
||||||
glutPostRedisplay();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// ### Draw the Mesh
|
|
||||||
|
|
||||||
// Display handles all drawing per frame. We first call the setupForDisplay
|
|
||||||
// helper method to setup some uninteresting GL state and then bind the mesh
|
|
||||||
// using the buffers provided by our OSD objects
|
|
||||||
//
|
|
||||||
void
|
|
||||||
glutDisplay()
|
|
||||||
{
|
|
||||||
display();
|
|
||||||
glutSwapBuffers();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char ** argv)
|
|
||||||
{
|
|
||||||
glutInit(&argc, argv);
|
|
||||||
glutInitDisplayMode(GLUT_RGBA |GLUT_DOUBLE | GLUT_DEPTH);
|
|
||||||
glutInitWindowSize(1024, 1024);
|
|
||||||
glutCreateWindow("CPU Subdivision Example");
|
|
||||||
|
|
||||||
//
|
|
||||||
// Setup glut, glew and some initial GL state
|
|
||||||
//
|
|
||||||
glutDisplayFunc(glutDisplay);
|
|
||||||
glutReshapeFunc(reshape);
|
|
||||||
glewInit();
|
|
||||||
|
|
||||||
initOsd();
|
|
||||||
|
|
||||||
//
|
|
||||||
// Start the main glut drawing loop
|
|
||||||
//
|
|
||||||
glutIdleFunc(idle);
|
|
||||||
glutMainLoop();
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user