// //MultiColoredTriangleShader.cpp //Copyright (c) 2016 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED. #include <oz++/opengl/OpenGLMainView.h> #include <oz++/opengl/OpenGLView.h> #include <oz++/opengl/OpenGLGC.h> #include <oz++/opengl/OpenGLArrayBuffer.h> #include <oz++/opengl/OpenGLVertex3.h> #include <oz++/opengl/OpenGLClientState.h> #include <oz++/opengl2/OpenGLVertexShader.h> #include <oz++/opengl2/OpenGLFragmentShader.h> #include <oz++/opengl2/OpenGLProgram.h> #include <oz++/opengl2/OpenGLVertexAttribute.h> #include <oz++/opengl2/OpenGLUniform.h> namespace OZ { class MainView :public OpenGLMainView { private: //Inner class starts. class SimpleView: public OpenGLView { private: OpenGLGC gc; SmartPtr<OpenGLProgram> program; public: virtual void display() { if (program) { gc.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); gc.loadIdentity(); gc.clearColor(1.0f, 1.0f, 1.0f, 1.0f); try { program -> use(); OpenGLClientState clientState(GL_VERTEX_ARRAY); struct Coord2Color3 { GLfloat coord[2]; GLfloat color[3]; }; Coord2Color3 triangles[] = { {{ 0.0, 0.5}, { 1.0, 1.0, 0.0}}, {{-0.5, -0.5}, { 0.0, 0.0, 1.0}}, {{ 0.5, -0.5}, { 1.0, 0.0, 0.0}}, }; OpenGLArrayBuffer buffer; buffer.bind(); buffer.data(sizeof(triangles), triangles, GL_STATIC_DRAW); OpenGLVertexAttribute coord(program->getAttributeLocation("coord2d")); OpenGLVertexAttribute vcolor(program->getAttributeLocation("v_color")); coord.setPointer(2, GL_FLOAT, GL_FALSE, sizeof(Coord2Color3), 0); vcolor.setPointer(3, GL_FLOAT, GL_FALSE, sizeof(Coord2Color3), (GLvoid*) (2 * sizeof(GLfloat)) ); gc.drawArrays(GL_TRIANGLES, 0, SizeOf(triangles)); buffer.unbind(); } catch (Exception& ex) { caught(ex); } } } virtual void resize(int w, int h) { if (w == 0 || h == 0) { return; } gc.matrixMode(GL_PROJECTION); gc.loadIdentity(); gc.perspective(16.0, (double)w / (double)h, 0.5, 40.0); gc.matrixMode(GL_MODELVIEW); } virtual void initialize() { gc.matrixMode(GL_PROJECTION); gc.loadIdentity(); gc.enable( GL_DEPTH_TEST ); gc.frustum(1 , -1 , -1 , 1 , 1 , 10); try { OpenGLVertexShader vertexShader("vertexShader.glsl"); OpenGLFragmentShader fragmentShader("fragmentShader.glsl"); program = new OpenGLProgram(); program -> attachShader(vertexShader); program -> attachShader(fragmentShader); program -> link(); program -> detachShader(vertexShader); program -> detachShader(fragmentShader); } catch (Exception& ex) { caught(ex); } } public: SimpleView(OpenGLMainView* parent, const char* name, Args& args) :OpenGLView(parent, name, args) { } ~SimpleView() { } }; //Inner class ends. private: SmartPtr<SimpleView> view; public: MainView(OpenGLApplication& applet, const char* name, Args& args) :OpenGLMainView(applet, name, args) { Args ar; ar.set(XmNopenGLBufferType, (XtArgVal)getBufferType()); view = new SimpleView(this, "", ar); } ~MainView() { } }; } // int main(int argc, char** argv) { try { const char* name = argv[0]; OpenGLApplication applet(name, argc, argv); Args args; args.set(XmNwidth, 480); args.set(XmNheight, 400); MainView view(applet, name, args); view.realize(); applet.run(); } catch (Exception& ex) { caught(ex); } return 0; } |