func GetShaderInfoLog(shader uint32) string { var logSize int32 = 0 gl.GetShaderiv(shader, gl.INFO_LOG_LENGTH, &logSize) var infoLog []uint8 = make([]uint8, logSize) gl.GetShaderInfoLog(shader, logSize, &logSize, &infoLog[0]) return gl.GoStr(&infoLog[0]) }
func CreateContext(width int, height int) (*Context, error) { if err := glfw.Init(); err != nil { fmt.Println("failed to initialize glfw:", err) } glfw.WindowHint(glfw.Resizable, glfw.False) glfw.WindowHint(glfw.ContextVersionMajor, 4) glfw.WindowHint(glfw.ContextVersionMinor, 1) glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) glfw.WindowHint(glfw.OpenGLForwardCompatible, glfw.True) window, err := glfw.CreateWindow(width, height, "flamingo", nil, nil) if err != nil { glfw.Terminate() return nil, err } window.MakeContextCurrent() // Initialize Glow if err = gl.Init(); err != nil { glfw.Terminate() return nil, err } version := gl.GoStr(gl.GetString(gl.VERSION)) fmt.Println("OpenGL version", version) return &Context{window}, nil }
func (p *Program) GetProgramInfoLog() string { var logSize int32 = 0 gl.GetProgramiv(p.prog, gl.INFO_LOG_LENGTH, &logSize) var infoLog []uint8 = make([]uint8, logSize) gl.GetProgramInfoLog(p.prog, logSize, &logSize, &infoLog[0]) return gl.GoStr(&infoLog[0]) }
func initGL() string { // Initialize Glow if err := gl.Init(); err != nil { panic(err) } version := gl.GoStr(gl.GetString(gl.VERSION)) fmt.Println("OpenGL version", version) fmt.Println("OpenGl shading version", gl.GoStr(gl.GetString(gl.SHADING_LANGUAGE_VERSION))) fmt.Println("OpenGl renderer", gl.GoStr(gl.GetString(gl.RENDERER))) // Configure global settings gl.Enable(gl.DEPTH_TEST) gl.DepthFunc(gl.LESS) gl.ClearColor(0.5, 0.5, 0.5, 1.0) return version }
func Run() { if err := glfw.Init(); err != nil { glog.Fatalln("failed to initialize glfw", err) } defer glfw.Terminate() setupWindowOptions() window, err := glfw.CreateWindow(WindowWidth, WindowHeight, "Game", nil, nil) if err != nil { panic(err) } window.MakeContextCurrent() //initilize Glow if err := gl.Init(); err != nil { panic(err) } version := gl.GoStr(gl.GetString(gl.VERSION)) fmt.Println("OpenGL version", version) shaderSource, err := ReadShaders("colorShader") if err != nil { panic(err) } program, err := NewProgram(shaderSource) if err != nil { panic(err) } program.Use() sprite := &SpriteComponent{-.5, -.5, 1, 1} sprite.ReloadGraphics() vertAttrib := uint32(gl.GetAttribLocation(program.program, CStr("vertPosition"))) gl.EnableVertexAttribArray(vertAttrib) gl.VertexAttribPointer(vertAttrib, 3, gl.FLOAT, false, 0, gl.PtrOffset(0)) gl.Enable(gl.DEPTH_TEST) gl.DepthFunc(gl.LESS) gl.ClearColor(1.0, 1.0, 1.0, 1.0) for !window.ShouldClose() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) program.Use() gl.BindVertexArray(sprite.vaoID) gl.DrawArrays(gl.TRIANGLES, 0, 2*3) window.SwapBuffers() glfw.PollEvents() } }
// New returns a newly created Screen func New(width int, height int, fullscreen bool, FSAA int, name string) *Screen { window := &Screen{} C.SDL_Init(C.SDL_INIT_VIDEO) C.setGlContextAttributes() C.SDL_GL_SetAttribute(C.SDL_GL_DOUBLEBUFFER, 1) // Force hardware accel C.SDL_GL_SetAttribute(C.SDL_GL_ACCELERATED_VISUAL, 1) if FSAA > 0 { // FSAA (Fullscreen antialiasing) C.SDL_GL_SetAttribute(C.SDL_GL_MULTISAMPLEBUFFERS, 1) C.SDL_GL_SetAttribute(C.SDL_GL_MULTISAMPLESAMPLES, C.int(FSAA)) // 2, 4, 8 } flags := C.SDL_WINDOW_OPENGL | C.SDL_RENDERER_ACCELERATED if fullscreen { flags = flags | C.SDL_WINDOW_FULLSCREEN } C.SDL_CreateWindowAndRenderer(C.int(width), C.int(height), C.Uint32(flags), &window.sdlWindow, &window.renderer) C.SDL_SetWindowTitle(window.sdlWindow, C.CString(name)) C.SDL_GL_CreateContext(window.sdlWindow) if err := gl.Init(); err != nil { panic(err) } version := gl.GoStr(gl.GetString(gl.VERSION)) fmt.Println("OpenGL version", version) // Configure global settings gl.Enable(gl.BLEND) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) gl.ClearColor(0.0, 0.0, 0.0, 1.0) gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) window.Width = width window.Height = height window.name = name window.shouldClose = false C.SDL_GL_SwapWindow(window.sdlWindow) window.startTime = time.Now() window.frameTime = time.Now() C.SDL_GL_SetSwapInterval(1) window.vsync = true return window }
func getGlError(glHandle uint32, checkTrueParam uint32, getObjIvFn getObjIv, getObjInfoLogFn getObjInfoLog, failMsg string) error { var success int32 getObjIvFn(glHandle, checkTrueParam, &success) if success == gl.FALSE { var logLength int32 getObjIvFn(glHandle, gl.INFO_LOG_LENGTH, &logLength) log := gl.Str(strings.Repeat("\x00", int(logLength))) getObjInfoLogFn(glHandle, logLength, nil, log) return fmt.Errorf("%s: %s", failMsg, gl.GoStr(log)) } return nil }
func (screen *Screen) Init(title string, onCloseHandler func(), chip *chip8.Chip8) { var err error screen.chip = chip err = glfw.Init() if err != nil { panic(err) } window, err := glfw.CreateWindow(SCREEN_WIDTH, SCREEN_HEIGHT, title, nil, nil) if err != nil { panic(err) } window.MakeContextCurrent() // Initialize Glow if err := gl.Init(); err != nil { panic(err) } version := gl.GoStr(gl.GetString(gl.VERSION)) fmt.Println("OpenGL version", version) gl.ClearColor(255.0, 0.0, 0.0, 0.0) //Set the cleared screen colour to black gl.Viewport(0, 0, int32(SCREEN_WIDTH), int32(SCREEN_HEIGHT)) //This sets up the viewport so that the coordinates (0, 0) are at the top left of the window for !window.ShouldClose() { // Do OpenGL stuff gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) window.SwapBuffers() glfw.PollEvents() } onCloseHandler() }
/* ***************** MAIN FUNCTION ************************ */ func main() { /* **************** OVR INIT CODE ***************** */ if err := glfw.Init(); err != nil { log.Fatalln("failed to initialize glfw") } defer glfw.Terminate() C.ovr_Initialize(nil) //create an HMD for reference. var hmd C.ovrHmd = nil // find number of headsets hmdCount := (int)(C.ovrHmd_Detect()) // print headset count fmt.Println(hmdCount) fmt.Printf("Found %d connected Rift device(s)\n\n", hmdCount) // grab the first headset if hmdCount > 0 { for i := 0; i < 1; i++ { hmd = C.ovrHmd_Create((C.int)(i)) //Print headset name fmt.Println(C.GoString(hmd.ProductName)) } } //if there is no headset connected, create a new debug. if hmd == nil { fmt.Println("Unable to open rift device\n Creating debug device.\n") hmd = C.ovrHmd_CreateDebug(C.ovrHmd_DK2) } //Starts the sensor device if C.ovrHmd_ConfigureTracking(hmd, C.ovrTrackingCap_Orientation|C.ovrTrackingCap_Position, 0) == 0 { fmt.Println("Unable to start Rift head tracker\n") } //extendedMode := C.ovrHmdCap_ExtendDesktop & hmd.HmdCaps //positioning of window and size of window var outposition mgl32.Vec2 outposition[0] = (float32)(hmd.WindowsPos.x) outposition[1] = (float32)(hmd.WindowsPos.y) //TODO: Change this to output at chosen resolution, not necessarily native pg. 76 Oculus Rift in action var outsize mgl32.Vec2 outsize[0] = (float32)(hmd.Resolution.w) outsize[1] = (float32)(hmd.Resolution.h) //print position and sizes to console fmt.Printf("Rift position:\t\t %f \t %f \nRift Size:\t\t %f \t %f \n\n", outposition.X(), outposition.Y(), outsize.X(), outsize.Y()) monitors := glfw.GetMonitors() var riftIndex int //loop over the monitors for index, element := range monitors { //print the monitor positions posX, posY := element.GetPos() fmt.Printf("Monitor Position:\t\t %d \t %d\n", posX, posY) if float32(posX) == outposition.X() && float32(posY) == outposition.Y() { riftIndex = index } } //Get video mode of monitor mode := monitors[riftIndex].GetVideoMode() outsize[0] = float32(mode.Width) outsize[1] = float32(mode.Height) /* ***************************************************** */ // ************* OPENGL / GLFW INIT CODE ************** */ glfw.WindowHint(glfw.Decorated, 0) glfw.WindowHint(glfw.Resizable, glfw.False) glfw.WindowHint(glfw.ContextVersionMajor, 4) glfw.WindowHint(glfw.ContextVersionMinor, 1) glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) glfw.WindowHint(glfw.OpenGLForwardCompatible, glfw.True) window, err := glfw.CreateWindow(int(outsize.X()), int(outsize.Y()), "LinuxVR", nil, nil) window.SetPos(int(outposition.X()), int(outposition.Y())) if gl.Init(); err != nil { panic(err) } window.MakeContextCurrent() //Print OpenGL Version to console version := gl.GoStr(gl.GetString(gl.VERSION)) fmt.Println("OpenGL Version", version, "\n\n") //keyboard input callback window.SetKeyCallback(onKey) /* **************************************************** */ previousTime := glfw.GetTime() totalTime := 0.0000 /* ******************* MAIN LOOP ******************** */ for !window.ShouldClose() { glfw.PollEvents() //Update time := glfw.GetTime() elapsed := time - previousTime previousTime = time totalTime = totalTime + elapsed //get current head state state := C.ovrHmd_GetTrackingState(hmd, 0) orientation := state.HeadPose.ThePose.Orientation //convert to go type float32 var q mgl32.Quat q.W = (float32)(orientation.w) q.V[0] = (float32)(orientation.x) q.V[1] = (float32)(orientation.y) q.V[2] = (float32)(orientation.z) //publish tracking information once a second if totalTime >= 1 { fmt.Printf("w: %f X: %f Y: %f Z: %f\n", q.W, q.X(), q.Y(), q.Z()) totalTime = 0 } //basic opengl things draw(window) //Swap buffers window.SwapBuffers() //Poll for events (keyboard, resize, etc) } /* ***************** OVR SHUTDOWN ******************** */ C.ovrHmd_Destroy(hmd) C.ovr_Shutdown() }
func main() { if err := glfw.Init(); err != nil { log.Fatalln("failed to initialize glfw:", err) } defer glfw.Terminate() glfw.WindowHint(glfw.Resizable, glfw.False) glfw.WindowHint(glfw.ContextVersionMajor, 4) glfw.WindowHint(glfw.ContextVersionMinor, 1) glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) glfw.WindowHint(glfw.OpenGLForwardCompatible, glfw.True) window, err := glfw.CreateWindow(windowWidth, windowHeight, "Cube", nil, nil) if err != nil { panic(err) } window.MakeContextCurrent() // Initialize Glow if err := gl.Init(); err != nil { panic(err) } version := gl.GoStr(gl.GetString(gl.VERSION)) fmt.Println("OpenGL version", version) // Configure the vertex and fragment shaders program, err := newProgram(vertexShader, fragmentShader) if err != nil { panic(err) } gl.UseProgram(program) projection := mgl32.Perspective(mgl32.DegToRad(45.0), float32(windowWidth)/windowHeight, 0.1, 10.0) projectionUniform := gl.GetUniformLocation(program, gl.Str("projection\x00")) gl.UniformMatrix4fv(projectionUniform, 1, false, &projection[0]) camera := mgl32.LookAtV(mgl32.Vec3{3, 3, 3}, mgl32.Vec3{0, 0, 0}, mgl32.Vec3{0, 1, 0}) cameraUniform := gl.GetUniformLocation(program, gl.Str("camera\x00")) gl.UniformMatrix4fv(cameraUniform, 1, false, &camera[0]) model := mgl32.Ident4() modelUniform := gl.GetUniformLocation(program, gl.Str("model\x00")) gl.UniformMatrix4fv(modelUniform, 1, false, &model[0]) textureUniform := gl.GetUniformLocation(program, gl.Str("tex\x00")) gl.Uniform1i(textureUniform, 0) gl.BindFragDataLocation(program, 0, gl.Str("outputColor\x00")) // Load the texture texture, err := newTexture("square.png") if err != nil { panic(err) } // Configure the vertex data var vao uint32 gl.GenVertexArrays(1, &vao) gl.BindVertexArray(vao) var vbo uint32 gl.GenBuffers(1, &vbo) gl.BindBuffer(gl.ARRAY_BUFFER, vbo) gl.BufferData(gl.ARRAY_BUFFER, len(cubeVertices)*4, gl.Ptr(cubeVertices), gl.STATIC_DRAW) vertAttrib := uint32(gl.GetAttribLocation(program, gl.Str("vert\x00"))) gl.EnableVertexAttribArray(vertAttrib) gl.VertexAttribPointer(vertAttrib, 3, gl.FLOAT, false, 5*4, gl.PtrOffset(0)) texCoordAttrib := uint32(gl.GetAttribLocation(program, gl.Str("vertTexCoord\x00"))) gl.EnableVertexAttribArray(texCoordAttrib) gl.VertexAttribPointer(texCoordAttrib, 2, gl.FLOAT, false, 5*4, gl.PtrOffset(3*4)) // Configure global settings gl.Enable(gl.DEPTH_TEST) gl.DepthFunc(gl.LESS) gl.ClearColor(1.0, 1.0, 1.0, 1.0) angle := 0.0 previousTime := glfw.GetTime() for !window.ShouldClose() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) // Update time := glfw.GetTime() elapsed := time - previousTime previousTime = time angle += elapsed model = mgl32.HomogRotate3D(float32(angle), mgl32.Vec3{0, 1, 0}) // Render gl.UseProgram(program) gl.UniformMatrix4fv(modelUniform, 1, false, &model[0]) gl.BindVertexArray(vao) gl.ActiveTexture(gl.TEXTURE0) gl.BindTexture(gl.TEXTURE_2D, texture) gl.DrawArrays(gl.TRIANGLES, 0, 6*2*3) // Maintenance window.SwapBuffers() glfw.PollEvents() } }
func Main() { err := glfw.Init() if err != nil { panic(err) } defer glfw.Terminate() glfw.WindowHint(glfw.Resizable, glfw.False) glfw.WindowHint(glfw.ContextVersionMajor, 3) glfw.WindowHint(glfw.ContextVersionMinor, 2) glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) glfw.WindowHint(glfw.OpenGLForwardCompatible, glfw.True) window, err := glfw.CreateWindow(WindowWidth, WindowHeight, "Cube", nil, nil) Window = window if err != nil { panic(err) } window.MakeContextCurrent() // Initialize Glow if err := gl.Init(); err != nil { panic(err) } version := gl.GoStr(gl.GetString(gl.VERSION)) fmt.Println("OpenGL version", version) // Configure the vertex and fragment shaders program, err := newProgram("SimpleVertexShader.vertexshader", "SimpleFragmentShader.fragmentshader") if err != nil { panic(err) } gl.UseProgram(program) projection := mgl32.Perspective(mgl32.DegToRad(45.0), float32(WindowWidth)/WindowHeight, 0.1, 10.0) projectionUniform := gl.GetUniformLocation(program, gl.Str("projection\x00")) gl.UniformMatrix4fv(projectionUniform, 1, false, &projection[0]) camera := mgl32.LookAtV(mgl32.Vec3{3, 3, 3}, mgl32.Vec3{0, 0, 0}, mgl32.Vec3{0, 1, 0}) cameraUniform := gl.GetUniformLocation(program, gl.Str("camera\x00")) gl.UniformMatrix4fv(cameraUniform, 1, false, &camera[0]) model := mgl32.Ident4() modelUniform := gl.GetUniformLocation(program, gl.Str("model\x00")) gl.UniformMatrix4fv(modelUniform, 1, false, &model[0]) textureUniform := gl.GetUniformLocation(program, gl.Str("tex\x00")) gl.Uniform1i(textureUniform, 0) gl.BindFragDataLocation(program, 0, gl.Str("outputColor\x00")) // Configure global settings gl.Enable(gl.DEPTH_TEST) gl.DepthFunc(gl.LESS) gl.ClearColor(1.0, 1.0, 1.0, 1.0) angle := 0.0 previousTime := glfw.GetTime() width, height := window.GetSize() window.SetCursorPos(float64(width/2), float64(height/2)) window.SetKeyCallback(input.OnKey) window.SetCursorPosCallback(input.OnCursor) window.SetMouseButtonCallback(input.OnMouse) meshes.LoadColladaCube("cube.dae") for !player.ShouldClose { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) // Update time := glfw.GetTime() elapsed := time - previousTime previousTime = time angle += elapsed model = mgl32.HomogRotate3D(float32(angle), mgl32.Vec3{0, 1, 0}) // Render gl.UseProgram(program) // gl.UniformMatrix4fv(modelUniform, 1, false, &model[0]) player.MainPlayer.Draw(program) for _, element := range game.Universe { (element).Draw(program) } // Maintenance window.SwapBuffers() glfw.PollEvents() } }
func printOpenGlVersionInfo() { fmt.Printf("%s\n", gl.GoStr(gl.GetString(gl.RENDERER))) fmt.Printf("%s\n", gl.GoStr(gl.GetString(gl.VERSION))) }