mirror of
https://github.com/gwm17/glfw.git
synced 2024-11-23 02:38:52 -05:00
Initial import of 2.7 Lite.
This commit is contained in:
parent
efef33c791
commit
3249f812d6
88
CMake/CheckX11Extensions.cmake
Normal file
88
CMake/CheckX11Extensions.cmake
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
# - Check if X11 RandR extension is available
|
||||||
|
# Check if the X11 extension RandR is available.
|
||||||
|
# This macro defines :
|
||||||
|
# - X11_RANDR_FOUND, If set to NO RandR is not available.
|
||||||
|
# - X11_RANDR_INCLUDE_DIR, includes directory containing the RandR header.
|
||||||
|
# - X11_RANDR_LIBRARIES, libraries to link in the library to use RandR.
|
||||||
|
#
|
||||||
|
# Created by Olivier Delannoy.
|
||||||
|
macro(CHECK_X11_XRANDR)
|
||||||
|
message(STATUS "Checking for X11 extension XRandR")
|
||||||
|
set(X11_XRANDR_FOUND "NO")
|
||||||
|
find_path(X11_XRANDR_INCLUDE_DIR "X11/extensions/Xrandr.h"
|
||||||
|
PATHS
|
||||||
|
/usr/local/include
|
||||||
|
/usr/local/X11/include
|
||||||
|
/usr/local/X11R6/include
|
||||||
|
/usr/include
|
||||||
|
/usr/X11/include
|
||||||
|
/usr/X11R6/include)
|
||||||
|
|
||||||
|
find_library(X11_XRANDR_LIBRARIES NAMES Xrandr
|
||||||
|
PATHS
|
||||||
|
/usr/local/lib
|
||||||
|
/usr/local/X11/lib
|
||||||
|
/usr/local/X11R6/lib
|
||||||
|
/usr/lib
|
||||||
|
/usr/X11/lib
|
||||||
|
/usr/X11R6/lib)
|
||||||
|
# Create check if file compiles with randr
|
||||||
|
|
||||||
|
if (X11_XRANDR_LIBRARIES AND X11_XRANDR_INCLUDE_DIR)
|
||||||
|
set(X11_XRANDR_FOUND "YES")
|
||||||
|
endif (X11_XRANDR_LIBRARIES AND X11_XRANDR_INCLUDE_DIR)
|
||||||
|
|
||||||
|
if (X11_XRANDR_FOUND)
|
||||||
|
message(STATUS "Checking for X11 extension XRandR -- found")
|
||||||
|
else (X11_XRANDR_FOUND)
|
||||||
|
message(STATUS "Checking for X11 extension XRandR -- not found")
|
||||||
|
endif (X11_XRANDR_FOUND)
|
||||||
|
|
||||||
|
mark_as_advanced(X11_XRANDR_LIBRARIES X11_XRANDR_INCLUDE_DIR)
|
||||||
|
endmacro(CHECK_X11_XRANDR)
|
||||||
|
|
||||||
|
|
||||||
|
# - Check if X11 VidMod extension is available
|
||||||
|
# Check if the X11 extension VidMod is available.
|
||||||
|
# This macro defines :
|
||||||
|
# - X11_VIDMOD_FOUND, If set to NO VidMod is not available.
|
||||||
|
# - X11_VIDMOD_INCLUDE_DIR, includes directory containing the headers.
|
||||||
|
# - X11_VIDMOD_LIBRARIES, libraries to link in the libraries.
|
||||||
|
#
|
||||||
|
# Created by Olivier Delannoy.
|
||||||
|
macro(CHECK_X11_XF86VIDMODE)
|
||||||
|
message(STATUS "Checking for X11 extension xf86vidmode")
|
||||||
|
set(X11_XF86VIDMODE_FOUND "NO")
|
||||||
|
find_path(X11_XF86VIDMODE_INCLUDE_DIR "X11/extensions/xf86vmode.h"
|
||||||
|
PATHS
|
||||||
|
/usr/local/include
|
||||||
|
/usr/local/X11/include
|
||||||
|
/usr/local/X11R6/include
|
||||||
|
/usr/include
|
||||||
|
/usr/X11/include
|
||||||
|
/usr/X11R6/include)
|
||||||
|
|
||||||
|
find_library(X11_XF86VIDMODE_LIBRARIES NAMES Xxf86vm PATHS
|
||||||
|
/usr/local/lib
|
||||||
|
/usr/local/X11/lib
|
||||||
|
/usr/local/X11R6/lib
|
||||||
|
/usr/lib
|
||||||
|
/usr/X11/lib
|
||||||
|
/usr/X11R6/lib)
|
||||||
|
# Add a test case here
|
||||||
|
if (X11_XF86VIDMODE_LIBRARIES AND X11_XF86VIDMODE_INCLUDE_DIR)
|
||||||
|
set(X11_XF86VIDMODE_FOUND "YES")
|
||||||
|
endif (X11_XF86VIDMODE_LIBRARIES AND X11_XF86VIDMODE_INCLUDE_DIR)
|
||||||
|
|
||||||
|
if (X11_XF86VIDMODE_FOUND)
|
||||||
|
message(STATUS "Checking for X11 extension xf86vidmode -- found")
|
||||||
|
else (X11_XF86VIDMODE_FOUND)
|
||||||
|
message(STATUS "Checking for X11 extension xf86vidmode -- not found")
|
||||||
|
endif(X11_XF86VIDMODE_FOUND)
|
||||||
|
|
||||||
|
mark_as_advanced(
|
||||||
|
X11_XF86VIDMODE_LIBRARIES
|
||||||
|
X11_XF86VIDMODE_INCLUDE_DIR
|
||||||
|
)
|
||||||
|
|
||||||
|
endmacro(CHECK_X11_XF86VIDMODE)
|
163
CMakeLists.txt
Normal file
163
CMakeLists.txt
Normal file
|
@ -0,0 +1,163 @@
|
||||||
|
project(GLFW C)
|
||||||
|
|
||||||
|
set(GLFW_VERSION_MAJOR "2")
|
||||||
|
set(GLFW_VERSION_MINOR "7")
|
||||||
|
set(GLFW_VERSION_PATCH "0")
|
||||||
|
set(GLFW_VERSION_EXTRA "")
|
||||||
|
set(GLFW_VERSION "${GLFW_VERSION_MAJOR}.${GLFW_VERSION_MINOR}")
|
||||||
|
set(GLFW_VERSION_FULL
|
||||||
|
"${GLFW_VERSION}.${GLFW_VERSION_PATCH}${GLFW_VERSION_EXTRA}")
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 2.4)
|
||||||
|
|
||||||
|
include(CheckFunctionExists)
|
||||||
|
include(CheckSymbolExists)
|
||||||
|
|
||||||
|
# Stuff common to all platform
|
||||||
|
find_package(OpenGL REQUIRED)
|
||||||
|
|
||||||
|
set(common_SOURCES
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/lib/enable.c
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/lib/fullscreen.c
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/lib/glext.c
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/lib/init.c
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/lib/input.c
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/lib/joystick.c
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/lib/time.c
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/lib/window.c
|
||||||
|
)
|
||||||
|
|
||||||
|
# Stuff specific to WGL on Win32
|
||||||
|
if (WIN32)
|
||||||
|
message(STATUS "Building GLFW for WGL on a Win32 system")
|
||||||
|
|
||||||
|
# Set up library and include paths
|
||||||
|
set(CMAKE_REQUIRED_LIBRARIES ${OPENGL_gl_LIBRARY})
|
||||||
|
list(APPEND GLFW_INCLUDE_DIR ${OPENGL_INCLUDE_DIR})
|
||||||
|
list(APPEND GLFW_LIBRARIES ${OPENGL_gl_LIBRARY})
|
||||||
|
|
||||||
|
# Select platform specific code
|
||||||
|
add_subdirectory(lib/win32)
|
||||||
|
endif (WIN32)
|
||||||
|
|
||||||
|
# Stuff specific to GLX on Unix-like platforms
|
||||||
|
if (UNIX AND NOT APPLE AND NOT CYGWIN)
|
||||||
|
message(STATUS "Building GLFW for GLX on a Unix-like system")
|
||||||
|
|
||||||
|
# Set up library and include paths
|
||||||
|
set(CMAKE_REQUIRED_LIBRARIES ${X11_X11_LIB} ${OPENGL_gl_LIBRARY})
|
||||||
|
list(APPEND GLFW_INCLUDE_DIR ${X11_X11_INCLUDE_PATH})
|
||||||
|
list(APPEND GLFW_LIBRARIES ${X11_X11_LIB})
|
||||||
|
list(APPEND GLFW_INCLUDE_DIR ${OPENGL_INCLUDE_DIR})
|
||||||
|
list(APPEND GLFW_LIBRARIES ${OPENGL_gl_LIBRARY})
|
||||||
|
|
||||||
|
# Detect X11 extension
|
||||||
|
include(${CMAKE_CURRENT_SOURCE_DIR}/CMake/CheckX11Extensions.cmake)
|
||||||
|
|
||||||
|
# Check for XRandR (modern resolution switching extension)
|
||||||
|
CHECK_X11_XRANDR()
|
||||||
|
if (X11_XRANDR_FOUND)
|
||||||
|
set(_GLFW_HAS_XRANDR 1)
|
||||||
|
list(APPEND GLFW_INCLUDE_DIR ${X11_XRANDR_INCLUDE_DIR})
|
||||||
|
list(APPEND GLFW_LIBRARIES ${X11_XRANDR_LIBRARIES})
|
||||||
|
endif(X11_XRANDR_FOUND)
|
||||||
|
|
||||||
|
# Check for xf86vidmode (fallback legacy resolution switching extension)
|
||||||
|
if (NOT X11_XRANDR_FOUND)
|
||||||
|
CHECK_X11_XF86VIDMODE()
|
||||||
|
if (X11_XF86VIDMODE_FOUND)
|
||||||
|
set(_GLFW_HAS_XF86VIDMODE 1)
|
||||||
|
list(APPEND GLFW_INCLUDE_DIR ${X11_XF86VIDMODE_INCLUDE_DIR})
|
||||||
|
list(APPEND GLFW_LIBRARIES ${X11_XF86VIDMODE_LIBRARIES})
|
||||||
|
endif(X11_XF86VIDMODE_FOUND)
|
||||||
|
endif (NOT X11_XRANDR_FOUND)
|
||||||
|
|
||||||
|
CHECK_FUNCTION_EXISTS(glXGetProcAddress _GLFW_HAS_GLXGETPROCADDRESS)
|
||||||
|
|
||||||
|
if (NOT _GLFW_HAS_GLXGETPROCADDRESS)
|
||||||
|
CHECK_FUNCTION_EXISTS(glXGetProcAddressARB _GLFW_HAS_GLXGETPROCADDRESSARB)
|
||||||
|
endif (NOT _GLFW_HAS_GLXGETPROCADDRESS)
|
||||||
|
|
||||||
|
if (NOT _GLFW_HAS_GLXGETPROCADDRESS AND NOT _GLFW_HAS_GLXGETPROCADDRESSARB)
|
||||||
|
CHECK_FUNCTION_EXISTS(glXGetProcAddressEXT _GLFW_HAS_GLXGETPROCADDRESSEXT)
|
||||||
|
endif (NOT _GLFW_HAS_GLXGETPROCADDRESS AND NOT _GLFW_HAS_GLXGETPROCADDRESSARB)
|
||||||
|
|
||||||
|
if (NOT _GLFW_HAS_GLXGETPROCADDRESS AND
|
||||||
|
NOT _GLFW_HAS_GLXGETPROCADDRESSARB AND
|
||||||
|
NOT _GLFW_HAS_GLXGETPROCADDRESSEXT)
|
||||||
|
message(WARNING "No glXGetProcAddressXXX variant found")
|
||||||
|
endif (NOT _GLFW_HAS_GLXGETPROCADDRESS AND
|
||||||
|
NOT _GLFW_HAS_GLXGETPROCADDRESSARB AND
|
||||||
|
NOT _GLFW_HAS_GLXGETPROCADDRESSEXT)
|
||||||
|
|
||||||
|
# Select platform specific code
|
||||||
|
add_subdirectory(lib/x11)
|
||||||
|
endif(UNIX AND NOT APPLE AND NOT CYGWIN)
|
||||||
|
|
||||||
|
# Stuff specific to AGL and CGL on Mac OS X
|
||||||
|
if (UNIX AND APPLE)
|
||||||
|
message(STATUS "Building GLFW for NSOpenGL on Mac OS X")
|
||||||
|
|
||||||
|
# Universal build, decent set of warning flags...
|
||||||
|
set(CMAKE_OSX_ARCHITECTURES ppc;i386;ppc64;x86_64)
|
||||||
|
set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.5.sdk)
|
||||||
|
set(CMAKE_C_FLAGS "-mmacosx-version-min=10.5 -Wall -Wextra -Wno-unused-parameter -Werror")
|
||||||
|
|
||||||
|
# Set up library and include paths
|
||||||
|
find_library(COCOA_FRAMEWORK Cocoa)
|
||||||
|
list(APPEND GLFW_LIBRARIES ${COCOA_FRAMEWORK})
|
||||||
|
list(APPEND GLFW_LIBRARIES ${OPENGL_gl_LIBRARY})
|
||||||
|
|
||||||
|
# Select platform specific code
|
||||||
|
add_subdirectory(lib/cocoa)
|
||||||
|
endif(UNIX AND APPLE)
|
||||||
|
|
||||||
|
add_subdirectory(examples)
|
||||||
|
add_subdirectory(tests)
|
||||||
|
#add_subdirectory(docs/doxygen)
|
||||||
|
#add_subdirectory(docs/manuals)
|
||||||
|
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# -- Install standard files
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Install the GLFW header file
|
||||||
|
install(DIRECTORY include/ DESTINATION include
|
||||||
|
PATTERN ".svn" EXCLUDE
|
||||||
|
PATTERN "include/*"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Install documentation
|
||||||
|
install(
|
||||||
|
FILES
|
||||||
|
COPYING.txt
|
||||||
|
readme.html
|
||||||
|
DESTINATION
|
||||||
|
share/doc/glfw-${GLFW_VERSION_FULL}/
|
||||||
|
)
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# -- Additional stuff
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# -- Documentation generation
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
#include("${CMAKE_CURRENT_SOURCE_DIR}/documentation.cmake")
|
||||||
|
#configure_file("${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in"
|
||||||
|
# "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile"
|
||||||
|
# IMMEDIATE @ONLY)
|
||||||
|
#add_doxygen_target("${CMAKE_CURRENT_BINARY_DIR}/Doxyfile")
|
||||||
|
#add_subdirectory(docs)
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# -- Uninstall operation
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
|
||||||
|
IMMEDIATE @ONLY)
|
||||||
|
add_custom_target(uninstall
|
||||||
|
"${CMAKE_COMMAND}" -P
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
|
||||||
|
|
21
COPYING.txt
Normal file
21
COPYING.txt
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
Copyright (c) 2002-2007 Camilla Berglund <elmindreda@users.sourceforge.net>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would
|
||||||
|
be appreciated but is not required.
|
||||||
|
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
be misrepresented as being the original software.
|
||||||
|
|
||||||
|
3. This notice may not be removed or altered from any source
|
||||||
|
distribution.
|
||||||
|
|
22
cmake_uninstall.cmake.in
Normal file
22
cmake_uninstall.cmake.in
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
|
||||||
|
MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"")
|
||||||
|
ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
|
||||||
|
|
||||||
|
FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
|
||||||
|
STRING(REGEX REPLACE "\n" ";" files "${files}")
|
||||||
|
FOREACH(file ${files})
|
||||||
|
MESSAGE(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"")
|
||||||
|
IF(EXISTS "$ENV{DESTDIR}${file}")
|
||||||
|
EXEC_PROGRAM(
|
||||||
|
"@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
|
||||||
|
OUTPUT_VARIABLE rm_out
|
||||||
|
RETURN_VALUE rm_retval
|
||||||
|
)
|
||||||
|
IF(NOT "${rm_retval}" STREQUAL 0)
|
||||||
|
MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
|
||||||
|
ENDIF(NOT "${rm_retval}" STREQUAL 0)
|
||||||
|
ELSE(EXISTS "$ENV{DESTDIR}${file}")
|
||||||
|
MESSAGE(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.")
|
||||||
|
ENDIF(EXISTS "$ENV{DESTDIR}${file}")
|
||||||
|
ENDFOREACH(file)
|
||||||
|
|
57
docs/Makefile
Normal file
57
docs/Makefile
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
##########################################################################
|
||||||
|
# Makefile for the GLFW documentation.
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
PDFDOCS = glfwrm.pdf glfwug.pdf
|
||||||
|
DVIDOCS = glfwrm.dvi glfwug.dvi
|
||||||
|
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
# Build macros
|
||||||
|
##########################################################################
|
||||||
|
default: pdf
|
||||||
|
pdf: $(PDFDOCS)
|
||||||
|
dvi: $(DVIDOCS)
|
||||||
|
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
# Clean macros
|
||||||
|
##########################################################################
|
||||||
|
clean:
|
||||||
|
rm -f glfwrm.dvi glfwrm.aux glfwrm.log glfwrm.out glfwrm.pdf glfwrm.toc glfwrm.lot
|
||||||
|
rm -f glfwug.dvi glfwug.aux glfwug.log glfwug.out glfwug.pdf glfwug.toc
|
||||||
|
|
||||||
|
clean-win:
|
||||||
|
@.\\cleanup.bat
|
||||||
|
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
# Rules for building the GLFW Reference Manual
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
glfwrm.pdf: glfwrm.tex glfwrm.toc glfwrm.lot glfwdoc.sty
|
||||||
|
pdflatex glfwrm.tex
|
||||||
|
|
||||||
|
glfwrm.dvi: glfwrm.tex glfwrm.toc glfwrm.lot glfwdoc.sty
|
||||||
|
latex glfwrm.tex
|
||||||
|
|
||||||
|
glfwrm.toc: glfwrm.tex glfwdoc.sty
|
||||||
|
latex glfwrm.tex
|
||||||
|
|
||||||
|
glfwrm.lot: glfwrm.tex glfwdoc.sty
|
||||||
|
latex glfwrm.tex
|
||||||
|
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
# Rules for building the GLFW Users Guide
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
glfwug.pdf: glfwug.tex glfwug.toc glfwdoc.sty
|
||||||
|
pdflatex glfwug.tex
|
||||||
|
|
||||||
|
glfwug.dvi: glfwug.tex glfwug.toc glfwdoc.sty
|
||||||
|
latex glfwug.tex
|
||||||
|
|
||||||
|
glfwug.toc: glfwug.tex glfwdoc.sty
|
||||||
|
latex glfwug.tex
|
||||||
|
|
22
docs/cleanup.bat
Normal file
22
docs/cleanup.bat
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
@echo off
|
||||||
|
|
||||||
|
REM ----------------------------------------------------------------------
|
||||||
|
REM Windows cleanup batch file for the GLFW documentation.
|
||||||
|
REM ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
REM GLFW Reference Manual
|
||||||
|
if exist glfwrm.dvi del glfwrm.dvi
|
||||||
|
if exist glfwrm.aux del glfwrm.aux
|
||||||
|
if exist glfwrm.log del glfwrm.log
|
||||||
|
if exist glfwrm.out del glfwrm.out
|
||||||
|
if exist glfwrm.pdf del glfwrm.pdf
|
||||||
|
if exist glfwrm.toc del glfwrm.toc
|
||||||
|
if exist glfwrm.lot del glfwrm.lot
|
||||||
|
|
||||||
|
REM GLFW Users Guide
|
||||||
|
if exist glfwug.dvi del glfwug.dvi
|
||||||
|
if exist glfwug.aux del glfwug.aux
|
||||||
|
if exist glfwug.log del glfwug.log
|
||||||
|
if exist glfwug.out del glfwug.out
|
||||||
|
if exist glfwug.pdf del glfwug.pdf
|
||||||
|
if exist glfwug.toc del glfwug.toc
|
80
docs/glfwdoc.sty
Normal file
80
docs/glfwdoc.sty
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
%-------------------------------------------------------------------------
|
||||||
|
% Common document formatting and macros for GLFW manuals
|
||||||
|
%-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
% Misc. document info
|
||||||
|
\date{\today}
|
||||||
|
|
||||||
|
% Packages
|
||||||
|
\usepackage{fancyhdr}
|
||||||
|
\usepackage{titling}
|
||||||
|
\usepackage{lastpage}
|
||||||
|
\usepackage{listings}
|
||||||
|
\usepackage{color}
|
||||||
|
\usepackage[overload]{textcase}
|
||||||
|
\usepackage{needspace}
|
||||||
|
\usepackage{times}
|
||||||
|
|
||||||
|
% Logo macros
|
||||||
|
\newcommand{\OpenGL}[1][0]{\textbf{OpenGL}\texttrademark}
|
||||||
|
\newcommand{\GLFW}[1][0]{\textbf{GLFW}}
|
||||||
|
|
||||||
|
% Encoding
|
||||||
|
\usepackage[latin1]{inputenc}
|
||||||
|
\usepackage[T1]{fontenc}
|
||||||
|
|
||||||
|
% Page formatting
|
||||||
|
\usepackage[hmargin=2.5cm]{geometry}
|
||||||
|
\raggedright
|
||||||
|
\raggedbottom
|
||||||
|
\sloppy
|
||||||
|
\usepackage{parskip}
|
||||||
|
|
||||||
|
% Header and footer
|
||||||
|
\pagestyle{fancy}
|
||||||
|
%\lhead{\textit{GLFW Reference Manual}}
|
||||||
|
\lhead{\textit{GLFW \glfwdoctype}}
|
||||||
|
\chead{API version \glfwapiver}
|
||||||
|
\rhead{Page \thepage/\pageref{LastPage}}
|
||||||
|
\lfoot{}
|
||||||
|
\cfoot{}
|
||||||
|
\rfoot{}
|
||||||
|
\renewcommand{\headrulewidth}{0.4pt}
|
||||||
|
\renewcommand{\footrulewidth}{0.0pt}
|
||||||
|
|
||||||
|
% Titlepage
|
||||||
|
\newcommand{\glfwmaketitle}{\begin{titlepage}\ \\%
|
||||||
|
\begin{center}%
|
||||||
|
\vspace{7.0cm}{\Huge\textbf{GLFW}}\\%
|
||||||
|
\rule{10.0cm}{0.5pt}\\%
|
||||||
|
\vspace{0.5cm}{\LARGE\textbf{\glfwdoctype}}\\%
|
||||||
|
\vspace{0.8cm}{\large\textbf{API version \glfwapiver}}\\%
|
||||||
|
\textit{\today}\\%
|
||||||
|
\vspace{1.5cm}\textbf{\textcopyright2002-2007 Camilla Berglund}\\%
|
||||||
|
\end{center}\end{titlepage}\newpage}
|
||||||
|
|
||||||
|
% Colors
|
||||||
|
\definecolor{code}{rgb}{0.9,0.9,1.0}
|
||||||
|
\definecolor{link}{rgb}{0.6,0.0,0.0}
|
||||||
|
\definecolor{codeA}{rgb}{0.9,1.0,0.9}
|
||||||
|
\definecolor{codeB}{rgb}{1.0,0.9,0.9}
|
||||||
|
|
||||||
|
% Code listings
|
||||||
|
\lstset{frame=single,frameround=tttt,backgroundcolor=\color{code},%
|
||||||
|
language=C,basicstyle={\ttfamily},%
|
||||||
|
breaklines,breakindent=0pt,postbreak=\space\space\space\space}
|
||||||
|
|
||||||
|
|
||||||
|
% A simple hack for keeping lines together
|
||||||
|
\newenvironment{mysamepage}[1][2]{\begin{samepage}\needspace{#1\baselineskip}}{\end{samepage}}
|
||||||
|
|
||||||
|
% Macros for automating function reference entries
|
||||||
|
\newenvironment{refparameters}[1][0]{\begin{mysamepage}\textbf{Parameters}\\}{\end{mysamepage}\bigskip}
|
||||||
|
\newenvironment{refreturn}[1][0]{\begin{mysamepage}\textbf{Return values}\\}{\end{mysamepage}\bigskip}
|
||||||
|
\newenvironment{refdescription}[1][0]{\begin{mysamepage}\textbf{Description}\\}{\end{mysamepage}\bigskip}
|
||||||
|
\newenvironment{refnotes}[1][0]{\begin{mysamepage}\textbf{Notes}\\}{\end{mysamepage}\bigskip}
|
||||||
|
|
||||||
|
% hyperref (bookmarks, links etc) - use this package last
|
||||||
|
\usepackage[colorlinks=true,linkcolor=link,bookmarks=true,bookmarksopen=true,%
|
||||||
|
pdfhighlight=/N,bookmarksnumbered=true,bookmarksopenlevel=1,%
|
||||||
|
pdfview=FitH,pdfstartview=FitH]{hyperref}
|
2128
docs/glfwrm.tex
Normal file
2128
docs/glfwrm.tex
Normal file
File diff suppressed because it is too large
Load Diff
1287
docs/glfwug.tex
Normal file
1287
docs/glfwug.tex
Normal file
File diff suppressed because it is too large
Load Diff
52
docs/readme.txt
Normal file
52
docs/readme.txt
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
Introduction
|
||||||
|
------------
|
||||||
|
|
||||||
|
The GLFW documentation is written in LaTeX. Besides being powerful, LaTeX is
|
||||||
|
also very attractive since all the necessary tools for dealing with LaTeX
|
||||||
|
documentation are both free and ported to a wide variety of platforms. Another
|
||||||
|
advantage is that the LaTeX files are written in plain text, which means that
|
||||||
|
version control systems such as CVS handle them perfectly without having to
|
||||||
|
treat the documents as binary files.
|
||||||
|
|
||||||
|
|
||||||
|
The documents
|
||||||
|
-------------
|
||||||
|
|
||||||
|
There are two main documents:
|
||||||
|
|
||||||
|
glfwrm.tex - The GLFW Reference Manual
|
||||||
|
glfwug.tex - The GLFW Users Guide
|
||||||
|
|
||||||
|
In addition, there is a common LaTeX style file that sets up things
|
||||||
|
such as page formatting and useful macros:
|
||||||
|
|
||||||
|
glfwdoc.sty - Common GLFW document styles and macros
|
||||||
|
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
------------
|
||||||
|
|
||||||
|
Of course you need LaTeX installed on your system in order to compile the GLFW
|
||||||
|
documentation. If you are using a Unix-like operating system, then your
|
||||||
|
package system most likely has a version of LaTeX adapted for your system. If
|
||||||
|
not, the easiest way to get a full LaTeX system is to download/get the TeXLive
|
||||||
|
CD from http://www.tug.org/texlive/. It has all the necessary software for
|
||||||
|
Windows, Mac OS X and most popular Unix-like operating systems.
|
||||||
|
|
||||||
|
A number of LaTeX packages have to be installed in order to compile the
|
||||||
|
GLFW documentation successfully:
|
||||||
|
|
||||||
|
color
|
||||||
|
fancyhdr
|
||||||
|
hyperref
|
||||||
|
lastpage
|
||||||
|
listings
|
||||||
|
needspace
|
||||||
|
textcase
|
||||||
|
times
|
||||||
|
titling
|
||||||
|
|
||||||
|
These packages are all available on the TeXLive CD. Just make sure that
|
||||||
|
you have checked all these packages when installing TeXLive, or get them
|
||||||
|
in some other way if you do not have the TeXLive CD.
|
||||||
|
|
37
examples/CMakeLists.txt
Normal file
37
examples/CMakeLists.txt
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
# This line is used to link with static libraries
|
||||||
|
# Note that the library list should be updated to be obtained from
|
||||||
|
# the main CMakeLists.txt
|
||||||
|
link_libraries(libglfwStatic ${GLFW_LIBRARIES} ${OPENGL_glu_LIBRARY})
|
||||||
|
|
||||||
|
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../include ${OPENGL_INCLUDE_DIR})
|
||||||
|
|
||||||
|
add_executable(listmodes listmodes.c)
|
||||||
|
|
||||||
|
if(APPLE)
|
||||||
|
# Set fancy names for bundles
|
||||||
|
add_executable(Boing MACOSX_BUNDLE boing.c)
|
||||||
|
add_executable(Gears MACOSX_BUNDLE gears.c)
|
||||||
|
add_executable("Split View" MACOSX_BUNDLE splitview.c)
|
||||||
|
add_executable(Triangle MACOSX_BUNDLE triangle.c)
|
||||||
|
add_executable(Wave MACOSX_BUNDLE wave.c)
|
||||||
|
else(APPLE)
|
||||||
|
# Set boring names for executables
|
||||||
|
add_executable(boing WIN32 boing.c)
|
||||||
|
add_executable(gears WIN32 gears.c)
|
||||||
|
add_executable(splitview WIN32 splitview.c)
|
||||||
|
add_executable(triangle WIN32 triangle.c)
|
||||||
|
add_executable(wave WIN32 wave.c)
|
||||||
|
endif(APPLE)
|
||||||
|
|
||||||
|
if(MSVC)
|
||||||
|
# Tell MSVC to use main instead of WinMain for Windows subsystem executables
|
||||||
|
set_target_properties(boing gears splitview triangle wave PROPERTIES LINK_FLAGS "/ENTRY:mainCRTStartup")
|
||||||
|
endif(MSVC)
|
||||||
|
|
||||||
|
if(CYGWIN)
|
||||||
|
# Set cross-compile and subsystem compile and link flags
|
||||||
|
set_target_properties(boing gears listmodes splitview triangle wave PROPERTIES COMPILE_FLAGS "-mno-cygwin")
|
||||||
|
set_target_properties(boing gears splitview triangle wave PROPERTIES LINK_FLAGS "-mno-cygwin -mwindows")
|
||||||
|
set_target_properties(listmodes PROPERTIES LINK_FLAGS "-mno-cygwin -mconsole")
|
||||||
|
endif(CYGWIN)
|
||||||
|
|
615
examples/boing.c
Normal file
615
examples/boing.c
Normal file
|
@ -0,0 +1,615 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* Title: GLBoing
|
||||||
|
* Desc: Tribute to Amiga Boing.
|
||||||
|
* Author: Jim Brooks <gfx@jimbrooks.org>
|
||||||
|
* Original Amiga authors were R.J. Mical and Dale Luck.
|
||||||
|
* GLFW conversion by Marcus Geelnard
|
||||||
|
* Notes: - 360' = 2*PI [radian]
|
||||||
|
*
|
||||||
|
* - Distances between objects are created by doing a relative
|
||||||
|
* Z translations.
|
||||||
|
*
|
||||||
|
* - Although OpenGL enticingly supports alpha-blending,
|
||||||
|
* the shadow of the original Boing didn't affect the color
|
||||||
|
* of the grid.
|
||||||
|
*
|
||||||
|
* - [Marcus] Changed timing scheme from interval driven to frame-
|
||||||
|
* time based animation steps (which results in much smoother
|
||||||
|
* movement)
|
||||||
|
*
|
||||||
|
* History of Amiga Boing:
|
||||||
|
*
|
||||||
|
* Boing was demonstrated on the prototype Amiga (codenamed "Lorraine") in
|
||||||
|
* 1985. According to legend, it was written ad-hoc in one night by
|
||||||
|
* R. J. Mical and Dale Luck. Because the bouncing ball animation was so fast
|
||||||
|
* and smooth, attendees did not believe the Amiga prototype was really doing
|
||||||
|
* the rendering. Suspecting a trick, they began looking around the booth for
|
||||||
|
* a hidden computer or VCR.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <GL/glfw.h>
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Various declarations and macros
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/* Prototypes */
|
||||||
|
void init( void );
|
||||||
|
void display( void );
|
||||||
|
void reshape( int w, int h );
|
||||||
|
void DrawBoingBall( void );
|
||||||
|
void BounceBall( double dt );
|
||||||
|
void DrawBoingBallBand( GLfloat long_lo, GLfloat long_hi );
|
||||||
|
void DrawGrid( void );
|
||||||
|
|
||||||
|
#define RADIUS 70.f
|
||||||
|
#define STEP_LONGITUDE 22.5f /* 22.5 makes 8 bands like original Boing */
|
||||||
|
#define STEP_LATITUDE 22.5f
|
||||||
|
|
||||||
|
#define DIST_BALL (RADIUS * 2.f + RADIUS * 0.1f)
|
||||||
|
|
||||||
|
#define VIEW_SCENE_DIST (DIST_BALL * 3.f + 200.f)/* distance from viewer to middle of boing area */
|
||||||
|
#define GRID_SIZE (RADIUS * 4.5f) /* length (width) of grid */
|
||||||
|
#define BOUNCE_HEIGHT (RADIUS * 2.1f)
|
||||||
|
#define BOUNCE_WIDTH (RADIUS * 2.1f)
|
||||||
|
|
||||||
|
#define SHADOW_OFFSET_X -20.f
|
||||||
|
#define SHADOW_OFFSET_Y 10.f
|
||||||
|
#define SHADOW_OFFSET_Z 0.f
|
||||||
|
|
||||||
|
#define WALL_L_OFFSET 0.f
|
||||||
|
#define WALL_R_OFFSET 5.f
|
||||||
|
|
||||||
|
/* Animation speed (50.0 mimics the original GLUT demo speed) */
|
||||||
|
#define ANIMATION_SPEED 50.f
|
||||||
|
|
||||||
|
/* Maximum allowed delta time per physics iteration */
|
||||||
|
#define MAX_DELTA_T 0.02f
|
||||||
|
|
||||||
|
/* Draw ball, or its shadow */
|
||||||
|
typedef enum { DRAW_BALL, DRAW_BALL_SHADOW } DRAW_BALL_ENUM;
|
||||||
|
|
||||||
|
/* Vertex type */
|
||||||
|
typedef struct {float x; float y; float z;} vertex_t;
|
||||||
|
|
||||||
|
/* Global vars */
|
||||||
|
GLfloat deg_rot_y = 0.f;
|
||||||
|
GLfloat deg_rot_y_inc = 2.f;
|
||||||
|
GLfloat ball_x = -RADIUS;
|
||||||
|
GLfloat ball_y = -RADIUS;
|
||||||
|
GLfloat ball_x_inc = 1.f;
|
||||||
|
GLfloat ball_y_inc = 2.f;
|
||||||
|
DRAW_BALL_ENUM drawBallHow;
|
||||||
|
double t;
|
||||||
|
double t_old = 0.f;
|
||||||
|
double dt;
|
||||||
|
|
||||||
|
/* Random number generator */
|
||||||
|
#ifndef RAND_MAX
|
||||||
|
#define RAND_MAX 4095
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* PI */
|
||||||
|
#ifndef M_PI
|
||||||
|
#define M_PI 3.1415926535897932384626433832795
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Truncate a degree.
|
||||||
|
*****************************************************************************/
|
||||||
|
GLfloat TruncateDeg( GLfloat deg )
|
||||||
|
{
|
||||||
|
if ( deg >= 360.f )
|
||||||
|
return (deg - 360.f);
|
||||||
|
else
|
||||||
|
return deg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Convert a degree (360-based) into a radian.
|
||||||
|
* 360' = 2 * PI
|
||||||
|
*****************************************************************************/
|
||||||
|
double deg2rad( double deg )
|
||||||
|
{
|
||||||
|
return deg / 360 * (2 * M_PI);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* 360' sin().
|
||||||
|
*****************************************************************************/
|
||||||
|
double sin_deg( double deg )
|
||||||
|
{
|
||||||
|
return sin( deg2rad( deg ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* 360' cos().
|
||||||
|
*****************************************************************************/
|
||||||
|
double cos_deg( double deg )
|
||||||
|
{
|
||||||
|
return cos( deg2rad( deg ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Compute a cross product (for a normal vector).
|
||||||
|
*
|
||||||
|
* c = a x b
|
||||||
|
*****************************************************************************/
|
||||||
|
void CrossProduct( vertex_t a, vertex_t b, vertex_t c, vertex_t *n )
|
||||||
|
{
|
||||||
|
GLfloat u1, u2, u3;
|
||||||
|
GLfloat v1, v2, v3;
|
||||||
|
|
||||||
|
u1 = b.x - a.x;
|
||||||
|
u2 = b.y - a.y;
|
||||||
|
u3 = b.y - a.z;
|
||||||
|
|
||||||
|
v1 = c.x - a.x;
|
||||||
|
v2 = c.y - a.y;
|
||||||
|
v3 = c.z - a.z;
|
||||||
|
|
||||||
|
n->x = u2 * v3 - v2 * v3;
|
||||||
|
n->y = u3 * v1 - v3 * u1;
|
||||||
|
n->z = u1 * v2 - v1 * u2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Calculate the angle to be passed to gluPerspective() so that a scene
|
||||||
|
* is visible. This function originates from the OpenGL Red Book.
|
||||||
|
*
|
||||||
|
* Parms : size
|
||||||
|
* The size of the segment when the angle is intersected at "dist"
|
||||||
|
* (ie at the outermost edge of the angle of vision).
|
||||||
|
*
|
||||||
|
* dist
|
||||||
|
* Distance from viewpoint to scene.
|
||||||
|
*****************************************************************************/
|
||||||
|
GLfloat PerspectiveAngle( GLfloat size,
|
||||||
|
GLfloat dist )
|
||||||
|
{
|
||||||
|
GLfloat radTheta, degTheta;
|
||||||
|
|
||||||
|
radTheta = 2.f * (GLfloat) atan2( size / 2.f, dist );
|
||||||
|
degTheta = (180.f * radTheta) / (GLfloat) M_PI;
|
||||||
|
return degTheta;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define BOING_DEBUG 0
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* init()
|
||||||
|
*****************************************************************************/
|
||||||
|
void init( void )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Clear background.
|
||||||
|
*/
|
||||||
|
glClearColor( 0.55f, 0.55f, 0.55f, 0.f );
|
||||||
|
|
||||||
|
glShadeModel( GL_FLAT );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* display()
|
||||||
|
*****************************************************************************/
|
||||||
|
void display(void)
|
||||||
|
{
|
||||||
|
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
|
||||||
|
glPushMatrix();
|
||||||
|
|
||||||
|
drawBallHow = DRAW_BALL_SHADOW;
|
||||||
|
DrawBoingBall();
|
||||||
|
|
||||||
|
DrawGrid();
|
||||||
|
|
||||||
|
drawBallHow = DRAW_BALL;
|
||||||
|
DrawBoingBall();
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
glFlush();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* reshape()
|
||||||
|
*****************************************************************************/
|
||||||
|
void reshape( int w, int h )
|
||||||
|
{
|
||||||
|
glViewport( 0, 0, (GLsizei)w, (GLsizei)h );
|
||||||
|
|
||||||
|
glMatrixMode( GL_PROJECTION );
|
||||||
|
glLoadIdentity();
|
||||||
|
|
||||||
|
gluPerspective( PerspectiveAngle( RADIUS * 2, 200 ),
|
||||||
|
(GLfloat)w / (GLfloat)h,
|
||||||
|
1.0,
|
||||||
|
VIEW_SCENE_DIST );
|
||||||
|
|
||||||
|
glMatrixMode( GL_MODELVIEW );
|
||||||
|
glLoadIdentity();
|
||||||
|
|
||||||
|
gluLookAt( 0.0, 0.0, VIEW_SCENE_DIST,/* eye */
|
||||||
|
0.0, 0.0, 0.0, /* center of vision */
|
||||||
|
0.0, -1.0, 0.0 ); /* up vector */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Draw the Boing ball.
|
||||||
|
*
|
||||||
|
* The Boing ball is sphere in which each facet is a rectangle.
|
||||||
|
* Facet colors alternate between red and white.
|
||||||
|
* The ball is built by stacking latitudinal circles. Each circle is composed
|
||||||
|
* of a widely-separated set of points, so that each facet is noticably large.
|
||||||
|
*****************************************************************************/
|
||||||
|
void DrawBoingBall( void )
|
||||||
|
{
|
||||||
|
GLfloat lon_deg; /* degree of longitude */
|
||||||
|
double dt_total, dt2;
|
||||||
|
|
||||||
|
glPushMatrix();
|
||||||
|
glMatrixMode( GL_MODELVIEW );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Another relative Z translation to separate objects.
|
||||||
|
*/
|
||||||
|
glTranslatef( 0.0, 0.0, DIST_BALL );
|
||||||
|
|
||||||
|
/* Update ball position and rotation (iterate if necessary) */
|
||||||
|
dt_total = dt;
|
||||||
|
while( dt_total > 0.0 )
|
||||||
|
{
|
||||||
|
dt2 = dt_total > MAX_DELTA_T ? MAX_DELTA_T : dt_total;
|
||||||
|
dt_total -= dt2;
|
||||||
|
BounceBall( dt2 );
|
||||||
|
deg_rot_y = TruncateDeg( deg_rot_y + deg_rot_y_inc*((float)dt2*ANIMATION_SPEED) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set ball position */
|
||||||
|
glTranslatef( ball_x, ball_y, 0.0 );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Offset the shadow.
|
||||||
|
*/
|
||||||
|
if ( drawBallHow == DRAW_BALL_SHADOW )
|
||||||
|
{
|
||||||
|
glTranslatef( SHADOW_OFFSET_X,
|
||||||
|
SHADOW_OFFSET_Y,
|
||||||
|
SHADOW_OFFSET_Z );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Tilt the ball.
|
||||||
|
*/
|
||||||
|
glRotatef( -20.0, 0.0, 0.0, 1.0 );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Continually rotate ball around Y axis.
|
||||||
|
*/
|
||||||
|
glRotatef( deg_rot_y, 0.0, 1.0, 0.0 );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set OpenGL state for Boing ball.
|
||||||
|
*/
|
||||||
|
glCullFace( GL_FRONT );
|
||||||
|
glEnable( GL_CULL_FACE );
|
||||||
|
glEnable( GL_NORMALIZE );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Build a faceted latitude slice of the Boing ball,
|
||||||
|
* stepping same-sized vertical bands of the sphere.
|
||||||
|
*/
|
||||||
|
for ( lon_deg = 0;
|
||||||
|
lon_deg < 180;
|
||||||
|
lon_deg += STEP_LONGITUDE )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Draw a latitude circle at this longitude.
|
||||||
|
*/
|
||||||
|
DrawBoingBallBand( lon_deg,
|
||||||
|
lon_deg + STEP_LONGITUDE );
|
||||||
|
}
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Bounce the ball.
|
||||||
|
*****************************************************************************/
|
||||||
|
void BounceBall( double dt )
|
||||||
|
{
|
||||||
|
GLfloat sign;
|
||||||
|
GLfloat deg;
|
||||||
|
|
||||||
|
/* Bounce on walls */
|
||||||
|
if ( ball_x > (BOUNCE_WIDTH/2 + WALL_R_OFFSET ) )
|
||||||
|
{
|
||||||
|
ball_x_inc = -0.5f - 0.75f * (GLfloat)rand() / (GLfloat)RAND_MAX;
|
||||||
|
deg_rot_y_inc = -deg_rot_y_inc;
|
||||||
|
}
|
||||||
|
if ( ball_x < -(BOUNCE_HEIGHT/2 + WALL_L_OFFSET) )
|
||||||
|
{
|
||||||
|
ball_x_inc = 0.5f + 0.75f * (GLfloat)rand() / (GLfloat)RAND_MAX;
|
||||||
|
deg_rot_y_inc = -deg_rot_y_inc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Bounce on floor / roof */
|
||||||
|
if ( ball_y > BOUNCE_HEIGHT/2 )
|
||||||
|
{
|
||||||
|
ball_y_inc = -0.75f - 1.f * (GLfloat)rand() / (GLfloat)RAND_MAX;
|
||||||
|
}
|
||||||
|
if ( ball_y < -BOUNCE_HEIGHT/2*0.85 )
|
||||||
|
{
|
||||||
|
ball_y_inc = 0.75f + 1.f * (GLfloat)rand() / (GLfloat)RAND_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update ball position */
|
||||||
|
ball_x += ball_x_inc * ((float)dt*ANIMATION_SPEED);
|
||||||
|
ball_y += ball_y_inc * ((float)dt*ANIMATION_SPEED);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Simulate the effects of gravity on Y movement.
|
||||||
|
*/
|
||||||
|
if ( ball_y_inc < 0 ) sign = -1.0; else sign = 1.0;
|
||||||
|
|
||||||
|
deg = (ball_y + BOUNCE_HEIGHT/2) * 90 / BOUNCE_HEIGHT;
|
||||||
|
if ( deg > 80 ) deg = 80;
|
||||||
|
if ( deg < 10 ) deg = 10;
|
||||||
|
|
||||||
|
ball_y_inc = sign * 4.f * (float) sin_deg( deg );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Draw a faceted latitude band of the Boing ball.
|
||||||
|
*
|
||||||
|
* Parms: long_lo, long_hi
|
||||||
|
* Low and high longitudes of slice, resp.
|
||||||
|
*****************************************************************************/
|
||||||
|
void DrawBoingBallBand( GLfloat long_lo,
|
||||||
|
GLfloat long_hi )
|
||||||
|
{
|
||||||
|
vertex_t vert_ne; /* "ne" means south-east, so on */
|
||||||
|
vertex_t vert_nw;
|
||||||
|
vertex_t vert_sw;
|
||||||
|
vertex_t vert_se;
|
||||||
|
vertex_t vert_norm;
|
||||||
|
GLfloat lat_deg;
|
||||||
|
static int colorToggle = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Iterate thru the points of a latitude circle.
|
||||||
|
* A latitude circle is a 2D set of X,Z points.
|
||||||
|
*/
|
||||||
|
for ( lat_deg = 0;
|
||||||
|
lat_deg <= (360 - STEP_LATITUDE);
|
||||||
|
lat_deg += STEP_LATITUDE )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Color this polygon with red or white.
|
||||||
|
*/
|
||||||
|
if ( colorToggle )
|
||||||
|
glColor3f( 0.8f, 0.1f, 0.1f );
|
||||||
|
else
|
||||||
|
glColor3f( 0.95f, 0.95f, 0.95f );
|
||||||
|
#if 0
|
||||||
|
if ( lat_deg >= 180 )
|
||||||
|
if ( colorToggle )
|
||||||
|
glColor3f( 0.1f, 0.8f, 0.1f );
|
||||||
|
else
|
||||||
|
glColor3f( 0.5f, 0.5f, 0.95f );
|
||||||
|
#endif
|
||||||
|
colorToggle = ! colorToggle;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Change color if drawing shadow.
|
||||||
|
*/
|
||||||
|
if ( drawBallHow == DRAW_BALL_SHADOW )
|
||||||
|
glColor3f( 0.35f, 0.35f, 0.35f );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Assign each Y.
|
||||||
|
*/
|
||||||
|
vert_ne.y = vert_nw.y = (float) cos_deg(long_hi) * RADIUS;
|
||||||
|
vert_sw.y = vert_se.y = (float) cos_deg(long_lo) * RADIUS;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Assign each X,Z with sin,cos values scaled by latitude radius indexed by longitude.
|
||||||
|
* Eg, long=0 and long=180 are at the poles, so zero scale is sin(longitude),
|
||||||
|
* while long=90 (sin(90)=1) is at equator.
|
||||||
|
*/
|
||||||
|
vert_ne.x = (float) cos_deg( lat_deg ) * (RADIUS * (float) sin_deg( long_lo + STEP_LONGITUDE ));
|
||||||
|
vert_se.x = (float) cos_deg( lat_deg ) * (RADIUS * (float) sin_deg( long_lo ));
|
||||||
|
vert_nw.x = (float) cos_deg( lat_deg + STEP_LATITUDE ) * (RADIUS * (float) sin_deg( long_lo + STEP_LONGITUDE ));
|
||||||
|
vert_sw.x = (float) cos_deg( lat_deg + STEP_LATITUDE ) * (RADIUS * (float) sin_deg( long_lo ));
|
||||||
|
|
||||||
|
vert_ne.z = (float) sin_deg( lat_deg ) * (RADIUS * (float) sin_deg( long_lo + STEP_LONGITUDE ));
|
||||||
|
vert_se.z = (float) sin_deg( lat_deg ) * (RADIUS * (float) sin_deg( long_lo ));
|
||||||
|
vert_nw.z = (float) sin_deg( lat_deg + STEP_LATITUDE ) * (RADIUS * (float) sin_deg( long_lo + STEP_LONGITUDE ));
|
||||||
|
vert_sw.z = (float) sin_deg( lat_deg + STEP_LATITUDE ) * (RADIUS * (float) sin_deg( long_lo ));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Draw the facet.
|
||||||
|
*/
|
||||||
|
glBegin( GL_POLYGON );
|
||||||
|
|
||||||
|
CrossProduct( vert_ne, vert_nw, vert_sw, &vert_norm );
|
||||||
|
glNormal3f( vert_norm.x, vert_norm.y, vert_norm.z );
|
||||||
|
|
||||||
|
glVertex3f( vert_ne.x, vert_ne.y, vert_ne.z );
|
||||||
|
glVertex3f( vert_nw.x, vert_nw.y, vert_nw.z );
|
||||||
|
glVertex3f( vert_sw.x, vert_sw.y, vert_sw.z );
|
||||||
|
glVertex3f( vert_se.x, vert_se.y, vert_se.z );
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
#if BOING_DEBUG
|
||||||
|
printf( "----------------------------------------------------------- \n" );
|
||||||
|
printf( "lat = %f long_lo = %f long_hi = %f \n", lat_deg, long_lo, long_hi );
|
||||||
|
printf( "vert_ne x = %.8f y = %.8f z = %.8f \n", vert_ne.x, vert_ne.y, vert_ne.z );
|
||||||
|
printf( "vert_nw x = %.8f y = %.8f z = %.8f \n", vert_nw.x, vert_nw.y, vert_nw.z );
|
||||||
|
printf( "vert_se x = %.8f y = %.8f z = %.8f \n", vert_se.x, vert_se.y, vert_se.z );
|
||||||
|
printf( "vert_sw x = %.8f y = %.8f z = %.8f \n", vert_sw.x, vert_sw.y, vert_sw.z );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Toggle color so that next band will opposite red/white colors than this one.
|
||||||
|
*/
|
||||||
|
colorToggle = ! colorToggle;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This circular band is done.
|
||||||
|
*/
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Draw the purple grid of lines, behind the Boing ball.
|
||||||
|
* When the Workbench is dropped to the bottom, Boing shows 12 rows.
|
||||||
|
*****************************************************************************/
|
||||||
|
void DrawGrid( void )
|
||||||
|
{
|
||||||
|
int row, col;
|
||||||
|
const int rowTotal = 12; /* must be divisible by 2 */
|
||||||
|
const int colTotal = rowTotal; /* must be same as rowTotal */
|
||||||
|
const GLfloat widthLine = 2.0; /* should be divisible by 2 */
|
||||||
|
const GLfloat sizeCell = GRID_SIZE / rowTotal;
|
||||||
|
const GLfloat z_offset = -40.0;
|
||||||
|
GLfloat xl, xr;
|
||||||
|
GLfloat yt, yb;
|
||||||
|
|
||||||
|
glPushMatrix();
|
||||||
|
glDisable( GL_CULL_FACE );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Another relative Z translation to separate objects.
|
||||||
|
*/
|
||||||
|
glTranslatef( 0.0, 0.0, DIST_BALL );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Draw vertical lines (as skinny 3D rectangles).
|
||||||
|
*/
|
||||||
|
for ( col = 0; col <= colTotal; col++ )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Compute co-ords of line.
|
||||||
|
*/
|
||||||
|
xl = -GRID_SIZE / 2 + col * sizeCell;
|
||||||
|
xr = xl + widthLine;
|
||||||
|
|
||||||
|
yt = GRID_SIZE / 2;
|
||||||
|
yb = -GRID_SIZE / 2 - widthLine;
|
||||||
|
|
||||||
|
glBegin( GL_POLYGON );
|
||||||
|
|
||||||
|
glColor3f( 0.6f, 0.1f, 0.6f ); /* purple */
|
||||||
|
|
||||||
|
glVertex3f( xr, yt, z_offset ); /* NE */
|
||||||
|
glVertex3f( xl, yt, z_offset ); /* NW */
|
||||||
|
glVertex3f( xl, yb, z_offset ); /* SW */
|
||||||
|
glVertex3f( xr, yb, z_offset ); /* SE */
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Draw horizontal lines (as skinny 3D rectangles).
|
||||||
|
*/
|
||||||
|
for ( row = 0; row <= rowTotal; row++ )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Compute co-ords of line.
|
||||||
|
*/
|
||||||
|
yt = GRID_SIZE / 2 - row * sizeCell;
|
||||||
|
yb = yt - widthLine;
|
||||||
|
|
||||||
|
xl = -GRID_SIZE / 2;
|
||||||
|
xr = GRID_SIZE / 2 + widthLine;
|
||||||
|
|
||||||
|
glBegin( GL_POLYGON );
|
||||||
|
|
||||||
|
glColor3f( 0.6f, 0.1f, 0.6f ); /* purple */
|
||||||
|
|
||||||
|
glVertex3f( xr, yt, z_offset ); /* NE */
|
||||||
|
glVertex3f( xl, yt, z_offset ); /* NW */
|
||||||
|
glVertex3f( xl, yb, z_offset ); /* SW */
|
||||||
|
glVertex3f( xr, yb, z_offset ); /* SE */
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*======================================================================*
|
||||||
|
* main()
|
||||||
|
*======================================================================*/
|
||||||
|
|
||||||
|
int main( void )
|
||||||
|
{
|
||||||
|
int running;
|
||||||
|
|
||||||
|
/* Init GLFW */
|
||||||
|
if( !glfwInit() )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "Failed to initialize GLFW\n" );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !glfwOpenWindow( 400,400, 0,0,0,0, 16,0, GLFW_WINDOW ) )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "Failed to open GLFW window\n" );
|
||||||
|
glfwTerminate();
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwSetWindowTitle( "Boing (classic Amiga demo)" );
|
||||||
|
glfwSetWindowSizeCallback( reshape );
|
||||||
|
glfwEnable( GLFW_STICKY_KEYS );
|
||||||
|
glfwSwapInterval( 1 );
|
||||||
|
glfwSetTime( 0.0 );
|
||||||
|
|
||||||
|
init();
|
||||||
|
|
||||||
|
/* Main loop */
|
||||||
|
do
|
||||||
|
{
|
||||||
|
/* Timing */
|
||||||
|
t = glfwGetTime();
|
||||||
|
dt = t - t_old;
|
||||||
|
t_old = t;
|
||||||
|
|
||||||
|
/* Draw one frame */
|
||||||
|
display();
|
||||||
|
|
||||||
|
/* Swap buffers */
|
||||||
|
glfwSwapBuffers();
|
||||||
|
|
||||||
|
/* Check if we are still running */
|
||||||
|
running = !glfwGetKey( GLFW_KEY_ESC ) &&
|
||||||
|
glfwGetWindowParam( GLFW_OPENED );
|
||||||
|
}
|
||||||
|
while( running );
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
|
exit( EXIT_SUCCESS );
|
||||||
|
}
|
||||||
|
|
373
examples/gears.c
Normal file
373
examples/gears.c
Normal file
|
@ -0,0 +1,373 @@
|
||||||
|
/*
|
||||||
|
* 3-D gear wheels. This program is in the public domain.
|
||||||
|
*
|
||||||
|
* Command line options:
|
||||||
|
* -info print GL implementation information
|
||||||
|
* -exit automatically exit after 30 seconds
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Brian Paul
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Marcus Geelnard:
|
||||||
|
* - Conversion to GLFW
|
||||||
|
* - Time based rendering (frame rate independent)
|
||||||
|
* - Slightly modified camera that should work better for stereo viewing
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Camilla Berglund:
|
||||||
|
* - Removed FPS counter (this is not a benchmark)
|
||||||
|
* - Added a few comments
|
||||||
|
* - Enabled vsync
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <GL/glfw.h>
|
||||||
|
|
||||||
|
#ifndef M_PI
|
||||||
|
#define M_PI 3.141592654
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The program exits when this is zero.
|
||||||
|
*/
|
||||||
|
static int running = 1;
|
||||||
|
|
||||||
|
/* If non-zero, the program exits after that many seconds
|
||||||
|
*/
|
||||||
|
static int autoexit = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
|
||||||
|
Draw a gear wheel. You'll probably want to call this function when
|
||||||
|
building a display list since we do a lot of trig here.
|
||||||
|
|
||||||
|
Input: inner_radius - radius of hole at center
|
||||||
|
outer_radius - radius at center of teeth
|
||||||
|
width - width of gear teeth - number of teeth
|
||||||
|
tooth_depth - depth of tooth
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
static void
|
||||||
|
gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
|
||||||
|
GLint teeth, GLfloat tooth_depth)
|
||||||
|
{
|
||||||
|
GLint i;
|
||||||
|
GLfloat r0, r1, r2;
|
||||||
|
GLfloat angle, da;
|
||||||
|
GLfloat u, v, len;
|
||||||
|
|
||||||
|
r0 = inner_radius;
|
||||||
|
r1 = outer_radius - tooth_depth / 2.f;
|
||||||
|
r2 = outer_radius + tooth_depth / 2.f;
|
||||||
|
|
||||||
|
da = 2.f * (float) M_PI / teeth / 4.f;
|
||||||
|
|
||||||
|
glShadeModel(GL_FLAT);
|
||||||
|
|
||||||
|
glNormal3f(0.f, 0.f, 1.f);
|
||||||
|
|
||||||
|
/* draw front face */
|
||||||
|
glBegin(GL_QUAD_STRIP);
|
||||||
|
for (i = 0; i <= teeth; i++) {
|
||||||
|
angle = i * 2.f * (float) M_PI / teeth;
|
||||||
|
glVertex3f(r0 * (float) cos(angle), r0 * (float) sin(angle), width * 0.5f);
|
||||||
|
glVertex3f(r1 * (float) cos(angle), r1 * (float) sin(angle), width * 0.5f);
|
||||||
|
if (i < teeth) {
|
||||||
|
glVertex3f(r0 * (float) cos(angle), r0 * (float) sin(angle), width * 0.5f);
|
||||||
|
glVertex3f(r1 * (float) cos(angle + 3 * da), r1 * (float) sin(angle + 3 * da), width * 0.5f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
/* draw front sides of teeth */
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
da = 2.f * (float) M_PI / teeth / 4.f;
|
||||||
|
for (i = 0; i < teeth; i++) {
|
||||||
|
angle = i * 2.f * (float) M_PI / teeth;
|
||||||
|
|
||||||
|
glVertex3f(r1 * (float) cos(angle), r1 * (float) sin(angle), width * 0.5f);
|
||||||
|
glVertex3f(r2 * (float) cos(angle + da), r2 * (float) sin(angle + da), width * 0.5f);
|
||||||
|
glVertex3f(r2 * (float) cos(angle + 2 * da), r2 * (float) sin(angle + 2 * da), width * 0.5f);
|
||||||
|
glVertex3f(r1 * (float) cos(angle + 3 * da), r1 * (float) sin(angle + 3 * da), width * 0.5f);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
glNormal3f(0.0, 0.0, -1.0);
|
||||||
|
|
||||||
|
/* draw back face */
|
||||||
|
glBegin(GL_QUAD_STRIP);
|
||||||
|
for (i = 0; i <= teeth; i++) {
|
||||||
|
angle = i * 2.f * (float) M_PI / teeth;
|
||||||
|
glVertex3f(r1 * (float) cos(angle), r1 * (float) sin(angle), -width * 0.5f);
|
||||||
|
glVertex3f(r0 * (float) cos(angle), r0 * (float) sin(angle), -width * 0.5f);
|
||||||
|
if (i < teeth) {
|
||||||
|
glVertex3f(r1 * (float) cos(angle + 3 * da), r1 * (float) sin(angle + 3 * da), -width * 0.5f);
|
||||||
|
glVertex3f(r0 * (float) cos(angle), r0 * (float) sin(angle), -width * 0.5f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
/* draw back sides of teeth */
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
da = 2.f * (float) M_PI / teeth / 4.f;
|
||||||
|
for (i = 0; i < teeth; i++) {
|
||||||
|
angle = i * 2.f * (float) M_PI / teeth;
|
||||||
|
|
||||||
|
glVertex3f(r1 * (float) cos(angle + 3 * da), r1 * (float) sin(angle + 3 * da), -width * 0.5f);
|
||||||
|
glVertex3f(r2 * (float) cos(angle + 2 * da), r2 * (float) sin(angle + 2 * da), -width * 0.5f);
|
||||||
|
glVertex3f(r2 * (float) cos(angle + da), r2 * (float) sin(angle + da), -width * 0.5f);
|
||||||
|
glVertex3f(r1 * (float) cos(angle), r1 * (float) sin(angle), -width * 0.5f);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
/* draw outward faces of teeth */
|
||||||
|
glBegin(GL_QUAD_STRIP);
|
||||||
|
for (i = 0; i < teeth; i++) {
|
||||||
|
angle = i * 2.f * (float) M_PI / teeth;
|
||||||
|
|
||||||
|
glVertex3f(r1 * (float) cos(angle), r1 * (float) sin(angle), width * 0.5f);
|
||||||
|
glVertex3f(r1 * (float) cos(angle), r1 * (float) sin(angle), -width * 0.5f);
|
||||||
|
u = r2 * (float) cos(angle + da) - r1 * (float) cos(angle);
|
||||||
|
v = r2 * (float) sin(angle + da) - r1 * (float) sin(angle);
|
||||||
|
len = (float) sqrt(u * u + v * v);
|
||||||
|
u /= len;
|
||||||
|
v /= len;
|
||||||
|
glNormal3f(v, -u, 0.0);
|
||||||
|
glVertex3f(r2 * (float) cos(angle + da), r2 * (float) sin(angle + da), width * 0.5f);
|
||||||
|
glVertex3f(r2 * (float) cos(angle + da), r2 * (float) sin(angle + da), -width * 0.5f);
|
||||||
|
glNormal3f((float) cos(angle), (float) sin(angle), 0.f);
|
||||||
|
glVertex3f(r2 * (float) cos(angle + 2 * da), r2 * (float) sin(angle + 2 * da), width * 0.5f);
|
||||||
|
glVertex3f(r2 * (float) cos(angle + 2 * da), r2 * (float) sin(angle + 2 * da), -width * 0.5f);
|
||||||
|
u = r1 * (float) cos(angle + 3 * da) - r2 * (float) cos(angle + 2 * da);
|
||||||
|
v = r1 * (float) sin(angle + 3 * da) - r2 * (float) sin(angle + 2 * da);
|
||||||
|
glNormal3f(v, -u, 0.f);
|
||||||
|
glVertex3f(r1 * (float) cos(angle + 3 * da), r1 * (float) sin(angle + 3 * da), width * 0.5f);
|
||||||
|
glVertex3f(r1 * (float) cos(angle + 3 * da), r1 * (float) sin(angle + 3 * da), -width * 0.5f);
|
||||||
|
glNormal3f((float) cos(angle), (float) sin(angle), 0.f);
|
||||||
|
}
|
||||||
|
|
||||||
|
glVertex3f(r1 * (float) cos(0), r1 * (float) sin(0), width * 0.5f);
|
||||||
|
glVertex3f(r1 * (float) cos(0), r1 * (float) sin(0), -width * 0.5f);
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
glShadeModel(GL_SMOOTH);
|
||||||
|
|
||||||
|
/* draw inside radius cylinder */
|
||||||
|
glBegin(GL_QUAD_STRIP);
|
||||||
|
for (i = 0; i <= teeth; i++) {
|
||||||
|
angle = i * 2.f * (float) M_PI / teeth;
|
||||||
|
glNormal3f(-(float) cos(angle), -(float) sin(angle), 0.f);
|
||||||
|
glVertex3f(r0 * (float) cos(angle), r0 * (float) sin(angle), -width * 0.5f);
|
||||||
|
glVertex3f(r0 * (float) cos(angle), r0 * (float) sin(angle), width * 0.5f);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static GLfloat view_rotx = 20.f, view_roty = 30.f, view_rotz = 0.f;
|
||||||
|
static GLint gear1, gear2, gear3;
|
||||||
|
static GLfloat angle = 0.f;
|
||||||
|
|
||||||
|
/* OpenGL draw function & timing */
|
||||||
|
static void draw(void)
|
||||||
|
{
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
|
glPushMatrix();
|
||||||
|
glRotatef(view_rotx, 1.0, 0.0, 0.0);
|
||||||
|
glRotatef(view_roty, 0.0, 1.0, 0.0);
|
||||||
|
glRotatef(view_rotz, 0.0, 0.0, 1.0);
|
||||||
|
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef(-3.0, -2.0, 0.0);
|
||||||
|
glRotatef(angle, 0.0, 0.0, 1.0);
|
||||||
|
glCallList(gear1);
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef(3.1f, -2.f, 0.f);
|
||||||
|
glRotatef(-2.f * angle - 9.f, 0.f, 0.f, 1.f);
|
||||||
|
glCallList(gear2);
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef(-3.1f, 4.2f, 0.f);
|
||||||
|
glRotatef(-2.f * angle - 25.f, 0.f, 0.f, 1.f);
|
||||||
|
glCallList(gear3);
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* update animation parameters */
|
||||||
|
static void animate(void)
|
||||||
|
{
|
||||||
|
angle = 100.f * (float) glfwGetTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* change view angle, exit upon ESC */
|
||||||
|
void key( int k, int action )
|
||||||
|
{
|
||||||
|
if( action != GLFW_PRESS ) return;
|
||||||
|
|
||||||
|
switch (k) {
|
||||||
|
case 'Z':
|
||||||
|
if( glfwGetKey( GLFW_KEY_LSHIFT ) )
|
||||||
|
view_rotz -= 5.0;
|
||||||
|
else
|
||||||
|
view_rotz += 5.0;
|
||||||
|
break;
|
||||||
|
case GLFW_KEY_ESC:
|
||||||
|
running = 0;
|
||||||
|
break;
|
||||||
|
case GLFW_KEY_UP:
|
||||||
|
view_rotx += 5.0;
|
||||||
|
break;
|
||||||
|
case GLFW_KEY_DOWN:
|
||||||
|
view_rotx -= 5.0;
|
||||||
|
break;
|
||||||
|
case GLFW_KEY_LEFT:
|
||||||
|
view_roty += 5.0;
|
||||||
|
break;
|
||||||
|
case GLFW_KEY_RIGHT:
|
||||||
|
view_roty -= 5.0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* new window size */
|
||||||
|
void reshape( int width, int height )
|
||||||
|
{
|
||||||
|
GLfloat h = (GLfloat) height / (GLfloat) width;
|
||||||
|
GLfloat xmax, znear, zfar;
|
||||||
|
|
||||||
|
znear = 5.0f;
|
||||||
|
zfar = 30.0f;
|
||||||
|
xmax = znear * 0.5f;
|
||||||
|
|
||||||
|
glViewport( 0, 0, (GLint) width, (GLint) height );
|
||||||
|
glMatrixMode( GL_PROJECTION );
|
||||||
|
glLoadIdentity();
|
||||||
|
glFrustum( -xmax, xmax, -xmax*h, xmax*h, znear, zfar );
|
||||||
|
glMatrixMode( GL_MODELVIEW );
|
||||||
|
glLoadIdentity();
|
||||||
|
glTranslatef( 0.0, 0.0, -20.0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* program & OpenGL initialization */
|
||||||
|
static void init(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
static GLfloat pos[4] = {5.f, 5.f, 10.f, 0.f};
|
||||||
|
static GLfloat red[4] = {0.8f, 0.1f, 0.f, 1.f};
|
||||||
|
static GLfloat green[4] = {0.f, 0.8f, 0.2f, 1.f};
|
||||||
|
static GLfloat blue[4] = {0.2f, 0.2f, 1.f, 1.f};
|
||||||
|
GLint i;
|
||||||
|
|
||||||
|
glLightfv(GL_LIGHT0, GL_POSITION, pos);
|
||||||
|
glEnable(GL_CULL_FACE);
|
||||||
|
glEnable(GL_LIGHTING);
|
||||||
|
glEnable(GL_LIGHT0);
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
|
/* make the gears */
|
||||||
|
gear1 = glGenLists(1);
|
||||||
|
glNewList(gear1, GL_COMPILE);
|
||||||
|
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
|
||||||
|
gear(1.f, 4.f, 1.f, 20, 0.7f);
|
||||||
|
glEndList();
|
||||||
|
|
||||||
|
gear2 = glGenLists(1);
|
||||||
|
glNewList(gear2, GL_COMPILE);
|
||||||
|
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
|
||||||
|
gear(0.5f, 2.f, 2.f, 10, 0.7f);
|
||||||
|
glEndList();
|
||||||
|
|
||||||
|
gear3 = glGenLists(1);
|
||||||
|
glNewList(gear3, GL_COMPILE);
|
||||||
|
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
|
||||||
|
gear(1.3f, 2.f, 0.5f, 10, 0.7f);
|
||||||
|
glEndList();
|
||||||
|
|
||||||
|
glEnable(GL_NORMALIZE);
|
||||||
|
|
||||||
|
for ( i=1; i<argc; i++ ) {
|
||||||
|
if (strcmp(argv[i], "-info")==0) {
|
||||||
|
printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
|
||||||
|
printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
|
||||||
|
printf("GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR));
|
||||||
|
printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
|
||||||
|
}
|
||||||
|
else if ( strcmp(argv[i], "-exit")==0) {
|
||||||
|
autoexit = 30;
|
||||||
|
printf("Auto Exit after %i seconds.\n", autoexit );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* program entry */
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
if( !glfwInit() )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "Failed to initialize GLFW\n" );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !glfwOpenWindow( 300,300, 0,0,0,0, 16,0, GLFW_WINDOW ) )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "Failed to open GLFW window\n" );
|
||||||
|
glfwTerminate();
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwSetWindowTitle( "Gears" );
|
||||||
|
glfwEnable( GLFW_KEY_REPEAT );
|
||||||
|
glfwSwapInterval( 1 );
|
||||||
|
|
||||||
|
// Parse command-line options
|
||||||
|
init(argc, argv);
|
||||||
|
|
||||||
|
// Set callback functions
|
||||||
|
glfwSetWindowSizeCallback( reshape );
|
||||||
|
glfwSetKeyCallback( key );
|
||||||
|
|
||||||
|
// Main loop
|
||||||
|
while( running )
|
||||||
|
{
|
||||||
|
// Draw gears
|
||||||
|
draw();
|
||||||
|
|
||||||
|
// Update animation
|
||||||
|
animate();
|
||||||
|
|
||||||
|
// Swap buffers
|
||||||
|
glfwSwapBuffers();
|
||||||
|
|
||||||
|
// Was the window closed?
|
||||||
|
if( !glfwGetWindowParam( GLFW_OPENED ) )
|
||||||
|
{
|
||||||
|
running = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Terminate GLFW
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
// Exit program
|
||||||
|
exit( EXIT_SUCCESS );
|
||||||
|
}
|
||||||
|
|
48
examples/listmodes.c
Normal file
48
examples/listmodes.c
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
//========================================================================
|
||||||
|
// This is a small test application for GLFW.
|
||||||
|
// The program lists all available fullscreen video modes.
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <GL/glfw.h>
|
||||||
|
|
||||||
|
// Maximum number of modes that we want to list
|
||||||
|
#define MAX_NUM_MODES 400
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// main()
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int main( void )
|
||||||
|
{
|
||||||
|
GLFWvidmode dtmode, modes[ MAX_NUM_MODES ];
|
||||||
|
int modecount, i;
|
||||||
|
|
||||||
|
// Initialize GLFW
|
||||||
|
if( !glfwInit() )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show desktop video mode
|
||||||
|
glfwGetDesktopMode( &dtmode );
|
||||||
|
printf( "Desktop mode: %d x %d x %d\n\n",
|
||||||
|
dtmode.Width, dtmode.Height, dtmode.RedBits +
|
||||||
|
dtmode.GreenBits + dtmode.BlueBits );
|
||||||
|
|
||||||
|
// List available video modes
|
||||||
|
modecount = glfwGetVideoModes( modes, MAX_NUM_MODES );
|
||||||
|
printf( "Available modes:\n" );
|
||||||
|
for( i = 0; i < modecount; i ++ )
|
||||||
|
{
|
||||||
|
printf( "%3d: %d x %d x %d\n", i,
|
||||||
|
modes[i].Width, modes[i].Height, modes[i].RedBits +
|
||||||
|
modes[i].GreenBits + modes[i].BlueBits );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Terminate GLFW
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
122
examples/mipmaps.c
Normal file
122
examples/mipmaps.c
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
//========================================================================
|
||||||
|
// This is an example program for the GLFW library
|
||||||
|
//
|
||||||
|
// It shows texture loading with mipmap generation and rendering with
|
||||||
|
// trilienar texture filtering
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <GL/glfw.h>
|
||||||
|
|
||||||
|
int main( void )
|
||||||
|
{
|
||||||
|
int width, height, x;
|
||||||
|
double time;
|
||||||
|
GLboolean running;
|
||||||
|
GLuint textureID;
|
||||||
|
char* texturePath = "mipmaps.tga";
|
||||||
|
|
||||||
|
// Initialise GLFW
|
||||||
|
if( !glfwInit() )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "Failed to initialize GLFW\n" );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open OpenGL window
|
||||||
|
if( !glfwOpenWindow( 640, 480, 0,0,0,0, 0,0, GLFW_WINDOW ) )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "Failed to open GLFW window\n" );
|
||||||
|
glfwTerminate();
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwSetWindowTitle( "Trilinear interpolation" );
|
||||||
|
|
||||||
|
// Enable sticky keys
|
||||||
|
glfwEnable( GLFW_STICKY_KEYS );
|
||||||
|
|
||||||
|
// Enable vertical sync (on cards that support it)
|
||||||
|
glfwSwapInterval( 1 );
|
||||||
|
|
||||||
|
// Generate and bind our texture ID
|
||||||
|
glGenTextures( 1, &textureID );
|
||||||
|
glBindTexture( GL_TEXTURE_2D, textureID );
|
||||||
|
|
||||||
|
// Load texture from file into video memory, including mipmap levels
|
||||||
|
if( !glfwLoadTexture2D( texturePath, GLFW_BUILD_MIPMAPS_BIT ) )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "Failed to load texture %s\n", texturePath );
|
||||||
|
glfwTerminate();
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use trilinear interpolation (GL_LINEAR_MIPMAP_LINEAR)
|
||||||
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
|
||||||
|
GL_LINEAR_MIPMAP_LINEAR );
|
||||||
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
|
||||||
|
GL_LINEAR );
|
||||||
|
|
||||||
|
// Enable plain 2D texturing
|
||||||
|
glEnable( GL_TEXTURE_2D );
|
||||||
|
|
||||||
|
running = GL_TRUE;
|
||||||
|
while( running )
|
||||||
|
{
|
||||||
|
// Get time and mouse position
|
||||||
|
time = glfwGetTime();
|
||||||
|
glfwGetMousePos( &x, NULL );
|
||||||
|
|
||||||
|
// Get window size (may be different than the requested size)
|
||||||
|
glfwGetWindowSize( &width, &height );
|
||||||
|
height = height > 0 ? height : 1;
|
||||||
|
|
||||||
|
// Set viewport
|
||||||
|
glViewport( 0, 0, width, height );
|
||||||
|
|
||||||
|
// Clear color buffer
|
||||||
|
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f);
|
||||||
|
glClear( GL_COLOR_BUFFER_BIT );
|
||||||
|
|
||||||
|
// Select and setup the projection matrix
|
||||||
|
glMatrixMode( GL_PROJECTION );
|
||||||
|
glLoadIdentity();
|
||||||
|
gluPerspective( 65.0f, (GLfloat)width / (GLfloat)height, 1.0f,
|
||||||
|
50.0f );
|
||||||
|
|
||||||
|
// Select and setup the modelview matrix
|
||||||
|
glMatrixMode( GL_MODELVIEW );
|
||||||
|
glLoadIdentity();
|
||||||
|
gluLookAt( 0.0f, 3.0f, -20.0f, // Eye-position
|
||||||
|
0.0f, -4.0f, -11.0f, // View-point
|
||||||
|
0.0f, 1.0f, 0.0f ); // Up-vector
|
||||||
|
|
||||||
|
// Draw a textured quad
|
||||||
|
glRotatef( 0.05f * (GLfloat)x + (GLfloat)time * 5.0f, 0.0f, 1.0f, 0.0f );
|
||||||
|
glBegin( GL_QUADS );
|
||||||
|
glTexCoord2f( -20.0f, 20.0f );
|
||||||
|
glVertex3f( -50.0f, 0.0f, -50.0f );
|
||||||
|
glTexCoord2f( 20.0f, 20.0f );
|
||||||
|
glVertex3f( 50.0f, 0.0f, -50.0f );
|
||||||
|
glTexCoord2f( 20.0f, -20.0f );
|
||||||
|
glVertex3f( 50.0f, 0.0f, 50.0f );
|
||||||
|
glTexCoord2f( -20.0f, -20.0f );
|
||||||
|
glVertex3f( -50.0f, 0.0f, 50.0f );
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
// Swap buffers
|
||||||
|
glfwSwapBuffers();
|
||||||
|
|
||||||
|
// Check if the ESC key was pressed or the window was closed
|
||||||
|
running = !glfwGetKey( GLFW_KEY_ESC ) &&
|
||||||
|
glfwGetWindowParam( GLFW_OPENED );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close OpenGL window and terminate GLFW
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
exit( EXIT_SUCCESS );
|
||||||
|
}
|
||||||
|
|
BIN
examples/mipmaps.tga
Normal file
BIN
examples/mipmaps.tga
Normal file
Binary file not shown.
1152
examples/particles.c
Normal file
1152
examples/particles.c
Normal file
File diff suppressed because it is too large
Load Diff
854
examples/pong3d.c
Normal file
854
examples/pong3d.c
Normal file
|
@ -0,0 +1,854 @@
|
||||||
|
//========================================================================
|
||||||
|
// This is a small test application for GLFW.
|
||||||
|
// This is an OpenGL port of the famous "PONG" game (the first computer
|
||||||
|
// game ever?). It is very simple, and could be improved alot. It was
|
||||||
|
// created in order to show off the gaming capabilities of GLFW.
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include <GL/glfw.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Constants
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
// Screen resolution
|
||||||
|
#define WIDTH 640
|
||||||
|
#define HEIGHT 480
|
||||||
|
|
||||||
|
// Player size (units)
|
||||||
|
#define PLAYER_XSIZE 0.05f
|
||||||
|
#define PLAYER_YSIZE 0.15f
|
||||||
|
|
||||||
|
// Ball size (units)
|
||||||
|
#define BALL_SIZE 0.02f
|
||||||
|
|
||||||
|
// Maximum player movement speed (units / second)
|
||||||
|
#define MAX_SPEED 1.5f
|
||||||
|
|
||||||
|
// Player movement acceleration (units / seconds^2)
|
||||||
|
#define ACCELERATION 4.0f
|
||||||
|
|
||||||
|
// Player movement deceleration (units / seconds^2)
|
||||||
|
#define DECELERATION 2.0f
|
||||||
|
|
||||||
|
// Ball movement speed (units / second)
|
||||||
|
#define BALL_SPEED 0.4f
|
||||||
|
|
||||||
|
// Menu options
|
||||||
|
#define MENU_NONE 0
|
||||||
|
#define MENU_PLAY 1
|
||||||
|
#define MENU_QUIT 2
|
||||||
|
|
||||||
|
// Game events
|
||||||
|
#define NOBODY_WINS 0
|
||||||
|
#define PLAYER1_WINS 1
|
||||||
|
#define PLAYER2_WINS 2
|
||||||
|
|
||||||
|
// Winner ID
|
||||||
|
#define NOBODY 0
|
||||||
|
#define PLAYER1 1
|
||||||
|
#define PLAYER2 2
|
||||||
|
|
||||||
|
// Camera positions
|
||||||
|
#define CAMERA_CLASSIC 0
|
||||||
|
#define CAMERA_ABOVE 1
|
||||||
|
#define CAMERA_SPECTATOR 2
|
||||||
|
#define CAMERA_DEFAULT CAMERA_CLASSIC
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Textures
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#define TEX_TITLE 0
|
||||||
|
#define TEX_MENU 1
|
||||||
|
#define TEX_INSTR 2
|
||||||
|
#define TEX_WINNER1 3
|
||||||
|
#define TEX_WINNER2 4
|
||||||
|
#define TEX_FIELD 5
|
||||||
|
#define NUM_TEXTURES 6
|
||||||
|
|
||||||
|
// Texture names
|
||||||
|
char * tex_name[ NUM_TEXTURES ] = {
|
||||||
|
"pong3d_title.tga",
|
||||||
|
"pong3d_menu.tga",
|
||||||
|
"pong3d_instr.tga",
|
||||||
|
"pong3d_winner1.tga",
|
||||||
|
"pong3d_winner2.tga",
|
||||||
|
"pong3d_field.tga"
|
||||||
|
};
|
||||||
|
|
||||||
|
// OpenGL texture object IDs
|
||||||
|
GLuint tex_id[ NUM_TEXTURES ];
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Global variables
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
// Display information
|
||||||
|
int width, height;
|
||||||
|
|
||||||
|
// Frame information
|
||||||
|
double thistime, oldtime, dt, starttime;
|
||||||
|
|
||||||
|
// Camera information
|
||||||
|
int camerapos;
|
||||||
|
|
||||||
|
// Player information
|
||||||
|
struct {
|
||||||
|
double ypos; // -1.0 to +1.0
|
||||||
|
double yspeed; // -MAX_SPEED to +MAX_SPEED
|
||||||
|
} player1, player2;
|
||||||
|
|
||||||
|
// Ball information
|
||||||
|
struct {
|
||||||
|
double xpos, ypos;
|
||||||
|
double xspeed, yspeed;
|
||||||
|
} ball;
|
||||||
|
|
||||||
|
// And the winner is...
|
||||||
|
int winner;
|
||||||
|
|
||||||
|
// Lighting configuration
|
||||||
|
const GLfloat env_ambient[4] = {1.0f,1.0f,1.0f,1.0f};
|
||||||
|
const GLfloat light1_position[4] = {-3.0f,3.0f,2.0f,1.0f};
|
||||||
|
const GLfloat light1_diffuse[4] = {1.0f,1.0f,1.0f,0.0f};
|
||||||
|
const GLfloat light1_ambient[4] = {0.0f,0.0f,0.0f,0.0f};
|
||||||
|
|
||||||
|
// Object material properties
|
||||||
|
const GLfloat player1_diffuse[4] = {1.0f,0.3f,0.3f,1.0f};
|
||||||
|
const GLfloat player1_ambient[4] = {0.3f,0.1f,0.0f,1.0f};
|
||||||
|
const GLfloat player2_diffuse[4] = {0.3f,1.0f,0.3f,1.0f};
|
||||||
|
const GLfloat player2_ambient[4] = {0.1f,0.3f,0.1f,1.0f};
|
||||||
|
const GLfloat ball_diffuse[4] = {1.0f,1.0f,0.5f,1.0f};
|
||||||
|
const GLfloat ball_ambient[4] = {0.3f,0.3f,0.1f,1.0f};
|
||||||
|
const GLfloat border_diffuse[4] = {0.3f,0.3f,1.0f,1.0f};
|
||||||
|
const GLfloat border_ambient[4] = {0.1f,0.1f,0.3f,1.0f};
|
||||||
|
const GLfloat floor_diffuse[4] = {1.0f,1.0f,1.0f,1.0f};
|
||||||
|
const GLfloat floor_ambient[4] = {0.3f,0.3f,0.3f,1.0f};
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// LoadTextures() - Load textures from disk and upload to OpenGL card
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLboolean LoadTextures( void )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// Generate texture objects
|
||||||
|
glGenTextures( NUM_TEXTURES, tex_id );
|
||||||
|
|
||||||
|
// Load textures
|
||||||
|
for( i = 0; i < NUM_TEXTURES; i ++ )
|
||||||
|
{
|
||||||
|
// Select texture object
|
||||||
|
glBindTexture( GL_TEXTURE_2D, tex_id[ i ] );
|
||||||
|
|
||||||
|
// Set texture parameters
|
||||||
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
|
||||||
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
|
||||||
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
|
||||||
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
|
||||||
|
|
||||||
|
// Upload texture from file to texture memory
|
||||||
|
if( !glfwLoadTexture2D( tex_name[ i ], 0 ) )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "Failed to load texture %s\n", tex_name[ i ] );
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// DrawImage() - Draw a 2D image as a texture
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void DrawImage( int texnum, float x1, float x2, float y1, float y2 )
|
||||||
|
{
|
||||||
|
glEnable( GL_TEXTURE_2D );
|
||||||
|
glBindTexture( GL_TEXTURE_2D, tex_id[ texnum ] );
|
||||||
|
glBegin( GL_QUADS );
|
||||||
|
glTexCoord2f( 0.0f, 1.0f );
|
||||||
|
glVertex2f( x1, y1 );
|
||||||
|
glTexCoord2f( 1.0f, 1.0f );
|
||||||
|
glVertex2f( x2, y1 );
|
||||||
|
glTexCoord2f( 1.0f, 0.0f );
|
||||||
|
glVertex2f( x2, y2 );
|
||||||
|
glTexCoord2f( 0.0f, 0.0f );
|
||||||
|
glVertex2f( x1, y2 );
|
||||||
|
glEnd();
|
||||||
|
glDisable( GL_TEXTURE_2D );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// GameMenu() - Game menu (returns menu option)
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int GameMenu( void )
|
||||||
|
{
|
||||||
|
int option;
|
||||||
|
|
||||||
|
// Enable sticky keys
|
||||||
|
glfwEnable( GLFW_STICKY_KEYS );
|
||||||
|
|
||||||
|
// Wait for a game menu key to be pressed
|
||||||
|
do
|
||||||
|
{
|
||||||
|
// Get window size
|
||||||
|
glfwGetWindowSize( &width, &height );
|
||||||
|
|
||||||
|
// Set viewport
|
||||||
|
glViewport( 0, 0, width, height );
|
||||||
|
|
||||||
|
// Clear display
|
||||||
|
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
|
||||||
|
glClear( GL_COLOR_BUFFER_BIT );
|
||||||
|
|
||||||
|
// Setup projection matrix
|
||||||
|
glMatrixMode( GL_PROJECTION );
|
||||||
|
glLoadIdentity();
|
||||||
|
glOrtho( 0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 1.0f );
|
||||||
|
|
||||||
|
// Setup modelview matrix
|
||||||
|
glMatrixMode( GL_MODELVIEW );
|
||||||
|
glLoadIdentity();
|
||||||
|
|
||||||
|
// Display title
|
||||||
|
glColor3f( 1.0f, 1.0f, 1.0f );
|
||||||
|
DrawImage( TEX_TITLE, 0.1f, 0.9f, 0.0f, 0.3f );
|
||||||
|
|
||||||
|
// Display menu
|
||||||
|
glColor3f( 1.0f, 1.0f, 0.0f );
|
||||||
|
DrawImage( TEX_MENU, 0.38f, 0.62f, 0.35f, 0.5f );
|
||||||
|
|
||||||
|
// Display instructions
|
||||||
|
glColor3f( 0.0f, 1.0f, 1.0f );
|
||||||
|
DrawImage( TEX_INSTR, 0.32f, 0.68f, 0.65f, 0.85f );
|
||||||
|
|
||||||
|
// Swap buffers
|
||||||
|
glfwSwapBuffers();
|
||||||
|
|
||||||
|
// Check for keys
|
||||||
|
if( glfwGetKey( 'Q' ) || !glfwGetWindowParam( GLFW_OPENED ) )
|
||||||
|
{
|
||||||
|
option = MENU_QUIT;
|
||||||
|
}
|
||||||
|
else if( glfwGetKey( GLFW_KEY_F1 ) )
|
||||||
|
{
|
||||||
|
option = MENU_PLAY;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
option = MENU_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// To avoid horrible busy waiting, sleep for at least 20 ms
|
||||||
|
glfwSleep( 0.02 );
|
||||||
|
}
|
||||||
|
while( option == MENU_NONE );
|
||||||
|
|
||||||
|
// Disable sticky keys
|
||||||
|
glfwDisable( GLFW_STICKY_KEYS );
|
||||||
|
|
||||||
|
return option;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// NewGame() - Initialize a new game
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void NewGame( void )
|
||||||
|
{
|
||||||
|
// Frame information
|
||||||
|
starttime = thistime = glfwGetTime();
|
||||||
|
|
||||||
|
// Camera information
|
||||||
|
camerapos = CAMERA_DEFAULT;
|
||||||
|
|
||||||
|
// Player 1 information
|
||||||
|
player1.ypos = 0.0;
|
||||||
|
player1.yspeed = 0.0;
|
||||||
|
|
||||||
|
// Player 2 information
|
||||||
|
player2.ypos = 0.0;
|
||||||
|
player2.yspeed = 0.0;
|
||||||
|
|
||||||
|
// Ball information
|
||||||
|
ball.xpos = -1.0 + PLAYER_XSIZE;
|
||||||
|
ball.ypos = player1.ypos;
|
||||||
|
ball.xspeed = 1.0;
|
||||||
|
ball.yspeed = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// PlayerControl() - Player control
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void PlayerControl( void )
|
||||||
|
{
|
||||||
|
float joy1pos[ 2 ], joy2pos[ 2 ];
|
||||||
|
|
||||||
|
// Get joystick X & Y axis positions
|
||||||
|
glfwGetJoystickPos( GLFW_JOYSTICK_1, joy1pos, 2 );
|
||||||
|
glfwGetJoystickPos( GLFW_JOYSTICK_2, joy2pos, 2 );
|
||||||
|
|
||||||
|
// Player 1 control
|
||||||
|
if( glfwGetKey( 'A' ) || joy1pos[ 1 ] > 0.2f )
|
||||||
|
{
|
||||||
|
player1.yspeed += dt * ACCELERATION;
|
||||||
|
if( player1.yspeed > MAX_SPEED )
|
||||||
|
{
|
||||||
|
player1.yspeed = MAX_SPEED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( glfwGetKey( 'Z' ) || joy1pos[ 1 ] < -0.2f )
|
||||||
|
{
|
||||||
|
player1.yspeed -= dt * ACCELERATION;
|
||||||
|
if( player1.yspeed < -MAX_SPEED )
|
||||||
|
{
|
||||||
|
player1.yspeed = -MAX_SPEED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
player1.yspeed /= exp( DECELERATION * dt );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Player 2 control
|
||||||
|
if( glfwGetKey( 'K' ) || joy2pos[ 1 ] > 0.2f )
|
||||||
|
{
|
||||||
|
player2.yspeed += dt * ACCELERATION;
|
||||||
|
if( player2.yspeed > MAX_SPEED )
|
||||||
|
{
|
||||||
|
player2.yspeed = MAX_SPEED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( glfwGetKey( 'M' ) || joy2pos[ 1 ] < -0.2f )
|
||||||
|
{
|
||||||
|
player2.yspeed -= dt * ACCELERATION;
|
||||||
|
if( player2.yspeed < -MAX_SPEED )
|
||||||
|
{
|
||||||
|
player2.yspeed = -MAX_SPEED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
player2.yspeed /= exp( DECELERATION * dt );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update player 1 position
|
||||||
|
player1.ypos += dt * player1.yspeed;
|
||||||
|
if( player1.ypos > 1.0 - PLAYER_YSIZE )
|
||||||
|
{
|
||||||
|
player1.ypos = 1.0 - PLAYER_YSIZE;
|
||||||
|
player1.yspeed = 0.0;
|
||||||
|
}
|
||||||
|
else if( player1.ypos < -1.0 + PLAYER_YSIZE )
|
||||||
|
{
|
||||||
|
player1.ypos = -1.0 + PLAYER_YSIZE;
|
||||||
|
player1.yspeed = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update player 2 position
|
||||||
|
player2.ypos += dt * player2.yspeed;
|
||||||
|
if( player2.ypos > 1.0 - PLAYER_YSIZE )
|
||||||
|
{
|
||||||
|
player2.ypos = 1.0 - PLAYER_YSIZE;
|
||||||
|
player2.yspeed = 0.0;
|
||||||
|
}
|
||||||
|
else if( player2.ypos < -1.0 + PLAYER_YSIZE )
|
||||||
|
{
|
||||||
|
player2.ypos = -1.0 + PLAYER_YSIZE;
|
||||||
|
player2.yspeed = 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// BallControl() - Ball control
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int BallControl( void )
|
||||||
|
{
|
||||||
|
int event;
|
||||||
|
double ballspeed;
|
||||||
|
|
||||||
|
// Calculate new ball speed
|
||||||
|
ballspeed = BALL_SPEED * (1.0 + 0.02*(thistime-starttime));
|
||||||
|
ball.xspeed = ball.xspeed > 0 ? ballspeed : -ballspeed;
|
||||||
|
ball.yspeed = ball.yspeed > 0 ? ballspeed : -ballspeed;
|
||||||
|
ball.yspeed *= 0.74321;
|
||||||
|
|
||||||
|
// Update ball position
|
||||||
|
ball.xpos += dt * ball.xspeed;
|
||||||
|
ball.ypos += dt * ball.yspeed;
|
||||||
|
|
||||||
|
// Did the ball hit a top/bottom wall?
|
||||||
|
if( ball.ypos >= 1.0 )
|
||||||
|
{
|
||||||
|
ball.ypos = 2.0 - ball.ypos;
|
||||||
|
ball.yspeed = -ball.yspeed;
|
||||||
|
}
|
||||||
|
else if( ball.ypos <= -1.0 )
|
||||||
|
{
|
||||||
|
ball.ypos = -2.0 - ball.ypos;
|
||||||
|
ball.yspeed = -ball.yspeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Did the ball hit/miss a player?
|
||||||
|
event = NOBODY_WINS;
|
||||||
|
|
||||||
|
// Is the ball entering the player 1 goal?
|
||||||
|
if( ball.xpos < -1.0 + PLAYER_XSIZE )
|
||||||
|
{
|
||||||
|
// Did player 1 catch the ball?
|
||||||
|
if( ball.ypos > (player1.ypos-PLAYER_YSIZE) &&
|
||||||
|
ball.ypos < (player1.ypos+PLAYER_YSIZE) )
|
||||||
|
{
|
||||||
|
ball.xpos = -2.0 + 2.0*PLAYER_XSIZE - ball.xpos;
|
||||||
|
ball.xspeed = -ball.xspeed;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
event = PLAYER2_WINS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is the ball entering the player 2 goal?
|
||||||
|
if( ball.xpos > 1.0 - PLAYER_XSIZE )
|
||||||
|
{
|
||||||
|
// Did player 2 catch the ball?
|
||||||
|
if( ball.ypos > (player2.ypos-PLAYER_YSIZE) &&
|
||||||
|
ball.ypos < (player2.ypos+PLAYER_YSIZE) )
|
||||||
|
{
|
||||||
|
ball.xpos = 2.0 - 2.0*PLAYER_XSIZE - ball.xpos;
|
||||||
|
ball.xspeed = -ball.xspeed;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
event = PLAYER1_WINS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return event;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// DrawBox() - Draw a 3D box
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#define TEX_SCALE 4.0f
|
||||||
|
|
||||||
|
|
||||||
|
void DrawBox( float x1, float y1, float z1, float x2, float y2, float z2 )
|
||||||
|
{
|
||||||
|
// Draw six sides of a cube
|
||||||
|
glBegin( GL_QUADS );
|
||||||
|
// Side 1 (down)
|
||||||
|
glNormal3f( 0.0f, 0.0f, -1.0f );
|
||||||
|
glTexCoord2f( 0.0f, 0.0f );
|
||||||
|
glVertex3f( x1,y2,z1 );
|
||||||
|
glTexCoord2f( TEX_SCALE, 0.0f );
|
||||||
|
glVertex3f( x2,y2,z1 );
|
||||||
|
glTexCoord2f( TEX_SCALE, TEX_SCALE );
|
||||||
|
glVertex3f( x2,y1,z1 );
|
||||||
|
glTexCoord2f( 0.0f, TEX_SCALE );
|
||||||
|
glVertex3f( x1,y1,z1 );
|
||||||
|
// Side 2 (up)
|
||||||
|
glNormal3f( 0.0f, 0.0f, 1.0f );
|
||||||
|
glTexCoord2f( 0.0f, 0.0f );
|
||||||
|
glVertex3f( x1,y1,z2 );
|
||||||
|
glTexCoord2f( TEX_SCALE, 0.0f );
|
||||||
|
glVertex3f( x2,y1,z2 );
|
||||||
|
glTexCoord2f( TEX_SCALE, TEX_SCALE );
|
||||||
|
glVertex3f( x2,y2,z2 );
|
||||||
|
glTexCoord2f( 0.0f, TEX_SCALE );
|
||||||
|
glVertex3f( x1,y2,z2 );
|
||||||
|
// Side 3 (backward)
|
||||||
|
glNormal3f( 0.0f, -1.0f, 0.0f );
|
||||||
|
glTexCoord2f( 0.0f, 0.0f );
|
||||||
|
glVertex3f( x1,y1,z1 );
|
||||||
|
glTexCoord2f( TEX_SCALE, 0.0f );
|
||||||
|
glVertex3f( x2,y1,z1 );
|
||||||
|
glTexCoord2f( TEX_SCALE, TEX_SCALE );
|
||||||
|
glVertex3f( x2,y1,z2 );
|
||||||
|
glTexCoord2f( 0.0f, TEX_SCALE );
|
||||||
|
glVertex3f( x1,y1,z2 );
|
||||||
|
// Side 4 (forward)
|
||||||
|
glNormal3f( 0.0f, 1.0f, 0.0f );
|
||||||
|
glTexCoord2f( 0.0f, 0.0f );
|
||||||
|
glVertex3f( x1,y2,z2 );
|
||||||
|
glTexCoord2f( TEX_SCALE, 0.0f );
|
||||||
|
glVertex3f( x2,y2,z2 );
|
||||||
|
glTexCoord2f( TEX_SCALE, TEX_SCALE );
|
||||||
|
glVertex3f( x2,y2,z1 );
|
||||||
|
glTexCoord2f( 0.0f, TEX_SCALE );
|
||||||
|
glVertex3f( x1,y2,z1 );
|
||||||
|
// Side 5 (left)
|
||||||
|
glNormal3f( -1.0f, 0.0f, 0.0f );
|
||||||
|
glTexCoord2f( 0.0f, 0.0f );
|
||||||
|
glVertex3f( x1,y1,z2 );
|
||||||
|
glTexCoord2f( TEX_SCALE, 0.0f );
|
||||||
|
glVertex3f( x1,y2,z2 );
|
||||||
|
glTexCoord2f( TEX_SCALE, TEX_SCALE );
|
||||||
|
glVertex3f( x1,y2,z1 );
|
||||||
|
glTexCoord2f( 0.0f, TEX_SCALE );
|
||||||
|
glVertex3f( x1,y1,z1 );
|
||||||
|
// Side 6 (right)
|
||||||
|
glNormal3f( 1.0f, 0.0f, 0.0f );
|
||||||
|
glTexCoord2f( 0.0f, 0.0f );
|
||||||
|
glVertex3f( x2,y1,z1 );
|
||||||
|
glTexCoord2f( TEX_SCALE, 0.0f );
|
||||||
|
glVertex3f( x2,y2,z1 );
|
||||||
|
glTexCoord2f( TEX_SCALE, TEX_SCALE );
|
||||||
|
glVertex3f( x2,y2,z2 );
|
||||||
|
glTexCoord2f( 0.0f, TEX_SCALE );
|
||||||
|
glVertex3f( x2,y1,z2 );
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// UpdateDisplay() - Draw graphics (all game related OpenGL stuff goes
|
||||||
|
// here)
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void UpdateDisplay( void )
|
||||||
|
{
|
||||||
|
// Get window size
|
||||||
|
glfwGetWindowSize( &width, &height );
|
||||||
|
|
||||||
|
// Set viewport
|
||||||
|
glViewport( 0, 0, width, height );
|
||||||
|
|
||||||
|
// Clear display
|
||||||
|
glClearColor( 0.02f, 0.02f, 0.02f, 0.0f );
|
||||||
|
glClearDepth( 1.0f );
|
||||||
|
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
|
||||||
|
|
||||||
|
// Setup projection matrix
|
||||||
|
glMatrixMode( GL_PROJECTION );
|
||||||
|
glLoadIdentity();
|
||||||
|
gluPerspective(
|
||||||
|
55.0f, // Angle of view
|
||||||
|
(GLfloat)width/(GLfloat)height, // Aspect
|
||||||
|
1.0f, // Near Z
|
||||||
|
100.0f // Far Z
|
||||||
|
);
|
||||||
|
|
||||||
|
// Setup modelview matrix
|
||||||
|
glMatrixMode( GL_MODELVIEW );
|
||||||
|
glLoadIdentity();
|
||||||
|
switch( camerapos )
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
case CAMERA_CLASSIC:
|
||||||
|
gluLookAt(
|
||||||
|
0.0f, 0.0f, 2.5f,
|
||||||
|
0.0f, 0.0f, 0.0f,
|
||||||
|
0.0f, 1.0f, 0.0f
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case CAMERA_ABOVE:
|
||||||
|
gluLookAt(
|
||||||
|
0.0f, 0.0f, 2.5f,
|
||||||
|
(float)ball.xpos, (float)ball.ypos, 0.0f,
|
||||||
|
0.0f, 1.0f, 0.0f
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case CAMERA_SPECTATOR:
|
||||||
|
gluLookAt(
|
||||||
|
0.0f, -2.0, 1.2f,
|
||||||
|
(float)ball.xpos, (float)ball.ypos, 0.0f,
|
||||||
|
0.0f, 0.0f, 1.0f
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable depth testing
|
||||||
|
glEnable( GL_DEPTH_TEST );
|
||||||
|
glDepthFunc( GL_LEQUAL );
|
||||||
|
|
||||||
|
// Enable lighting
|
||||||
|
glEnable( GL_LIGHTING );
|
||||||
|
glLightModelfv( GL_LIGHT_MODEL_AMBIENT, env_ambient );
|
||||||
|
glLightModeli( GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE );
|
||||||
|
glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE );
|
||||||
|
glLightfv( GL_LIGHT1, GL_POSITION, light1_position );
|
||||||
|
glLightfv( GL_LIGHT1, GL_DIFFUSE, light1_diffuse );
|
||||||
|
glLightfv( GL_LIGHT1, GL_AMBIENT, light1_ambient );
|
||||||
|
glEnable( GL_LIGHT1 );
|
||||||
|
|
||||||
|
// Front face is counter-clock-wise
|
||||||
|
glFrontFace( GL_CCW );
|
||||||
|
|
||||||
|
// Enable face culling (not necessary, but speeds up rendering)
|
||||||
|
glCullFace( GL_BACK );
|
||||||
|
glEnable( GL_CULL_FACE );
|
||||||
|
|
||||||
|
// Draw Player 1
|
||||||
|
glMaterialfv( GL_FRONT, GL_DIFFUSE, player1_diffuse );
|
||||||
|
glMaterialfv( GL_FRONT, GL_AMBIENT, player1_ambient );
|
||||||
|
DrawBox( -1.f, (GLfloat)player1.ypos-PLAYER_YSIZE, 0.f,
|
||||||
|
-1.f+PLAYER_XSIZE, (GLfloat)player1.ypos+PLAYER_YSIZE, 0.1f );
|
||||||
|
|
||||||
|
// Draw Player 2
|
||||||
|
glMaterialfv( GL_FRONT, GL_DIFFUSE, player2_diffuse );
|
||||||
|
glMaterialfv( GL_FRONT, GL_AMBIENT, player2_ambient );
|
||||||
|
DrawBox( 1.f-PLAYER_XSIZE, (GLfloat)player2.ypos-PLAYER_YSIZE, 0.f,
|
||||||
|
1.f, (GLfloat)player2.ypos+PLAYER_YSIZE, 0.1f );
|
||||||
|
|
||||||
|
// Draw Ball
|
||||||
|
glMaterialfv( GL_FRONT, GL_DIFFUSE, ball_diffuse );
|
||||||
|
glMaterialfv( GL_FRONT, GL_AMBIENT, ball_ambient );
|
||||||
|
DrawBox( (GLfloat)ball.xpos-BALL_SIZE, (GLfloat)ball.ypos-BALL_SIZE, 0.f,
|
||||||
|
(GLfloat)ball.xpos+BALL_SIZE, (GLfloat)ball.ypos+BALL_SIZE, BALL_SIZE*2 );
|
||||||
|
|
||||||
|
// Top game field border
|
||||||
|
glMaterialfv( GL_FRONT, GL_DIFFUSE, border_diffuse );
|
||||||
|
glMaterialfv( GL_FRONT, GL_AMBIENT, border_ambient );
|
||||||
|
DrawBox( -1.1f, 1.0f, 0.0f, 1.1f, 1.1f, 0.1f );
|
||||||
|
// Bottom game field border
|
||||||
|
glColor3f( 0.0f, 0.0f, 0.7f );
|
||||||
|
DrawBox( -1.1f, -1.1f, 0.0f, 1.1f, -1.0f, 0.1f );
|
||||||
|
// Left game field border
|
||||||
|
DrawBox( -1.1f, -1.0f, 0.0f, -1.0f, 1.0f, 0.1f );
|
||||||
|
// Left game field border
|
||||||
|
DrawBox( 1.0f, -1.0f, 0.0f, 1.1f, 1.0f, 0.1f );
|
||||||
|
|
||||||
|
// Enable texturing
|
||||||
|
glEnable( GL_TEXTURE_2D );
|
||||||
|
glBindTexture( GL_TEXTURE_2D, tex_id[ TEX_FIELD ] );
|
||||||
|
|
||||||
|
// Game field floor
|
||||||
|
glMaterialfv( GL_FRONT, GL_DIFFUSE, floor_diffuse );
|
||||||
|
glMaterialfv( GL_FRONT, GL_AMBIENT, floor_ambient );
|
||||||
|
DrawBox( -1.01f, -1.01f, -0.01f, 1.01f, 1.01f, 0.0f );
|
||||||
|
|
||||||
|
// Disable texturing
|
||||||
|
glDisable( GL_TEXTURE_2D );
|
||||||
|
|
||||||
|
// Disable face culling
|
||||||
|
glDisable( GL_CULL_FACE );
|
||||||
|
|
||||||
|
// Disable lighting
|
||||||
|
glDisable( GL_LIGHTING );
|
||||||
|
|
||||||
|
// Disable depth testing
|
||||||
|
glDisable( GL_DEPTH_TEST );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// GameOver()
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void GameOver( void )
|
||||||
|
{
|
||||||
|
// Enable sticky keys
|
||||||
|
glfwEnable( GLFW_STICKY_KEYS );
|
||||||
|
|
||||||
|
// Until the user presses ESC or SPACE
|
||||||
|
while( !glfwGetKey( GLFW_KEY_ESC ) && !glfwGetKey( ' ' ) &&
|
||||||
|
glfwGetWindowParam( GLFW_OPENED ) )
|
||||||
|
{
|
||||||
|
// Draw display
|
||||||
|
UpdateDisplay();
|
||||||
|
|
||||||
|
// Setup projection matrix
|
||||||
|
glMatrixMode( GL_PROJECTION );
|
||||||
|
glLoadIdentity();
|
||||||
|
glOrtho( 0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 1.0f );
|
||||||
|
|
||||||
|
// Setup modelview matrix
|
||||||
|
glMatrixMode( GL_MODELVIEW );
|
||||||
|
glLoadIdentity();
|
||||||
|
|
||||||
|
// Enable blending
|
||||||
|
glEnable( GL_BLEND );
|
||||||
|
|
||||||
|
// Dim background
|
||||||
|
glBlendFunc( GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA );
|
||||||
|
glColor4f( 0.3f, 0.3f, 0.3f, 0.3f );
|
||||||
|
glBegin( GL_QUADS );
|
||||||
|
glVertex2f( 0.0f, 0.0f );
|
||||||
|
glVertex2f( 1.0f, 0.0f );
|
||||||
|
glVertex2f( 1.0f, 1.0f );
|
||||||
|
glVertex2f( 0.0f, 1.0f );
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
// Display winner text
|
||||||
|
glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_COLOR );
|
||||||
|
if( winner == PLAYER1 )
|
||||||
|
{
|
||||||
|
glColor4f( 1.0f, 0.5f, 0.5f, 1.0f );
|
||||||
|
DrawImage( TEX_WINNER1, 0.35f, 0.65f, 0.46f, 0.54f );
|
||||||
|
}
|
||||||
|
else if( winner == PLAYER2 )
|
||||||
|
{
|
||||||
|
glColor4f( 0.5f, 1.0f, 0.5f, 1.0f );
|
||||||
|
DrawImage( TEX_WINNER2, 0.35f, 0.65f, 0.46f, 0.54f );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disable blending
|
||||||
|
glDisable( GL_BLEND );
|
||||||
|
|
||||||
|
// Swap buffers
|
||||||
|
glfwSwapBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disable sticky keys
|
||||||
|
glfwDisable( GLFW_STICKY_KEYS );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// GameLoop() - Game loop
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void GameLoop( void )
|
||||||
|
{
|
||||||
|
int playing, event;
|
||||||
|
|
||||||
|
// Initialize a new game
|
||||||
|
NewGame();
|
||||||
|
|
||||||
|
// Enable sticky keys
|
||||||
|
glfwEnable( GLFW_STICKY_KEYS );
|
||||||
|
|
||||||
|
// Loop until the game ends
|
||||||
|
playing = GL_TRUE;
|
||||||
|
while( playing && glfwGetWindowParam( GLFW_OPENED ) )
|
||||||
|
{
|
||||||
|
// Frame timer
|
||||||
|
oldtime = thistime;
|
||||||
|
thistime = glfwGetTime();
|
||||||
|
dt = thistime - oldtime;
|
||||||
|
|
||||||
|
// Get user input and update player positions
|
||||||
|
PlayerControl();
|
||||||
|
|
||||||
|
// Move the ball, and check if a player hits/misses the ball
|
||||||
|
event = BallControl();
|
||||||
|
|
||||||
|
// Did we have a winner?
|
||||||
|
switch( event )
|
||||||
|
{
|
||||||
|
case PLAYER1_WINS:
|
||||||
|
winner = PLAYER1;
|
||||||
|
playing = GL_FALSE;
|
||||||
|
break;
|
||||||
|
case PLAYER2_WINS:
|
||||||
|
winner = PLAYER2;
|
||||||
|
playing = GL_FALSE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Did the user press ESC?
|
||||||
|
if( glfwGetKey( GLFW_KEY_ESC ) )
|
||||||
|
{
|
||||||
|
playing = GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Did the user change camera view?
|
||||||
|
if( glfwGetKey( '1' ) )
|
||||||
|
{
|
||||||
|
camerapos = CAMERA_CLASSIC;
|
||||||
|
}
|
||||||
|
else if( glfwGetKey( '2' ) )
|
||||||
|
{
|
||||||
|
camerapos = CAMERA_ABOVE;
|
||||||
|
}
|
||||||
|
else if( glfwGetKey( '3' ) )
|
||||||
|
{
|
||||||
|
camerapos = CAMERA_SPECTATOR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw display
|
||||||
|
UpdateDisplay();
|
||||||
|
|
||||||
|
// Swap buffers
|
||||||
|
glfwSwapBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disable sticky keys
|
||||||
|
glfwDisable( GLFW_STICKY_KEYS );
|
||||||
|
|
||||||
|
// Show winner
|
||||||
|
GameOver();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// main() - Program entry point
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int main( void )
|
||||||
|
{
|
||||||
|
int menuoption;
|
||||||
|
|
||||||
|
// Initialize GLFW
|
||||||
|
if( !glfwInit() )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "Failed to initialize GLFW\n" );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open OpenGL window
|
||||||
|
if( !glfwOpenWindow( WIDTH, HEIGHT, 0,0,0,0, 16,0, GLFW_FULLSCREEN ) )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "Failed to open GLFW window\n" );
|
||||||
|
glfwTerminate();
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwSwapInterval( 1 );
|
||||||
|
|
||||||
|
// Load all textures
|
||||||
|
if( !LoadTextures() )
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Main loop
|
||||||
|
do
|
||||||
|
{
|
||||||
|
// Get menu option
|
||||||
|
menuoption = GameMenu();
|
||||||
|
|
||||||
|
// If the user wants to play, let him...
|
||||||
|
if( menuoption == MENU_PLAY )
|
||||||
|
{
|
||||||
|
GameLoop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while( menuoption != MENU_QUIT );
|
||||||
|
|
||||||
|
// Unload all textures
|
||||||
|
if( glfwGetWindowParam( GLFW_OPENED ) )
|
||||||
|
{
|
||||||
|
glDeleteTextures( NUM_TEXTURES, tex_id );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Terminate GLFW
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
exit( EXIT_SUCCESS );
|
||||||
|
}
|
||||||
|
|
BIN
examples/pong3d_field.tga
Normal file
BIN
examples/pong3d_field.tga
Normal file
Binary file not shown.
BIN
examples/pong3d_instr.tga
Normal file
BIN
examples/pong3d_instr.tga
Normal file
Binary file not shown.
BIN
examples/pong3d_menu.tga
Normal file
BIN
examples/pong3d_menu.tga
Normal file
Binary file not shown.
BIN
examples/pong3d_title.tga
Normal file
BIN
examples/pong3d_title.tga
Normal file
Binary file not shown.
BIN
examples/pong3d_winner1.tga
Normal file
BIN
examples/pong3d_winner1.tga
Normal file
Binary file not shown.
BIN
examples/pong3d_winner2.tga
Normal file
BIN
examples/pong3d_winner2.tga
Normal file
Binary file not shown.
514
examples/splitview.c
Normal file
514
examples/splitview.c
Normal file
|
@ -0,0 +1,514 @@
|
||||||
|
//========================================================================
|
||||||
|
// This is an example program for the GLFW library
|
||||||
|
//
|
||||||
|
// The program uses a "split window" view, rendering four views of the
|
||||||
|
// same scene in one window (e.g. uesful for 3D modelling software). This
|
||||||
|
// demo uses scissors to separete the four different rendering areas from
|
||||||
|
// each other.
|
||||||
|
//
|
||||||
|
// (If the code seems a little bit strange here and there, it may be
|
||||||
|
// because I am not a friend of orthogonal projections)
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include <GL/glfw.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#ifndef M_PI
|
||||||
|
#define M_PI 3.14159265358979323846
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Global variables
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
// Mouse position
|
||||||
|
static int xpos = 0, ypos = 0;
|
||||||
|
|
||||||
|
// Window size
|
||||||
|
static int width, height;
|
||||||
|
|
||||||
|
// Active view: 0 = none, 1 = upper left, 2 = upper right, 3 = lower left,
|
||||||
|
// 4 = lower right
|
||||||
|
static int active_view = 0;
|
||||||
|
|
||||||
|
// Rotation around each axis
|
||||||
|
static int rot_x = 0, rot_y = 0, rot_z = 0;
|
||||||
|
|
||||||
|
// Do redraw?
|
||||||
|
static int do_redraw = 1;
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Draw a solid torus (use a display list for the model)
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#define TORUS_MAJOR 1.5
|
||||||
|
#define TORUS_MINOR 0.5
|
||||||
|
#define TORUS_MAJOR_RES 32
|
||||||
|
#define TORUS_MINOR_RES 32
|
||||||
|
|
||||||
|
static void drawTorus( void )
|
||||||
|
{
|
||||||
|
static GLuint torus_list = 0;
|
||||||
|
int i, j, k;
|
||||||
|
double s, t, x, y, z, nx, ny, nz, scale, twopi;
|
||||||
|
|
||||||
|
if( !torus_list )
|
||||||
|
{
|
||||||
|
// Start recording displaylist
|
||||||
|
torus_list = glGenLists( 1 );
|
||||||
|
glNewList( torus_list, GL_COMPILE_AND_EXECUTE );
|
||||||
|
|
||||||
|
// Draw torus
|
||||||
|
twopi = 2.0 * M_PI;
|
||||||
|
for( i = 0; i < TORUS_MINOR_RES; i++ )
|
||||||
|
{
|
||||||
|
glBegin( GL_QUAD_STRIP );
|
||||||
|
for( j = 0; j <= TORUS_MAJOR_RES; j++ )
|
||||||
|
{
|
||||||
|
for( k = 1; k >= 0; k-- )
|
||||||
|
{
|
||||||
|
s = (i + k) % TORUS_MINOR_RES + 0.5;
|
||||||
|
t = j % TORUS_MAJOR_RES;
|
||||||
|
|
||||||
|
// Calculate point on surface
|
||||||
|
x = (TORUS_MAJOR+TORUS_MINOR*cos(s*twopi/TORUS_MINOR_RES))*cos(t*twopi/TORUS_MAJOR_RES);
|
||||||
|
y = TORUS_MINOR * sin(s * twopi / TORUS_MINOR_RES);
|
||||||
|
z = (TORUS_MAJOR+TORUS_MINOR*cos(s*twopi/TORUS_MINOR_RES))*sin(t*twopi/TORUS_MAJOR_RES);
|
||||||
|
|
||||||
|
// Calculate surface normal
|
||||||
|
nx = x - TORUS_MAJOR*cos(t*twopi/TORUS_MAJOR_RES);
|
||||||
|
ny = y;
|
||||||
|
nz = z - TORUS_MAJOR*sin(t*twopi/TORUS_MAJOR_RES);
|
||||||
|
scale = 1.0 / sqrt( nx*nx + ny*ny + nz*nz );
|
||||||
|
nx *= scale;
|
||||||
|
ny *= scale;
|
||||||
|
nz *= scale;
|
||||||
|
|
||||||
|
glNormal3f( (float)nx, (float)ny, (float)nz );
|
||||||
|
glVertex3f( (float)x, (float)y, (float)z );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop recording displaylist
|
||||||
|
glEndList();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Playback displaylist
|
||||||
|
glCallList( torus_list );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Draw the scene (a rotating torus)
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void drawScene( void )
|
||||||
|
{
|
||||||
|
const GLfloat model_diffuse[4] = {1.0f, 0.8f, 0.8f, 1.0f};
|
||||||
|
const GLfloat model_specular[4] = {0.6f, 0.6f, 0.6f, 1.0f};
|
||||||
|
const GLfloat model_shininess = 20.0f;
|
||||||
|
|
||||||
|
glPushMatrix();
|
||||||
|
|
||||||
|
// Rotate the object
|
||||||
|
glRotatef( (GLfloat)rot_x*0.5f, 1.0f, 0.0f, 0.0f );
|
||||||
|
glRotatef( (GLfloat)rot_y*0.5f, 0.0f, 1.0f, 0.0f );
|
||||||
|
glRotatef( (GLfloat)rot_z*0.5f, 0.0f, 0.0f, 1.0f );
|
||||||
|
|
||||||
|
// Set model color (used for orthogonal views, lighting disabled)
|
||||||
|
glColor4fv( model_diffuse );
|
||||||
|
|
||||||
|
// Set model material (used for perspective view, lighting enabled)
|
||||||
|
glMaterialfv( GL_FRONT, GL_DIFFUSE, model_diffuse );
|
||||||
|
glMaterialfv( GL_FRONT, GL_SPECULAR, model_specular );
|
||||||
|
glMaterialf( GL_FRONT, GL_SHININESS, model_shininess );
|
||||||
|
|
||||||
|
// Draw torus
|
||||||
|
drawTorus();
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Draw a 2D grid (used for orthogonal views)
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void drawGrid( float scale, int steps )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
float x, y;
|
||||||
|
|
||||||
|
glPushMatrix();
|
||||||
|
|
||||||
|
// Set background to some dark bluish grey
|
||||||
|
glClearColor( 0.05f, 0.05f, 0.2f, 0.0f);
|
||||||
|
glClear( GL_COLOR_BUFFER_BIT );
|
||||||
|
|
||||||
|
// Setup modelview matrix (flat XY view)
|
||||||
|
glLoadIdentity();
|
||||||
|
gluLookAt( 0.0, 0.0, 1.0,
|
||||||
|
0.0, 0.0, 0.0,
|
||||||
|
0.0, 1.0, 0.0 );
|
||||||
|
|
||||||
|
// We don't want to update the Z-buffer
|
||||||
|
glDepthMask( GL_FALSE );
|
||||||
|
|
||||||
|
// Set grid color
|
||||||
|
glColor3f( 0.0f, 0.5f, 0.5f );
|
||||||
|
|
||||||
|
glBegin( GL_LINES );
|
||||||
|
|
||||||
|
// Horizontal lines
|
||||||
|
x = scale * 0.5f * (float)(steps-1);
|
||||||
|
y = -scale * 0.5f * (float)(steps-1);
|
||||||
|
for( i = 0; i < steps; i ++ )
|
||||||
|
{
|
||||||
|
glVertex3f( -x, y, 0.0f );
|
||||||
|
glVertex3f( x, y, 0.0f );
|
||||||
|
y += scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vertical lines
|
||||||
|
x = -scale * 0.5f * (float)(steps-1);
|
||||||
|
y = scale * 0.5f * (float)(steps-1);
|
||||||
|
for( i = 0; i < steps; i ++ )
|
||||||
|
{
|
||||||
|
glVertex3f( x, -y, 0.0f );
|
||||||
|
glVertex3f( x, y, 0.0f );
|
||||||
|
x += scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
// Enable Z-buffer writing again
|
||||||
|
glDepthMask( GL_TRUE );
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Draw all views
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void drawAllViews( void )
|
||||||
|
{
|
||||||
|
const GLfloat light_position[4] = {0.0f, 8.0f, 8.0f, 1.0f};
|
||||||
|
const GLfloat light_diffuse[4] = {1.0f, 1.0f, 1.0f, 1.0f};
|
||||||
|
const GLfloat light_specular[4] = {1.0f, 1.0f, 1.0f, 1.0f};
|
||||||
|
const GLfloat light_ambient[4] = {0.2f, 0.2f, 0.3f, 1.0f};
|
||||||
|
double aspect;
|
||||||
|
|
||||||
|
// Calculate aspect of window
|
||||||
|
if( height > 0 )
|
||||||
|
{
|
||||||
|
aspect = (double)width / (double)height;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
aspect = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear screen
|
||||||
|
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f);
|
||||||
|
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
|
||||||
|
|
||||||
|
// Enable scissor test
|
||||||
|
glEnable( GL_SCISSOR_TEST );
|
||||||
|
|
||||||
|
// Enable depth test
|
||||||
|
glEnable( GL_DEPTH_TEST );
|
||||||
|
glDepthFunc( GL_LEQUAL );
|
||||||
|
|
||||||
|
|
||||||
|
// ** ORTHOGONAL VIEWS **
|
||||||
|
|
||||||
|
// For orthogonal views, use wireframe rendering
|
||||||
|
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
|
||||||
|
|
||||||
|
// Enable line anti-aliasing
|
||||||
|
glEnable( GL_LINE_SMOOTH );
|
||||||
|
glEnable( GL_BLEND );
|
||||||
|
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
|
||||||
|
|
||||||
|
// Setup orthogonal projection matrix
|
||||||
|
glMatrixMode( GL_PROJECTION );
|
||||||
|
glLoadIdentity();
|
||||||
|
glOrtho( -3.0*aspect, 3.0*aspect, -3.0, 3.0, 1.0, 50.0 );
|
||||||
|
|
||||||
|
// Upper left view (TOP VIEW)
|
||||||
|
glViewport( 0, height/2, width/2, height/2 );
|
||||||
|
glScissor( 0, height/2, width/2, height/2 );
|
||||||
|
glMatrixMode( GL_MODELVIEW );
|
||||||
|
glLoadIdentity();
|
||||||
|
gluLookAt( 0.0f, 10.0f, 1e-3f, // Eye-position (above)
|
||||||
|
0.0f, 0.0f, 0.0f, // View-point
|
||||||
|
0.0f, 1.0f, 0.0f ); // Up-vector
|
||||||
|
drawGrid( 0.5, 12 );
|
||||||
|
drawScene();
|
||||||
|
|
||||||
|
// Lower left view (FRONT VIEW)
|
||||||
|
glViewport( 0, 0, width/2, height/2 );
|
||||||
|
glScissor( 0, 0, width/2, height/2 );
|
||||||
|
glMatrixMode( GL_MODELVIEW );
|
||||||
|
glLoadIdentity();
|
||||||
|
gluLookAt( 0.0f, 0.0f, 10.0f, // Eye-position (in front of)
|
||||||
|
0.0f, 0.0f, 0.0f, // View-point
|
||||||
|
0.0f, 1.0f, 0.0f ); // Up-vector
|
||||||
|
drawGrid( 0.5, 12 );
|
||||||
|
drawScene();
|
||||||
|
|
||||||
|
// Lower right view (SIDE VIEW)
|
||||||
|
glViewport( width/2, 0, width/2, height/2 );
|
||||||
|
glScissor( width/2, 0, width/2, height/2 );
|
||||||
|
glMatrixMode( GL_MODELVIEW );
|
||||||
|
glLoadIdentity();
|
||||||
|
gluLookAt( 10.0f, 0.0f, 0.0f, // Eye-position (to the right)
|
||||||
|
0.0f, 0.0f, 0.0f, // View-point
|
||||||
|
0.0f, 1.0f, 0.0f ); // Up-vector
|
||||||
|
drawGrid( 0.5, 12 );
|
||||||
|
drawScene();
|
||||||
|
|
||||||
|
// Disable line anti-aliasing
|
||||||
|
glDisable( GL_LINE_SMOOTH );
|
||||||
|
glDisable( GL_BLEND );
|
||||||
|
|
||||||
|
|
||||||
|
// ** PERSPECTIVE VIEW **
|
||||||
|
|
||||||
|
// For perspective view, use solid rendering
|
||||||
|
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
|
||||||
|
|
||||||
|
// Enable face culling (faster rendering)
|
||||||
|
glEnable( GL_CULL_FACE );
|
||||||
|
glCullFace( GL_BACK );
|
||||||
|
glFrontFace( GL_CW );
|
||||||
|
|
||||||
|
// Setup perspective projection matrix
|
||||||
|
glMatrixMode( GL_PROJECTION );
|
||||||
|
glLoadIdentity();
|
||||||
|
gluPerspective( 65.0f, aspect, 1.0f, 50.0f );
|
||||||
|
|
||||||
|
// Upper right view (PERSPECTIVE VIEW)
|
||||||
|
glViewport( width/2, height/2, width/2, height/2 );
|
||||||
|
glScissor( width/2, height/2, width/2, height/2 );
|
||||||
|
glMatrixMode( GL_MODELVIEW );
|
||||||
|
glLoadIdentity();
|
||||||
|
gluLookAt( 3.0f, 1.5f, 3.0f, // Eye-position
|
||||||
|
0.0f, 0.0f, 0.0f, // View-point
|
||||||
|
0.0f, 1.0f, 0.0f ); // Up-vector
|
||||||
|
|
||||||
|
// Configure and enable light source 1
|
||||||
|
glLightfv( GL_LIGHT1, GL_POSITION, light_position );
|
||||||
|
glLightfv( GL_LIGHT1, GL_AMBIENT, light_ambient );
|
||||||
|
glLightfv( GL_LIGHT1, GL_DIFFUSE, light_diffuse );
|
||||||
|
glLightfv( GL_LIGHT1, GL_SPECULAR, light_specular );
|
||||||
|
glEnable( GL_LIGHT1 );
|
||||||
|
glEnable( GL_LIGHTING );
|
||||||
|
|
||||||
|
// Draw scene
|
||||||
|
drawScene();
|
||||||
|
|
||||||
|
// Disable lighting
|
||||||
|
glDisable( GL_LIGHTING );
|
||||||
|
|
||||||
|
// Disable face culling
|
||||||
|
glDisable( GL_CULL_FACE );
|
||||||
|
|
||||||
|
// Disable depth test
|
||||||
|
glDisable( GL_DEPTH_TEST );
|
||||||
|
|
||||||
|
// Disable scissor test
|
||||||
|
glDisable( GL_SCISSOR_TEST );
|
||||||
|
|
||||||
|
|
||||||
|
// Draw a border around the active view
|
||||||
|
if( active_view > 0 && active_view != 2 )
|
||||||
|
{
|
||||||
|
glViewport( 0, 0, width, height );
|
||||||
|
glMatrixMode( GL_PROJECTION );
|
||||||
|
glLoadIdentity();
|
||||||
|
glOrtho( 0.0, 2.0, 0.0, 2.0, 0.0, 1.0 );
|
||||||
|
glMatrixMode( GL_MODELVIEW );
|
||||||
|
glLoadIdentity();
|
||||||
|
glColor3f( 1.0f, 1.0f, 0.6f );
|
||||||
|
glTranslatef( (GLfloat) ((active_view - 1) & 1), (GLfloat) (1 - (active_view - 1) / 2), 0.0f );
|
||||||
|
glBegin( GL_LINE_STRIP );
|
||||||
|
glVertex2i( 0, 0 );
|
||||||
|
glVertex2i( 1, 0 );
|
||||||
|
glVertex2i( 1, 1 );
|
||||||
|
glVertex2i( 0, 1 );
|
||||||
|
glVertex2i( 0, 0 );
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Window size callback function
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void windowSizeFun( int w, int h )
|
||||||
|
{
|
||||||
|
width = w;
|
||||||
|
height = h > 0 ? h : 1;
|
||||||
|
do_redraw = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Window refresh callback function
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void windowRefreshFun( void )
|
||||||
|
{
|
||||||
|
do_redraw = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Mouse position callback function
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void mousePosFun( int x, int y )
|
||||||
|
{
|
||||||
|
// Depending on which view was selected, rotate around different axes
|
||||||
|
switch( active_view )
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
rot_x += y - ypos;
|
||||||
|
rot_z += x - xpos;
|
||||||
|
do_redraw = 1;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
rot_x += y - ypos;
|
||||||
|
rot_y += x - xpos;
|
||||||
|
do_redraw = 1;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
rot_y += x - xpos;
|
||||||
|
rot_z += y - ypos;
|
||||||
|
do_redraw = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// Do nothing for perspective view, or if no view is selected
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remember mouse position
|
||||||
|
xpos = x;
|
||||||
|
ypos = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Mouse button callback function
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void mouseButtonFun( int button, int action )
|
||||||
|
{
|
||||||
|
// Button clicked?
|
||||||
|
if( ( button == GLFW_MOUSE_BUTTON_LEFT ) && action == GLFW_PRESS )
|
||||||
|
{
|
||||||
|
// Detect which of the four views was clicked
|
||||||
|
active_view = 1;
|
||||||
|
if( xpos >= width/2 )
|
||||||
|
{
|
||||||
|
active_view += 1;
|
||||||
|
}
|
||||||
|
if( ypos >= height/2 )
|
||||||
|
{
|
||||||
|
active_view += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Button released?
|
||||||
|
else if( button == GLFW_MOUSE_BUTTON_LEFT )
|
||||||
|
{
|
||||||
|
// Deselect any previously selected view
|
||||||
|
active_view = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
do_redraw = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// main()
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int main( void )
|
||||||
|
{
|
||||||
|
// Initialise GLFW
|
||||||
|
if( !glfwInit() )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "Failed to initialize GLFW\n" );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open OpenGL window
|
||||||
|
if( !glfwOpenWindow( 500, 500, 0,0,0,0, 16,0, GLFW_WINDOW ) )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "Failed to open GLFW window\n" );
|
||||||
|
glfwTerminate();
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable vsync
|
||||||
|
glfwSwapInterval( 1 );
|
||||||
|
|
||||||
|
// Set window title
|
||||||
|
glfwSetWindowTitle( "Split view demo" );
|
||||||
|
|
||||||
|
// Enable sticky keys
|
||||||
|
glfwEnable( GLFW_STICKY_KEYS );
|
||||||
|
|
||||||
|
// Enable mouse cursor (only needed for fullscreen mode)
|
||||||
|
glfwEnable( GLFW_MOUSE_CURSOR );
|
||||||
|
|
||||||
|
// Disable automatic event polling
|
||||||
|
glfwDisable( GLFW_AUTO_POLL_EVENTS );
|
||||||
|
|
||||||
|
// Set callback functions
|
||||||
|
glfwSetWindowSizeCallback( windowSizeFun );
|
||||||
|
glfwSetWindowRefreshCallback( windowRefreshFun );
|
||||||
|
glfwSetMousePosCallback( mousePosFun );
|
||||||
|
glfwSetMouseButtonCallback( mouseButtonFun );
|
||||||
|
|
||||||
|
// Main loop
|
||||||
|
do
|
||||||
|
{
|
||||||
|
// Only redraw if we need to
|
||||||
|
if( do_redraw )
|
||||||
|
{
|
||||||
|
// Draw all views
|
||||||
|
drawAllViews();
|
||||||
|
|
||||||
|
// Swap buffers
|
||||||
|
glfwSwapBuffers();
|
||||||
|
|
||||||
|
do_redraw = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for new events
|
||||||
|
glfwWaitEvents();
|
||||||
|
|
||||||
|
} // Check if the ESC key was pressed or the window was closed
|
||||||
|
while( glfwGetKey( GLFW_KEY_ESC ) != GLFW_PRESS &&
|
||||||
|
glfwGetWindowParam( GLFW_OPENED ) );
|
||||||
|
|
||||||
|
// Close OpenGL window and terminate GLFW
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
exit( EXIT_SUCCESS );
|
||||||
|
}
|
||||||
|
|
94
examples/triangle.c
Normal file
94
examples/triangle.c
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
//========================================================================
|
||||||
|
// This is a small test application for GLFW.
|
||||||
|
// The program opens a window (640x480), and renders a spinning colored
|
||||||
|
// triangle (it is controlled with both the GLFW timer and the mouse).
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <GL/glfw.h>
|
||||||
|
|
||||||
|
|
||||||
|
int main( void )
|
||||||
|
{
|
||||||
|
int width, height, x;
|
||||||
|
double t;
|
||||||
|
|
||||||
|
// Initialise GLFW
|
||||||
|
if( !glfwInit() )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "Failed to initialize GLFW\n" );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open a window and create its OpenGL context
|
||||||
|
if( !glfwOpenWindow( 640, 480, 0,0,0,0, 0,0, GLFW_WINDOW ) )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "Failed to open GLFW window\n" );
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwSetWindowTitle( "Spinning Triangle" );
|
||||||
|
|
||||||
|
// Ensure we can capture the escape key being pressed below
|
||||||
|
glfwEnable( GLFW_STICKY_KEYS );
|
||||||
|
|
||||||
|
// Enable vertical sync (on cards that support it)
|
||||||
|
glfwSwapInterval( 1 );
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
t = glfwGetTime();
|
||||||
|
glfwGetMousePos( &x, NULL );
|
||||||
|
|
||||||
|
// Get window size (may be different than the requested size)
|
||||||
|
glfwGetWindowSize( &width, &height );
|
||||||
|
|
||||||
|
// Special case: avoid division by zero below
|
||||||
|
height = height > 0 ? height : 1;
|
||||||
|
|
||||||
|
glViewport( 0, 0, width, height );
|
||||||
|
|
||||||
|
// Clear color buffer to black
|
||||||
|
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
|
||||||
|
glClear( GL_COLOR_BUFFER_BIT );
|
||||||
|
|
||||||
|
// Select and setup the projection matrix
|
||||||
|
glMatrixMode( GL_PROJECTION );
|
||||||
|
glLoadIdentity();
|
||||||
|
gluPerspective( 65.0f, (GLfloat)width/(GLfloat)height, 1.0f, 100.0f );
|
||||||
|
|
||||||
|
// Select and setup the modelview matrix
|
||||||
|
glMatrixMode( GL_MODELVIEW );
|
||||||
|
glLoadIdentity();
|
||||||
|
gluLookAt( 0.0f, 1.0f, 0.0f, // Eye-position
|
||||||
|
0.0f, 20.0f, 0.0f, // View-point
|
||||||
|
0.0f, 0.0f, 1.0f ); // Up-vector
|
||||||
|
|
||||||
|
// Draw a rotating colorful triangle
|
||||||
|
glTranslatef( 0.0f, 14.0f, 0.0f );
|
||||||
|
glRotatef( 0.3f*(GLfloat)x + (GLfloat)t*100.0f, 0.0f, 0.0f, 1.0f );
|
||||||
|
glBegin( GL_TRIANGLES );
|
||||||
|
glColor3f( 1.0f, 0.0f, 0.0f );
|
||||||
|
glVertex3f( -5.0f, 0.0f, -4.0f );
|
||||||
|
glColor3f( 0.0f, 1.0f, 0.0f );
|
||||||
|
glVertex3f( 5.0f, 0.0f, -4.0f );
|
||||||
|
glColor3f( 0.0f, 0.0f, 1.0f );
|
||||||
|
glVertex3f( 0.0f, 0.0f, 6.0f );
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
// Swap buffers
|
||||||
|
glfwSwapBuffers();
|
||||||
|
|
||||||
|
} // Check if the ESC key was pressed or the window was closed
|
||||||
|
while( glfwGetKey( GLFW_KEY_ESC ) != GLFW_PRESS &&
|
||||||
|
glfwGetWindowParam( GLFW_OPENED ) );
|
||||||
|
|
||||||
|
// Close OpenGL window and terminate GLFW
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
exit( EXIT_SUCCESS );
|
||||||
|
}
|
||||||
|
|
399
examples/wave.c
Normal file
399
examples/wave.c
Normal file
|
@ -0,0 +1,399 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* Wave Simulation in OpenGL
|
||||||
|
* (C) 2002 Jakob Thomsen
|
||||||
|
* http://home.in.tum.de/~thomsen
|
||||||
|
* Modified for GLFW by Sylvain Hellegouarch - sh@programmationworld.com
|
||||||
|
* Modified for variable frame rate by Marcus Geelnard
|
||||||
|
* 2003-Jan-31: Minor cleanups and speedups / MG
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <GL/glfw.h>
|
||||||
|
|
||||||
|
#ifndef M_PI
|
||||||
|
#define M_PI 3.1415926535897932384626433832795
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Maximum delta T to allow for differential calculations */
|
||||||
|
#define MAX_DELTA_T 0.01
|
||||||
|
|
||||||
|
/* Animation speed (10.0 looks good) */
|
||||||
|
#define ANIMATION_SPEED 10.0
|
||||||
|
|
||||||
|
|
||||||
|
GLfloat alpha = 210.0f, beta = -70.0f;
|
||||||
|
GLfloat zoom = 2.0f;
|
||||||
|
|
||||||
|
int running = 1;
|
||||||
|
|
||||||
|
struct Vertex
|
||||||
|
{
|
||||||
|
GLfloat x,y,z;
|
||||||
|
GLfloat r,g,b;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GRIDW 50
|
||||||
|
#define GRIDH 50
|
||||||
|
#define VERTEXNUM (GRIDW*GRIDH)
|
||||||
|
|
||||||
|
#define QUADW (GRIDW-1)
|
||||||
|
#define QUADH (GRIDH-1)
|
||||||
|
#define QUADNUM (QUADW*QUADH)
|
||||||
|
|
||||||
|
GLuint quad[4*QUADNUM];
|
||||||
|
struct Vertex vertex[VERTEXNUM];
|
||||||
|
|
||||||
|
/* The grid will look like this:
|
||||||
|
*
|
||||||
|
* 3 4 5
|
||||||
|
* *---*---*
|
||||||
|
* | | |
|
||||||
|
* | 0 | 1 |
|
||||||
|
* | | |
|
||||||
|
* *---*---*
|
||||||
|
* 0 1 2
|
||||||
|
*/
|
||||||
|
|
||||||
|
void initVertices( void )
|
||||||
|
{
|
||||||
|
int x,y,p;
|
||||||
|
|
||||||
|
/* place the vertices in a grid */
|
||||||
|
for(y=0;y<GRIDH;y++)
|
||||||
|
for(x=0;x<GRIDW;x++)
|
||||||
|
{
|
||||||
|
p = y*GRIDW + x;
|
||||||
|
|
||||||
|
//vertex[p].x = (-GRIDW/2)+x+sin(2.0*M_PI*(double)y/(double)GRIDH);
|
||||||
|
//vertex[p].y = (-GRIDH/2)+y+cos(2.0*M_PI*(double)x/(double)GRIDW);
|
||||||
|
vertex[p].x = (GLfloat)(x-GRIDW/2)/(GLfloat)(GRIDW/2);
|
||||||
|
vertex[p].y = (GLfloat)(y-GRIDH/2)/(GLfloat)(GRIDH/2);
|
||||||
|
vertex[p].z = 0;//sin(d*M_PI);
|
||||||
|
//vertex[p].r = (GLfloat)x/(GLfloat)GRIDW;
|
||||||
|
//vertex[p].g = (GLfloat)y/(GLfloat)GRIDH;
|
||||||
|
//vertex[p].b = 1.0-((GLfloat)x/(GLfloat)GRIDW+(GLfloat)y/(GLfloat)GRIDH)/2.0;
|
||||||
|
if((x%4<2)^(y%4<2))
|
||||||
|
{
|
||||||
|
vertex[p].r = 0.0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vertex[p].r=1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
vertex[p].g = (GLfloat)y/(GLfloat)GRIDH;
|
||||||
|
vertex[p].b = 1.f-((GLfloat)x/(GLfloat)GRIDW+(GLfloat)y/(GLfloat)GRIDH)/2.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(y=0;y<QUADH;y++)
|
||||||
|
for(x=0;x<QUADW;x++)
|
||||||
|
{
|
||||||
|
p = 4*(y*QUADW + x);
|
||||||
|
|
||||||
|
/* first quad */
|
||||||
|
quad[p+0] = y *GRIDW+x; /* some point */
|
||||||
|
quad[p+1] = y *GRIDW+x+1; /* neighbor at the right side */
|
||||||
|
quad[p+2] = (y+1)*GRIDW+x+1; /* upper right neighbor */
|
||||||
|
quad[p+3] = (y+1)*GRIDW+x; /* upper neighbor */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double dt;
|
||||||
|
double p[GRIDW][GRIDH];
|
||||||
|
double vx[GRIDW][GRIDH], vy[GRIDW][GRIDH];
|
||||||
|
double ax[GRIDW][GRIDH], ay[GRIDW][GRIDH];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void initSurface( void )
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
double dx, dy, d;
|
||||||
|
|
||||||
|
for(y = 0; y<GRIDH; y++)
|
||||||
|
{
|
||||||
|
for(x = 0; x<GRIDW; x++)
|
||||||
|
{
|
||||||
|
dx = (double)(x-GRIDW/2);
|
||||||
|
dy = (double)(y-GRIDH/2);
|
||||||
|
d = sqrt( dx*dx + dy*dy );
|
||||||
|
if(d < 0.1 * (double)(GRIDW/2))
|
||||||
|
{
|
||||||
|
d = d * 10.0;
|
||||||
|
p[x][y] = -cos(d * (M_PI / (double)(GRIDW * 4))) * 100.0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
p[x][y] = 0.0;
|
||||||
|
}
|
||||||
|
vx[x][y] = 0.0;
|
||||||
|
vy[x][y] = 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Draw view */
|
||||||
|
void draw_screen( void )
|
||||||
|
{
|
||||||
|
/* Clear the color and depth buffers. */
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
|
/* We don't want to modify the projection matrix. */
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
glLoadIdentity();
|
||||||
|
|
||||||
|
/* Move back. */
|
||||||
|
glTranslatef(0.0, 0.0, -zoom);
|
||||||
|
/* Rotate the view */
|
||||||
|
glRotatef(beta, 1.0, 0.0, 0.0);
|
||||||
|
glRotatef(alpha, 0.0, 0.0, 1.0);
|
||||||
|
|
||||||
|
//glDrawArrays(GL_POINTS,0,VERTEXNUM); /* Points only */
|
||||||
|
glDrawElements(GL_QUADS, 4*QUADNUM, GL_UNSIGNED_INT, quad);
|
||||||
|
//glDrawElements(GL_LINES, QUADNUM, GL_UNSIGNED_INT, quad);
|
||||||
|
|
||||||
|
glfwSwapBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Initialize OpenGL */
|
||||||
|
void setup_opengl( void )
|
||||||
|
{
|
||||||
|
/* Our shading model--Gouraud (smooth). */
|
||||||
|
glShadeModel(GL_SMOOTH);
|
||||||
|
|
||||||
|
/* Culling. */
|
||||||
|
//glCullFace(GL_BACK);
|
||||||
|
//glFrontFace(GL_CCW);
|
||||||
|
//glEnable(GL_CULL_FACE);
|
||||||
|
|
||||||
|
/* Switch on the z-buffer. */
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
|
glEnableClientState(GL_VERTEX_ARRAY);
|
||||||
|
glEnableClientState(GL_COLOR_ARRAY);
|
||||||
|
glVertexPointer(3/*3 components per vertex (x,y,z)*/, GL_FLOAT, sizeof(struct Vertex), vertex);
|
||||||
|
glColorPointer(3/*3 components per vertex (r,g,b)*/, GL_FLOAT, sizeof(struct Vertex), &vertex[0].r); //Pointer to the first color
|
||||||
|
glPointSize(2.0);
|
||||||
|
|
||||||
|
/* Background color is black. */
|
||||||
|
glClearColor(0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Modify the height of each vertex according to the pressure. */
|
||||||
|
void adjustGrid( void )
|
||||||
|
{
|
||||||
|
int pos;
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
for(y = 0; y<GRIDH; y++)
|
||||||
|
{
|
||||||
|
for(x = 0; x<GRIDW; x++)
|
||||||
|
{
|
||||||
|
pos = y*GRIDW + x;
|
||||||
|
vertex[pos].z = (float) (p[x][y]*(1.0/50.0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Calculate wave propagation */
|
||||||
|
void calc( void )
|
||||||
|
{
|
||||||
|
int x, y, x2, y2;
|
||||||
|
double time_step = dt * ANIMATION_SPEED;
|
||||||
|
|
||||||
|
/* compute accelerations */
|
||||||
|
for(x = 0; x < GRIDW; x++)
|
||||||
|
{
|
||||||
|
x2 = (x + 1) % GRIDW;
|
||||||
|
for(y = 0; y < GRIDH; y++)
|
||||||
|
{
|
||||||
|
ax[x][y] = p[x][y] - p[x2][y];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(y = 0; y < GRIDH;y++)
|
||||||
|
{
|
||||||
|
y2 = (y + 1) % GRIDH;
|
||||||
|
for(x = 0; x < GRIDW; x++)
|
||||||
|
{
|
||||||
|
ay[x][y] = p[x][y] - p[x][y2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* compute speeds */
|
||||||
|
for(x = 0; x < GRIDW; x++)
|
||||||
|
{
|
||||||
|
for(y = 0; y < GRIDH; y++)
|
||||||
|
{
|
||||||
|
vx[x][y] = vx[x][y] + ax[x][y] * time_step;
|
||||||
|
vy[x][y] = vy[x][y] + ay[x][y] * time_step;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* compute pressure */
|
||||||
|
for(x = 1; x < GRIDW; x++)
|
||||||
|
{
|
||||||
|
x2 = x - 1;
|
||||||
|
for(y = 1; y < GRIDH; y++)
|
||||||
|
{
|
||||||
|
y2 = y - 1;
|
||||||
|
p[x][y] = p[x][y] + (vx[x2][y] - vx[x][y] + vy[x][y2] - vy[x][y]) * time_step;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Handle key strokes */
|
||||||
|
void handle_key_down(int key, int action)
|
||||||
|
{
|
||||||
|
if( action != GLFW_PRESS )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(key) {
|
||||||
|
case GLFW_KEY_ESC:
|
||||||
|
running = 0;
|
||||||
|
break;
|
||||||
|
case GLFW_KEY_SPACE:
|
||||||
|
initSurface();
|
||||||
|
break;
|
||||||
|
case GLFW_KEY_LEFT:
|
||||||
|
alpha+=5;
|
||||||
|
break;
|
||||||
|
case GLFW_KEY_RIGHT:
|
||||||
|
alpha-=5;
|
||||||
|
break;
|
||||||
|
case GLFW_KEY_UP:
|
||||||
|
beta-=5;
|
||||||
|
break;
|
||||||
|
case GLFW_KEY_DOWN:
|
||||||
|
beta+=5;
|
||||||
|
break;
|
||||||
|
case GLFW_KEY_PAGEUP:
|
||||||
|
if(zoom>1) zoom-=1;
|
||||||
|
break;
|
||||||
|
case GLFW_KEY_PAGEDOWN:
|
||||||
|
zoom+=1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Callback function for window resize events */
|
||||||
|
void handle_resize( int width, int height )
|
||||||
|
{
|
||||||
|
float ratio = 1.0f;
|
||||||
|
|
||||||
|
if( height > 0 )
|
||||||
|
{
|
||||||
|
ratio = (float) width / (float) height;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Setup viewport (Place where the stuff will appear in the main window). */
|
||||||
|
glViewport(0, 0, width, height);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Change to the projection matrix and set
|
||||||
|
* our viewing volume.
|
||||||
|
*/
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glLoadIdentity();
|
||||||
|
gluPerspective(60.0, ratio, 1.0, 1024.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Program entry point */
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
/* Dimensions of our window. */
|
||||||
|
int width, height;
|
||||||
|
/* Style of our window. */
|
||||||
|
int mode;
|
||||||
|
/* Frame time */
|
||||||
|
double t, t_old, dt_total;
|
||||||
|
|
||||||
|
/* Initialize GLFW */
|
||||||
|
if(glfwInit() == GL_FALSE)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "GLFW initialization failed\n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Desired window properties */
|
||||||
|
width = 640;
|
||||||
|
height = 480;
|
||||||
|
mode = GLFW_WINDOW;
|
||||||
|
|
||||||
|
/* Open window */
|
||||||
|
if( glfwOpenWindow(width,height,0,0,0,0,16,0,mode) == GL_FALSE )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Could not open window\n");
|
||||||
|
glfwTerminate();
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set title */
|
||||||
|
glfwSetWindowTitle( "Wave Simulation" );
|
||||||
|
|
||||||
|
glfwSwapInterval( 1 );
|
||||||
|
|
||||||
|
/* Keyboard handler */
|
||||||
|
glfwSetKeyCallback( handle_key_down );
|
||||||
|
glfwEnable( GLFW_KEY_REPEAT );
|
||||||
|
|
||||||
|
/* Window resize handler */
|
||||||
|
glfwSetWindowSizeCallback( handle_resize );
|
||||||
|
|
||||||
|
/* Initialize OpenGL */
|
||||||
|
setup_opengl();
|
||||||
|
|
||||||
|
/* Initialize simulation */
|
||||||
|
initVertices();
|
||||||
|
initSurface();
|
||||||
|
adjustGrid();
|
||||||
|
|
||||||
|
/* Initialize timer */
|
||||||
|
t_old = glfwGetTime() - 0.01;
|
||||||
|
|
||||||
|
/* Main loop */
|
||||||
|
while(running)
|
||||||
|
{
|
||||||
|
/* Timing */
|
||||||
|
t = glfwGetTime();
|
||||||
|
dt_total = t - t_old;
|
||||||
|
t_old = t;
|
||||||
|
|
||||||
|
/* Safety - iterate if dt_total is too large */
|
||||||
|
while( dt_total > 0.0f )
|
||||||
|
{
|
||||||
|
/* Select iteration time step */
|
||||||
|
dt = dt_total > MAX_DELTA_T ? MAX_DELTA_T : dt_total;
|
||||||
|
dt_total -= dt;
|
||||||
|
|
||||||
|
/* Calculate wave propagation */
|
||||||
|
calc();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Compute height of each vertex */
|
||||||
|
adjustGrid();
|
||||||
|
|
||||||
|
/* Draw wave grid to OpenGL display */
|
||||||
|
draw_screen();
|
||||||
|
|
||||||
|
/* Still running? */
|
||||||
|
running = running && glfwGetWindowParam( GLFW_OPENED );
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
446
include/GL/glfw.h
Normal file
446
include/GL/glfw.h
Normal file
|
@ -0,0 +1,446 @@
|
||||||
|
/************************************************************************
|
||||||
|
* GLFW - An OpenGL framework
|
||||||
|
* API version: 2.7
|
||||||
|
* WWW: http://www.glfw.org/
|
||||||
|
*------------------------------------------------------------------------
|
||||||
|
* Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
* Copyright (c) 2006-2010 Camilla Berglund
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would
|
||||||
|
* be appreciated but is not required.
|
||||||
|
*
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
* be misrepresented as being the original software.
|
||||||
|
*
|
||||||
|
* 3. This notice may not be removed or altered from any source
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __glfw_h_
|
||||||
|
#define __glfw_h_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* Global definitions
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
/* We need a NULL pointer from time to time */
|
||||||
|
#ifndef NULL
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#define NULL 0
|
||||||
|
#else
|
||||||
|
#define NULL ((void *)0)
|
||||||
|
#endif
|
||||||
|
#endif /* NULL */
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- */
|
||||||
|
|
||||||
|
/* Please report any probles that you find with your compiler, which may
|
||||||
|
* be solved in this section! There are several compilers that I have not
|
||||||
|
* been able to test this file with yet.
|
||||||
|
*
|
||||||
|
* First: If we are we on Windows, we want a single define for it (_WIN32)
|
||||||
|
* (Note: For Cygwin the compiler flag -mwin32 should be used, but to
|
||||||
|
* make sure that things run smoothly for Cygwin users, we add __CYGWIN__
|
||||||
|
* to the list of "valid Win32 identifiers", which removes the need for
|
||||||
|
* -mwin32)
|
||||||
|
*/
|
||||||
|
#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__))
|
||||||
|
#define _WIN32
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
|
/* In order for extension support to be portable, we need to define an
|
||||||
|
* OpenGL function call method. We use the keyword APIENTRY, which is
|
||||||
|
* defined for Win32. (Note: Windows also needs this for <GL/gl.h>)
|
||||||
|
*/
|
||||||
|
#ifndef APIENTRY
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define APIENTRY __stdcall
|
||||||
|
#else
|
||||||
|
#define APIENTRY
|
||||||
|
#endif
|
||||||
|
#define GL_APIENTRY_DEFINED
|
||||||
|
#endif /* APIENTRY */
|
||||||
|
|
||||||
|
|
||||||
|
/* The following three defines are here solely to make some Windows-based
|
||||||
|
* <GL/gl.h> files happy. Theoretically we could include <windows.h>, but
|
||||||
|
* it has the major drawback of severely polluting our namespace.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Under Windows, we need WINGDIAPI defined */
|
||||||
|
#if !defined(WINGDIAPI) && defined(_WIN32)
|
||||||
|
#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__POCC__)
|
||||||
|
/* Microsoft Visual C++, Borland C++ Builder and Pelles C */
|
||||||
|
#define WINGDIAPI __declspec(dllimport)
|
||||||
|
#elif defined(__LCC__)
|
||||||
|
/* LCC-Win32 */
|
||||||
|
#define WINGDIAPI __stdcall
|
||||||
|
#else
|
||||||
|
/* Others (e.g. MinGW, Cygwin) */
|
||||||
|
#define WINGDIAPI extern
|
||||||
|
#endif
|
||||||
|
#define GL_WINGDIAPI_DEFINED
|
||||||
|
#endif /* WINGDIAPI */
|
||||||
|
|
||||||
|
/* Some <GL/glu.h> files also need CALLBACK defined */
|
||||||
|
#if !defined(CALLBACK) && defined(_WIN32)
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
/* Microsoft Visual C++ */
|
||||||
|
#if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS)
|
||||||
|
#define CALLBACK __stdcall
|
||||||
|
#else
|
||||||
|
#define CALLBACK
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
/* Other Windows compilers */
|
||||||
|
#define CALLBACK __stdcall
|
||||||
|
#endif
|
||||||
|
#define GLU_CALLBACK_DEFINED
|
||||||
|
#endif /* CALLBACK */
|
||||||
|
|
||||||
|
/* Microsoft Visual C++, Borland C++ and Pelles C <GL*glu.h> needs wchar_t */
|
||||||
|
#if defined(_WIN32) && (defined(_MSC_VER) || defined(__BORLANDC__) || defined(__POCC__)) && !defined(_WCHAR_T_DEFINED)
|
||||||
|
typedef unsigned short wchar_t;
|
||||||
|
#define _WCHAR_T_DEFINED
|
||||||
|
#endif /* _WCHAR_T_DEFINED */
|
||||||
|
|
||||||
|
|
||||||
|
/* ---------------- GLFW related system specific defines ----------------- */
|
||||||
|
|
||||||
|
#if defined(_WIN32) && defined(GLFW_BUILD_DLL)
|
||||||
|
|
||||||
|
/* We are building a Win32 DLL */
|
||||||
|
#define GLFWAPI __declspec(dllexport)
|
||||||
|
|
||||||
|
#elif defined(_WIN32) && defined(GLFW_DLL)
|
||||||
|
|
||||||
|
/* We are calling a Win32 DLL */
|
||||||
|
#if defined(__LCC__)
|
||||||
|
#define GLFWAPI extern
|
||||||
|
#else
|
||||||
|
#define GLFWAPI __declspec(dllimport)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* We are either building/calling a static lib or we are non-win32 */
|
||||||
|
#define GLFWAPI
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */
|
||||||
|
|
||||||
|
/* Include standard OpenGL headers: GLFW uses GL_FALSE/GL_TRUE, and it is
|
||||||
|
* convenient for the user to only have to include <GL/glfw.h>. This also
|
||||||
|
* solves the problem with Windows <GL/gl.h> and <GL/glu.h> needing some
|
||||||
|
* special defines which normally requires the user to include <windows.h>
|
||||||
|
* (which is not a nice solution for portable programs).
|
||||||
|
*/
|
||||||
|
#if defined(__APPLE_CC__)
|
||||||
|
#include <OpenGL/gl.h>
|
||||||
|
#ifndef GLFW_NO_GLU
|
||||||
|
#include <OpenGL/glu.h>
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#include <GL/gl.h>
|
||||||
|
#ifndef GLFW_NO_GLU
|
||||||
|
#include <GL/glu.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* GLFW version
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
#define GLFW_VERSION_MAJOR 2
|
||||||
|
#define GLFW_VERSION_MINOR 7
|
||||||
|
#define GLFW_VERSION_REVISION 0
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* Input handling definitions
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
/* Key and button state/action definitions */
|
||||||
|
#define GLFW_RELEASE 0
|
||||||
|
#define GLFW_PRESS 1
|
||||||
|
|
||||||
|
/* Keyboard key definitions: 8-bit ISO-8859-1 (Latin 1) encoding is used
|
||||||
|
* for printable keys (such as A-Z, 0-9 etc), and values above 256
|
||||||
|
* represent special (non-printable) keys (e.g. F1, Page Up etc).
|
||||||
|
*/
|
||||||
|
#define GLFW_KEY_UNKNOWN -1
|
||||||
|
#define GLFW_KEY_SPACE 32
|
||||||
|
#define GLFW_KEY_SPECIAL 256
|
||||||
|
#define GLFW_KEY_ESC (GLFW_KEY_SPECIAL+1)
|
||||||
|
#define GLFW_KEY_F1 (GLFW_KEY_SPECIAL+2)
|
||||||
|
#define GLFW_KEY_F2 (GLFW_KEY_SPECIAL+3)
|
||||||
|
#define GLFW_KEY_F3 (GLFW_KEY_SPECIAL+4)
|
||||||
|
#define GLFW_KEY_F4 (GLFW_KEY_SPECIAL+5)
|
||||||
|
#define GLFW_KEY_F5 (GLFW_KEY_SPECIAL+6)
|
||||||
|
#define GLFW_KEY_F6 (GLFW_KEY_SPECIAL+7)
|
||||||
|
#define GLFW_KEY_F7 (GLFW_KEY_SPECIAL+8)
|
||||||
|
#define GLFW_KEY_F8 (GLFW_KEY_SPECIAL+9)
|
||||||
|
#define GLFW_KEY_F9 (GLFW_KEY_SPECIAL+10)
|
||||||
|
#define GLFW_KEY_F10 (GLFW_KEY_SPECIAL+11)
|
||||||
|
#define GLFW_KEY_F11 (GLFW_KEY_SPECIAL+12)
|
||||||
|
#define GLFW_KEY_F12 (GLFW_KEY_SPECIAL+13)
|
||||||
|
#define GLFW_KEY_F13 (GLFW_KEY_SPECIAL+14)
|
||||||
|
#define GLFW_KEY_F14 (GLFW_KEY_SPECIAL+15)
|
||||||
|
#define GLFW_KEY_F15 (GLFW_KEY_SPECIAL+16)
|
||||||
|
#define GLFW_KEY_F16 (GLFW_KEY_SPECIAL+17)
|
||||||
|
#define GLFW_KEY_F17 (GLFW_KEY_SPECIAL+18)
|
||||||
|
#define GLFW_KEY_F18 (GLFW_KEY_SPECIAL+19)
|
||||||
|
#define GLFW_KEY_F19 (GLFW_KEY_SPECIAL+20)
|
||||||
|
#define GLFW_KEY_F20 (GLFW_KEY_SPECIAL+21)
|
||||||
|
#define GLFW_KEY_F21 (GLFW_KEY_SPECIAL+22)
|
||||||
|
#define GLFW_KEY_F22 (GLFW_KEY_SPECIAL+23)
|
||||||
|
#define GLFW_KEY_F23 (GLFW_KEY_SPECIAL+24)
|
||||||
|
#define GLFW_KEY_F24 (GLFW_KEY_SPECIAL+25)
|
||||||
|
#define GLFW_KEY_F25 (GLFW_KEY_SPECIAL+26)
|
||||||
|
#define GLFW_KEY_UP (GLFW_KEY_SPECIAL+27)
|
||||||
|
#define GLFW_KEY_DOWN (GLFW_KEY_SPECIAL+28)
|
||||||
|
#define GLFW_KEY_LEFT (GLFW_KEY_SPECIAL+29)
|
||||||
|
#define GLFW_KEY_RIGHT (GLFW_KEY_SPECIAL+30)
|
||||||
|
#define GLFW_KEY_LSHIFT (GLFW_KEY_SPECIAL+31)
|
||||||
|
#define GLFW_KEY_RSHIFT (GLFW_KEY_SPECIAL+32)
|
||||||
|
#define GLFW_KEY_LCTRL (GLFW_KEY_SPECIAL+33)
|
||||||
|
#define GLFW_KEY_RCTRL (GLFW_KEY_SPECIAL+34)
|
||||||
|
#define GLFW_KEY_LALT (GLFW_KEY_SPECIAL+35)
|
||||||
|
#define GLFW_KEY_RALT (GLFW_KEY_SPECIAL+36)
|
||||||
|
#define GLFW_KEY_TAB (GLFW_KEY_SPECIAL+37)
|
||||||
|
#define GLFW_KEY_ENTER (GLFW_KEY_SPECIAL+38)
|
||||||
|
#define GLFW_KEY_BACKSPACE (GLFW_KEY_SPECIAL+39)
|
||||||
|
#define GLFW_KEY_INSERT (GLFW_KEY_SPECIAL+40)
|
||||||
|
#define GLFW_KEY_DEL (GLFW_KEY_SPECIAL+41)
|
||||||
|
#define GLFW_KEY_PAGEUP (GLFW_KEY_SPECIAL+42)
|
||||||
|
#define GLFW_KEY_PAGEDOWN (GLFW_KEY_SPECIAL+43)
|
||||||
|
#define GLFW_KEY_HOME (GLFW_KEY_SPECIAL+44)
|
||||||
|
#define GLFW_KEY_END (GLFW_KEY_SPECIAL+45)
|
||||||
|
#define GLFW_KEY_KP_0 (GLFW_KEY_SPECIAL+46)
|
||||||
|
#define GLFW_KEY_KP_1 (GLFW_KEY_SPECIAL+47)
|
||||||
|
#define GLFW_KEY_KP_2 (GLFW_KEY_SPECIAL+48)
|
||||||
|
#define GLFW_KEY_KP_3 (GLFW_KEY_SPECIAL+49)
|
||||||
|
#define GLFW_KEY_KP_4 (GLFW_KEY_SPECIAL+50)
|
||||||
|
#define GLFW_KEY_KP_5 (GLFW_KEY_SPECIAL+51)
|
||||||
|
#define GLFW_KEY_KP_6 (GLFW_KEY_SPECIAL+52)
|
||||||
|
#define GLFW_KEY_KP_7 (GLFW_KEY_SPECIAL+53)
|
||||||
|
#define GLFW_KEY_KP_8 (GLFW_KEY_SPECIAL+54)
|
||||||
|
#define GLFW_KEY_KP_9 (GLFW_KEY_SPECIAL+55)
|
||||||
|
#define GLFW_KEY_KP_DIVIDE (GLFW_KEY_SPECIAL+56)
|
||||||
|
#define GLFW_KEY_KP_MULTIPLY (GLFW_KEY_SPECIAL+57)
|
||||||
|
#define GLFW_KEY_KP_SUBTRACT (GLFW_KEY_SPECIAL+58)
|
||||||
|
#define GLFW_KEY_KP_ADD (GLFW_KEY_SPECIAL+59)
|
||||||
|
#define GLFW_KEY_KP_DECIMAL (GLFW_KEY_SPECIAL+60)
|
||||||
|
#define GLFW_KEY_KP_EQUAL (GLFW_KEY_SPECIAL+61)
|
||||||
|
#define GLFW_KEY_KP_ENTER (GLFW_KEY_SPECIAL+62)
|
||||||
|
#define GLFW_KEY_KP_NUM_LOCK (GLFW_KEY_SPECIAL+63)
|
||||||
|
#define GLFW_KEY_CAPS_LOCK (GLFW_KEY_SPECIAL+64)
|
||||||
|
#define GLFW_KEY_SCROLL_LOCK (GLFW_KEY_SPECIAL+65)
|
||||||
|
#define GLFW_KEY_PAUSE (GLFW_KEY_SPECIAL+66)
|
||||||
|
#define GLFW_KEY_LSUPER (GLFW_KEY_SPECIAL+67)
|
||||||
|
#define GLFW_KEY_RSUPER (GLFW_KEY_SPECIAL+68)
|
||||||
|
#define GLFW_KEY_MENU (GLFW_KEY_SPECIAL+69)
|
||||||
|
#define GLFW_KEY_LAST GLFW_KEY_MENU
|
||||||
|
|
||||||
|
/* Mouse button definitions */
|
||||||
|
#define GLFW_MOUSE_BUTTON_1 0
|
||||||
|
#define GLFW_MOUSE_BUTTON_2 1
|
||||||
|
#define GLFW_MOUSE_BUTTON_3 2
|
||||||
|
#define GLFW_MOUSE_BUTTON_4 3
|
||||||
|
#define GLFW_MOUSE_BUTTON_5 4
|
||||||
|
#define GLFW_MOUSE_BUTTON_6 5
|
||||||
|
#define GLFW_MOUSE_BUTTON_7 6
|
||||||
|
#define GLFW_MOUSE_BUTTON_8 7
|
||||||
|
#define GLFW_MOUSE_BUTTON_LAST GLFW_MOUSE_BUTTON_8
|
||||||
|
|
||||||
|
/* Mouse button aliases */
|
||||||
|
#define GLFW_MOUSE_BUTTON_LEFT GLFW_MOUSE_BUTTON_1
|
||||||
|
#define GLFW_MOUSE_BUTTON_RIGHT GLFW_MOUSE_BUTTON_2
|
||||||
|
#define GLFW_MOUSE_BUTTON_MIDDLE GLFW_MOUSE_BUTTON_3
|
||||||
|
|
||||||
|
/* Joystick identifiers */
|
||||||
|
#define GLFW_JOYSTICK_1 0
|
||||||
|
#define GLFW_JOYSTICK_2 1
|
||||||
|
#define GLFW_JOYSTICK_3 2
|
||||||
|
#define GLFW_JOYSTICK_4 3
|
||||||
|
#define GLFW_JOYSTICK_5 4
|
||||||
|
#define GLFW_JOYSTICK_6 5
|
||||||
|
#define GLFW_JOYSTICK_7 6
|
||||||
|
#define GLFW_JOYSTICK_8 7
|
||||||
|
#define GLFW_JOYSTICK_9 8
|
||||||
|
#define GLFW_JOYSTICK_10 9
|
||||||
|
#define GLFW_JOYSTICK_11 10
|
||||||
|
#define GLFW_JOYSTICK_12 11
|
||||||
|
#define GLFW_JOYSTICK_13 12
|
||||||
|
#define GLFW_JOYSTICK_14 13
|
||||||
|
#define GLFW_JOYSTICK_15 14
|
||||||
|
#define GLFW_JOYSTICK_16 15
|
||||||
|
#define GLFW_JOYSTICK_LAST GLFW_JOYSTICK_16
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* Other definitions
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
/* glfwOpenWindow modes */
|
||||||
|
#define GLFW_WINDOW 0x00010001
|
||||||
|
#define GLFW_FULLSCREEN 0x00010002
|
||||||
|
|
||||||
|
/* glfwGetWindowParam tokens */
|
||||||
|
#define GLFW_OPENED 0x00020001
|
||||||
|
#define GLFW_ACTIVE 0x00020002
|
||||||
|
#define GLFW_ICONIFIED 0x00020003
|
||||||
|
#define GLFW_ACCELERATED 0x00020004
|
||||||
|
#define GLFW_RED_BITS 0x00020005
|
||||||
|
#define GLFW_GREEN_BITS 0x00020006
|
||||||
|
#define GLFW_BLUE_BITS 0x00020007
|
||||||
|
#define GLFW_ALPHA_BITS 0x00020008
|
||||||
|
#define GLFW_DEPTH_BITS 0x00020009
|
||||||
|
#define GLFW_STENCIL_BITS 0x0002000A
|
||||||
|
|
||||||
|
/* The following constants are used for both glfwGetWindowParam
|
||||||
|
* and glfwOpenWindowHint
|
||||||
|
*/
|
||||||
|
#define GLFW_REFRESH_RATE 0x0002000B
|
||||||
|
#define GLFW_ACCUM_RED_BITS 0x0002000C
|
||||||
|
#define GLFW_ACCUM_GREEN_BITS 0x0002000D
|
||||||
|
#define GLFW_ACCUM_BLUE_BITS 0x0002000E
|
||||||
|
#define GLFW_ACCUM_ALPHA_BITS 0x0002000F
|
||||||
|
#define GLFW_AUX_BUFFERS 0x00020010
|
||||||
|
#define GLFW_STEREO 0x00020011
|
||||||
|
#define GLFW_WINDOW_NO_RESIZE 0x00020012
|
||||||
|
#define GLFW_FSAA_SAMPLES 0x00020013
|
||||||
|
#define GLFW_OPENGL_VERSION_MAJOR 0x00020014
|
||||||
|
#define GLFW_OPENGL_VERSION_MINOR 0x00020015
|
||||||
|
#define GLFW_OPENGL_FORWARD_COMPAT 0x00020016
|
||||||
|
#define GLFW_OPENGL_DEBUG_CONTEXT 0x00020017
|
||||||
|
#define GLFW_OPENGL_PROFILE 0x00020018
|
||||||
|
|
||||||
|
/* GLFW_OPENGL_PROFILE tokens */
|
||||||
|
#define GLFW_OPENGL_CORE_PROFILE 0x00050001
|
||||||
|
#define GLFW_OPENGL_COMPAT_PROFILE 0x00050002
|
||||||
|
|
||||||
|
/* glfwEnable/glfwDisable tokens */
|
||||||
|
#define GLFW_MOUSE_CURSOR 0x00030001
|
||||||
|
#define GLFW_STICKY_KEYS 0x00030002
|
||||||
|
#define GLFW_STICKY_MOUSE_BUTTONS 0x00030003
|
||||||
|
#define GLFW_SYSTEM_KEYS 0x00030004
|
||||||
|
#define GLFW_KEY_REPEAT 0x00030005
|
||||||
|
#define GLFW_AUTO_POLL_EVENTS 0x00030006
|
||||||
|
|
||||||
|
/* glfwGetJoystickParam tokens */
|
||||||
|
#define GLFW_PRESENT 0x00050001
|
||||||
|
#define GLFW_AXES 0x00050002
|
||||||
|
#define GLFW_BUTTONS 0x00050003
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* Typedefs
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
/* The video mode structure used by glfwGetVideoModes() */
|
||||||
|
typedef struct {
|
||||||
|
int Width, Height;
|
||||||
|
int RedBits, BlueBits, GreenBits;
|
||||||
|
} GLFWvidmode;
|
||||||
|
|
||||||
|
/* Function pointer types */
|
||||||
|
typedef void (* GLFWwindowsizefun)(int,int);
|
||||||
|
typedef int (* GLFWwindowclosefun)(void);
|
||||||
|
typedef void (* GLFWwindowrefreshfun)(void);
|
||||||
|
typedef void (* GLFWmousebuttonfun)(int,int);
|
||||||
|
typedef void (* GLFWmouseposfun)(int,int);
|
||||||
|
typedef void (* GLFWmousewheelfun)(int);
|
||||||
|
typedef void (* GLFWkeyfun)(int,int);
|
||||||
|
typedef void (* GLFWcharfun)(int,int);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* Prototypes
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
/* GLFW initialization, termination and version querying */
|
||||||
|
GLFWAPI int glfwInit( void );
|
||||||
|
GLFWAPI void glfwTerminate( void );
|
||||||
|
GLFWAPI void glfwGetVersion( int *major, int *minor, int *rev );
|
||||||
|
|
||||||
|
/* Window handling */
|
||||||
|
GLFWAPI int glfwOpenWindow( int width, int height, int redbits, int greenbits, int bluebits, int alphabits, int depthbits, int stencilbits, int mode );
|
||||||
|
GLFWAPI void glfwOpenWindowHint( int target, int hint );
|
||||||
|
GLFWAPI void glfwCloseWindow( void );
|
||||||
|
GLFWAPI void glfwSetWindowTitle( const char *title );
|
||||||
|
GLFWAPI void glfwGetWindowSize( int *width, int *height );
|
||||||
|
GLFWAPI void glfwSetWindowSize( int width, int height );
|
||||||
|
GLFWAPI void glfwSetWindowPos( int x, int y );
|
||||||
|
GLFWAPI void glfwIconifyWindow( void );
|
||||||
|
GLFWAPI void glfwRestoreWindow( void );
|
||||||
|
GLFWAPI void glfwSwapBuffers( void );
|
||||||
|
GLFWAPI void glfwSwapInterval( int interval );
|
||||||
|
GLFWAPI int glfwGetWindowParam( int param );
|
||||||
|
GLFWAPI void glfwSetWindowSizeCallback( GLFWwindowsizefun cbfun );
|
||||||
|
GLFWAPI void glfwSetWindowCloseCallback( GLFWwindowclosefun cbfun );
|
||||||
|
GLFWAPI void glfwSetWindowRefreshCallback( GLFWwindowrefreshfun cbfun );
|
||||||
|
|
||||||
|
/* Video mode functions */
|
||||||
|
GLFWAPI int glfwGetVideoModes( GLFWvidmode *list, int maxcount );
|
||||||
|
GLFWAPI void glfwGetDesktopMode( GLFWvidmode *mode );
|
||||||
|
|
||||||
|
/* Input handling */
|
||||||
|
GLFWAPI void glfwPollEvents( void );
|
||||||
|
GLFWAPI void glfwWaitEvents( void );
|
||||||
|
GLFWAPI int glfwGetKey( int key );
|
||||||
|
GLFWAPI int glfwGetMouseButton( int button );
|
||||||
|
GLFWAPI void glfwGetMousePos( int *xpos, int *ypos );
|
||||||
|
GLFWAPI void glfwSetMousePos( int xpos, int ypos );
|
||||||
|
GLFWAPI int glfwGetMouseWheel( void );
|
||||||
|
GLFWAPI void glfwSetMouseWheel( int pos );
|
||||||
|
GLFWAPI void glfwSetKeyCallback( GLFWkeyfun cbfun );
|
||||||
|
GLFWAPI void glfwSetCharCallback( GLFWcharfun cbfun );
|
||||||
|
GLFWAPI void glfwSetMouseButtonCallback( GLFWmousebuttonfun cbfun );
|
||||||
|
GLFWAPI void glfwSetMousePosCallback( GLFWmouseposfun cbfun );
|
||||||
|
GLFWAPI void glfwSetMouseWheelCallback( GLFWmousewheelfun cbfun );
|
||||||
|
|
||||||
|
/* Joystick input */
|
||||||
|
GLFWAPI int glfwGetJoystickParam( int joy, int param );
|
||||||
|
GLFWAPI int glfwGetJoystickPos( int joy, float *pos, int numaxes );
|
||||||
|
GLFWAPI int glfwGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons );
|
||||||
|
|
||||||
|
/* Time */
|
||||||
|
GLFWAPI double glfwGetTime( void );
|
||||||
|
GLFWAPI void glfwSetTime( double time );
|
||||||
|
|
||||||
|
/* Extension support */
|
||||||
|
GLFWAPI int glfwExtensionSupported( const char *extension );
|
||||||
|
GLFWAPI void* glfwGetProcAddress( const char *procname );
|
||||||
|
GLFWAPI void glfwGetGLVersion( int *major, int *minor, int *rev );
|
||||||
|
|
||||||
|
/* Enable/disable functions */
|
||||||
|
GLFWAPI void glfwEnable( int token );
|
||||||
|
GLFWAPI void glfwDisable( int token );
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __glfw_h_ */
|
||||||
|
|
38
lib/carbon/CMakeLists.txt
Normal file
38
lib/carbon/CMakeLists.txt
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
|
||||||
|
configure_file(
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/libglfw.pc.cmake
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc @ONLY)
|
||||||
|
|
||||||
|
include_directories(
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
${CMAKE_SOURCE_DIR}/lib
|
||||||
|
${GLFW_INCLUDE_DIR})
|
||||||
|
|
||||||
|
set(libglfw_SOURCES
|
||||||
|
${common_SOURCES}
|
||||||
|
carbon_enable.c
|
||||||
|
carbon_fullscreen.c
|
||||||
|
carbon_glext.c
|
||||||
|
carbon_init.c
|
||||||
|
carbon_joystick.c
|
||||||
|
carbon_time.c
|
||||||
|
carbon_window.c)
|
||||||
|
|
||||||
|
add_library(libglfwStatic STATIC ${libglfw_SOURCES})
|
||||||
|
add_library(libglfwShared SHARED ${libglfw_SOURCES})
|
||||||
|
target_link_libraries(libglfwShared ${GLFW_LIBRARIES})
|
||||||
|
set_target_properties(libglfwStatic libglfwShared PROPERTIES
|
||||||
|
CLEAN_DIRECT_OUTPUT 1
|
||||||
|
OUTPUT_NAME glfw
|
||||||
|
)
|
||||||
|
|
||||||
|
# Append -fno-common to the compile flags to work around a bug in the Apple GCC
|
||||||
|
get_target_property(CFLAGS libglfwShared COMPILE_FLAGS)
|
||||||
|
if(NOT CFLAGS)
|
||||||
|
set(CFLAGS "")
|
||||||
|
endif(NOT CFLAGS)
|
||||||
|
set_target_properties(libglfwShared PROPERTIES COMPILE_FLAGS "${CFLAGS} -fno-common")
|
||||||
|
|
||||||
|
install(TARGETS libglfwStatic libglfwShared DESTINATION lib)
|
||||||
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc DESTINATION lib/pkgconfig)
|
||||||
|
|
43
lib/carbon/carbon_enable.c
Normal file
43
lib/carbon/carbon_enable.c
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Carbon/AGL/CGL
|
||||||
|
// API Version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2003 Keith Bauer
|
||||||
|
// Copyright (c) 2003-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformEnableSystemKeys( void )
|
||||||
|
{
|
||||||
|
// Nothing to do; event handling code checks the status of
|
||||||
|
// _glfwWin.sysKeysDisabled to ensure this behavior.
|
||||||
|
}
|
||||||
|
|
||||||
|
void _glfwPlatformDisableSystemKeys( void )
|
||||||
|
{
|
||||||
|
// Nothing to do; event handling code checks the status of
|
||||||
|
// _glfwWin.sysKeysDisabled to ensure this behavior.
|
||||||
|
}
|
||||||
|
|
127
lib/carbon/carbon_fullscreen.c
Normal file
127
lib/carbon/carbon_fullscreen.c
Normal file
|
@ -0,0 +1,127 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Carbon/AGL/CGL
|
||||||
|
// API Version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2003 Keith Bauer
|
||||||
|
// Copyright (c) 2003-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwVideoModesEqual() - Compares two video modes
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static int _glfwVideoModesEqual( GLFWvidmode* first,
|
||||||
|
GLFWvidmode* second )
|
||||||
|
{
|
||||||
|
if( first->Width != second->Width )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if( first->Height != second->Height )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if( first->RedBits + first->GreenBits + first->BlueBits !=
|
||||||
|
second->RedBits + second->GreenBits + second->BlueBits )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwCGToGLFWVideoMode() - Converts a CG mode to a GLFW mode
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void _glfwCGToGLFWVideoMode( CFDictionaryRef cgMode,
|
||||||
|
GLFWvidmode* glfwMode )
|
||||||
|
{
|
||||||
|
int bitsPerSample;
|
||||||
|
|
||||||
|
CFNumberGetValue( CFDictionaryGetValue( cgMode, kCGDisplayWidth ),
|
||||||
|
kCFNumberIntType,
|
||||||
|
&(glfwMode->Width) );
|
||||||
|
CFNumberGetValue( CFDictionaryGetValue( cgMode, kCGDisplayHeight ),
|
||||||
|
kCFNumberIntType,
|
||||||
|
&(glfwMode->Height) );
|
||||||
|
|
||||||
|
CFNumberGetValue( CFDictionaryGetValue( cgMode, kCGDisplayBitsPerSample ),
|
||||||
|
kCFNumberIntType,
|
||||||
|
&bitsPerSample );
|
||||||
|
|
||||||
|
glfwMode->RedBits = bitsPerSample;
|
||||||
|
glfwMode->GreenBits = bitsPerSample;
|
||||||
|
glfwMode->BlueBits = bitsPerSample;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwPlatformGetVideoModes() - Get a list of available video modes
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount )
|
||||||
|
{
|
||||||
|
int i, j, maxModes, numModes;
|
||||||
|
GLFWvidmode mode;
|
||||||
|
CFArrayRef availableModes = CGDisplayAvailableModes( kCGDirectMainDisplay );
|
||||||
|
CFIndex numberOfAvailableModes = CFArrayGetCount( availableModes );
|
||||||
|
|
||||||
|
numModes = 0;
|
||||||
|
maxModes = ( numberOfAvailableModes < maxcount ?
|
||||||
|
numberOfAvailableModes :
|
||||||
|
maxcount );
|
||||||
|
|
||||||
|
for( i = 0; i < maxModes; ++i )
|
||||||
|
{
|
||||||
|
_glfwCGToGLFWVideoMode( CFArrayGetValueAtIndex( availableModes, i ),
|
||||||
|
&mode );
|
||||||
|
|
||||||
|
// Is it a valid mode? (only list depths >= 15 bpp)
|
||||||
|
if( mode.RedBits + mode.GreenBits + mode.BlueBits < 15 )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Check for duplicate of current mode in target list
|
||||||
|
for( j = 0; j < numModes; ++j )
|
||||||
|
{
|
||||||
|
if( _glfwVideoModesEqual( &mode, &(list[j]) ) )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If empty list or no match found
|
||||||
|
if( numModes == 0 || j == numModes )
|
||||||
|
list[numModes++] = mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
return numModes;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwGetDesktopMode() - Get the desktop video mode
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformGetDesktopMode( GLFWvidmode *mode )
|
||||||
|
{
|
||||||
|
_glfwCGToGLFWVideoMode( _glfwDesktopVideoMode, mode );
|
||||||
|
}
|
||||||
|
|
53
lib/carbon/carbon_glext.c
Normal file
53
lib/carbon/carbon_glext.c
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Carbon/AGL/CGL
|
||||||
|
// API Version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2003 Keith Bauer
|
||||||
|
// Copyright (c) 2003-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
int _glfwPlatformExtensionSupported( const char *extension )
|
||||||
|
{
|
||||||
|
// There are no AGL, CGL or NSGL extensions.
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void * _glfwPlatformGetProcAddress( const char *procname )
|
||||||
|
{
|
||||||
|
CFStringRef symbolName = CFStringCreateWithCString( kCFAllocatorDefault,
|
||||||
|
procname,
|
||||||
|
kCFStringEncodingASCII );
|
||||||
|
|
||||||
|
void *symbol = CFBundleGetFunctionPointerForName( _glfwLibrary.Libs.OpenGLFramework,
|
||||||
|
symbolName );
|
||||||
|
|
||||||
|
CFRelease( symbolName );
|
||||||
|
|
||||||
|
return symbol;
|
||||||
|
}
|
||||||
|
|
159
lib/carbon/carbon_init.c
Normal file
159
lib/carbon/carbon_init.c
Normal file
|
@ -0,0 +1,159 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Carbon/AGL/CGL
|
||||||
|
// API Version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2003 Keith Bauer
|
||||||
|
// Copyright (c) 2003-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
// Copyright (c) 2006-2007 Robin Leffmann
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Global variables
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
// KCHR resource pointer for keycode translation
|
||||||
|
void *KCHRPtr;
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Terminate GLFW when exiting application
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void glfw_atexit( void )
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define NO_BUNDLE_MESSAGE \
|
||||||
|
"Working in unbundled mode. " \
|
||||||
|
"You should build a .app wrapper for your Mac OS X applications.\n"
|
||||||
|
|
||||||
|
#define UNBUNDLED \
|
||||||
|
fprintf(stderr, NO_BUNDLE_MESSAGE); \
|
||||||
|
_glfwLibrary.Unbundled = 1; \
|
||||||
|
return
|
||||||
|
|
||||||
|
void _glfwChangeToResourcesDirectory( void )
|
||||||
|
{
|
||||||
|
CFBundleRef mainBundle = CFBundleGetMainBundle();
|
||||||
|
if( mainBundle == NULL )
|
||||||
|
{
|
||||||
|
UNBUNDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL( mainBundle );
|
||||||
|
char resourcesPath[ _GLFW_MAX_PATH_LENGTH ];
|
||||||
|
|
||||||
|
CFStringRef lastComponent = CFURLCopyLastPathComponent( resourcesURL );
|
||||||
|
if( kCFCompareEqualTo != CFStringCompare(
|
||||||
|
CFSTR( "Resources" ),
|
||||||
|
lastComponent,
|
||||||
|
0 ) )
|
||||||
|
{
|
||||||
|
UNBUNDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
CFRelease( lastComponent );
|
||||||
|
|
||||||
|
if( !CFURLGetFileSystemRepresentation( resourcesURL,
|
||||||
|
TRUE,
|
||||||
|
(UInt8*)resourcesPath,
|
||||||
|
_GLFW_MAX_PATH_LENGTH ) )
|
||||||
|
{
|
||||||
|
CFRelease( resourcesURL );
|
||||||
|
UNBUNDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
CFRelease( resourcesURL );
|
||||||
|
|
||||||
|
if( chdir( resourcesPath ) != 0 )
|
||||||
|
{
|
||||||
|
UNBUNDLED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int _glfwPlatformInit( void )
|
||||||
|
{
|
||||||
|
struct timeval tv;
|
||||||
|
UInt32 nullDummy = 0;
|
||||||
|
|
||||||
|
_glfwWin.window = NULL;
|
||||||
|
_glfwWin.aglContext = NULL;
|
||||||
|
_glfwWin.cglContext = NULL;
|
||||||
|
_glfwWin.windowUPP = NULL;
|
||||||
|
|
||||||
|
_glfwInput.Modifiers = 0;
|
||||||
|
|
||||||
|
_glfwLibrary.Unbundled = 0;
|
||||||
|
|
||||||
|
_glfwLibrary.Libs.OpenGLFramework =
|
||||||
|
CFBundleGetBundleWithIdentifier( CFSTR( "com.apple.opengl" ) );
|
||||||
|
if( _glfwLibrary.Libs.OpenGLFramework == NULL )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "glfwInit failing because you aren't linked to OpenGL\n" );
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
_glfwDesktopVideoMode = CGDisplayCurrentMode( kCGDirectMainDisplay );
|
||||||
|
if( _glfwDesktopVideoMode == NULL )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "glfwInit failing because it kind find the desktop display mode\n" );
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Install atexit routine
|
||||||
|
atexit( glfw_atexit );
|
||||||
|
|
||||||
|
_glfwChangeToResourcesDirectory();
|
||||||
|
|
||||||
|
// Ugly hack to reduce the nasty jump that occurs at the first non-
|
||||||
|
// sys keypress, caused by OS X loading certain meta scripts used
|
||||||
|
// for lexical- and raw keycode translation - instead of letting
|
||||||
|
// this happen while our application is running, we do some blunt
|
||||||
|
// function calls in advance just to get the script caching out of
|
||||||
|
// the way BEFORE our window/screen is opened. These calls might
|
||||||
|
// generate err return codes, but we don't care in this case.
|
||||||
|
// NOTE: KCHRPtr is declared globally, because we need it later on.
|
||||||
|
KCHRPtr = (void *)GetScriptVariable( smCurrentScript, smKCHRCache );
|
||||||
|
KeyTranslate( KCHRPtr, 0, &nullDummy );
|
||||||
|
UppercaseText( (char *)&nullDummy, 0, smSystemScript );
|
||||||
|
|
||||||
|
gettimeofday( &tv, NULL );
|
||||||
|
_glfwLibrary.Timer.t0 = tv.tv_sec + (double) tv.tv_usec / 1000000.0;
|
||||||
|
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int _glfwPlatformTerminate( void )
|
||||||
|
{
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
51
lib/carbon/carbon_joystick.c
Normal file
51
lib/carbon/carbon_joystick.c
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Carbon/AGL/CGL
|
||||||
|
// API Version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2003 Keith Bauer
|
||||||
|
// Copyright (c) 2003-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
// TO DO: use HID manager to implement joystick support.
|
||||||
|
|
||||||
|
int _glfwPlatformGetJoystickParam( int joy, int param )
|
||||||
|
{
|
||||||
|
// GL_FALSE == 0
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
62
lib/carbon/carbon_time.c
Normal file
62
lib/carbon/carbon_time.c
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Carbon/AGL/CGL
|
||||||
|
// API Version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2003 Keith Bauer
|
||||||
|
// Copyright (c) 2003-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** Platform implementation functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Return timer value in seconds
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
double _glfwPlatformGetTime( void )
|
||||||
|
{
|
||||||
|
struct timeval tv;
|
||||||
|
|
||||||
|
gettimeofday( &tv, NULL );
|
||||||
|
return tv.tv_sec + (double) tv.tv_usec / 1000000.0 - _glfwLibrary.Timer.t0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Set timer value in seconds
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformSetTime( double time )
|
||||||
|
{
|
||||||
|
struct timeval tv;
|
||||||
|
|
||||||
|
gettimeofday( &tv, NULL );
|
||||||
|
_glfwLibrary.Timer.t0 = tv.tv_sec + (double) tv.tv_usec / 1000000.0 - time;
|
||||||
|
}
|
||||||
|
|
1309
lib/carbon/carbon_window.c
Normal file
1309
lib/carbon/carbon_window.c
Normal file
File diff suppressed because it is too large
Load Diff
11
lib/carbon/libglfw.pc.cmake
Normal file
11
lib/carbon/libglfw.pc.cmake
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
prefix=@PREFIX@
|
||||||
|
exec_prefix=@PREFIX@
|
||||||
|
libdir=@PREFIX@/lib
|
||||||
|
includedir=@PREFIX@/include
|
||||||
|
|
||||||
|
Name: GLFW
|
||||||
|
Description: A portable framework for OpenGL development
|
||||||
|
Version: 2.7
|
||||||
|
URL: http://glfw.sourceforge.net/
|
||||||
|
Libs: -L${libdir} -lglfw -framework AGL -framework OpenGL -framework Carbon
|
||||||
|
Cflags: -I${includedir}
|
268
lib/carbon/platform.h
Normal file
268
lib/carbon/platform.h
Normal file
|
@ -0,0 +1,268 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Carbon/AGL/CGL
|
||||||
|
// API Version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2003 Keith Bauer
|
||||||
|
// Copyright (c) 2003-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
// Copyright (c) 2006-2007 Robin Leffmann
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#ifndef _platform_h_
|
||||||
|
#define _platform_h_
|
||||||
|
|
||||||
|
|
||||||
|
// This is the Mac OS X version of GLFW
|
||||||
|
#define _GLFW_MAC_OS_X
|
||||||
|
|
||||||
|
#include <Carbon/Carbon.h>
|
||||||
|
#include <OpenGL/OpenGL.h>
|
||||||
|
#include <AGL/agl.h>
|
||||||
|
|
||||||
|
#include "../../include/GL/glfw.h"
|
||||||
|
|
||||||
|
#if MACOSX_DEPLOYMENT_TARGET < MAC_OS_X_VERSION_10_3
|
||||||
|
|
||||||
|
#ifndef kCGLNoError
|
||||||
|
#define kCGLNoError 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GL_VERSION_3_0
|
||||||
|
|
||||||
|
typedef const GLubyte * (APIENTRY *PFNGLGETSTRINGIPROC) (GLenum, GLuint);
|
||||||
|
|
||||||
|
#endif /*GL_VERSION_3_0*/
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Defines
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#define _GLFW_MAX_PATH_LENGTH (8192)
|
||||||
|
|
||||||
|
#define MAC_KEY_ENTER 0x24
|
||||||
|
#define MAC_KEY_RETURN 0x34
|
||||||
|
#define MAC_KEY_ESC 0x35
|
||||||
|
#define MAC_KEY_F1 0x7A
|
||||||
|
#define MAC_KEY_F2 0x78
|
||||||
|
#define MAC_KEY_F3 0x63
|
||||||
|
#define MAC_KEY_F4 0x76
|
||||||
|
#define MAC_KEY_F5 0x60
|
||||||
|
#define MAC_KEY_F6 0x61
|
||||||
|
#define MAC_KEY_F7 0x62
|
||||||
|
#define MAC_KEY_F8 0x64
|
||||||
|
#define MAC_KEY_F9 0x65
|
||||||
|
#define MAC_KEY_F10 0x6D
|
||||||
|
#define MAC_KEY_F11 0x67
|
||||||
|
#define MAC_KEY_F12 0x6F
|
||||||
|
#define MAC_KEY_F13 0x69
|
||||||
|
#define MAC_KEY_F14 0x6B
|
||||||
|
#define MAC_KEY_F15 0x71
|
||||||
|
#define MAC_KEY_UP 0x7E
|
||||||
|
#define MAC_KEY_DOWN 0x7D
|
||||||
|
#define MAC_KEY_LEFT 0x7B
|
||||||
|
#define MAC_KEY_RIGHT 0x7C
|
||||||
|
#define MAC_KEY_TAB 0x30
|
||||||
|
#define MAC_KEY_BACKSPACE 0x33
|
||||||
|
#define MAC_KEY_HELP 0x72
|
||||||
|
#define MAC_KEY_DEL 0x75
|
||||||
|
#define MAC_KEY_PAGEUP 0x74
|
||||||
|
#define MAC_KEY_PAGEDOWN 0x79
|
||||||
|
#define MAC_KEY_HOME 0x73
|
||||||
|
#define MAC_KEY_END 0x77
|
||||||
|
#define MAC_KEY_KP_0 0x52
|
||||||
|
#define MAC_KEY_KP_1 0x53
|
||||||
|
#define MAC_KEY_KP_2 0x54
|
||||||
|
#define MAC_KEY_KP_3 0x55
|
||||||
|
#define MAC_KEY_KP_4 0x56
|
||||||
|
#define MAC_KEY_KP_5 0x57
|
||||||
|
#define MAC_KEY_KP_6 0x58
|
||||||
|
#define MAC_KEY_KP_7 0x59
|
||||||
|
#define MAC_KEY_KP_8 0x5B
|
||||||
|
#define MAC_KEY_KP_9 0x5C
|
||||||
|
#define MAC_KEY_KP_DIVIDE 0x4B
|
||||||
|
#define MAC_KEY_KP_MULTIPLY 0x43
|
||||||
|
#define MAC_KEY_KP_SUBTRACT 0x4E
|
||||||
|
#define MAC_KEY_KP_ADD 0x45
|
||||||
|
#define MAC_KEY_KP_DECIMAL 0x41
|
||||||
|
#define MAC_KEY_KP_EQUAL 0x51
|
||||||
|
#define MAC_KEY_KP_ENTER 0x4C
|
||||||
|
#define MAC_KEY_NUMLOCK 0x47
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// GLFW platform specific types
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Pointer length integer
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
typedef intptr_t GLFWintptr;
|
||||||
|
|
||||||
|
|
||||||
|
GLFWGLOBAL CFDictionaryRef _glfwDesktopVideoMode;
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Window structure
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
typedef struct _GLFWwin_struct _GLFWwin;
|
||||||
|
|
||||||
|
struct _GLFWwin_struct {
|
||||||
|
|
||||||
|
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||||
|
|
||||||
|
// User callback functions
|
||||||
|
GLFWwindowsizefun windowSizeCallback;
|
||||||
|
GLFWwindowclosefun windowCloseCallback;
|
||||||
|
GLFWwindowrefreshfun windowRefreshCallback;
|
||||||
|
GLFWmousebuttonfun mouseButtonCallback;
|
||||||
|
GLFWmouseposfun mousePosCallback;
|
||||||
|
GLFWmousewheelfun mouseWheelCallback;
|
||||||
|
GLFWkeyfun keyCallback;
|
||||||
|
GLFWcharfun charCallback;
|
||||||
|
|
||||||
|
// User selected window settings
|
||||||
|
int fullscreen; // Fullscreen flag
|
||||||
|
int mouseLock; // Mouse-lock flag
|
||||||
|
int autoPollEvents; // Auto polling flag
|
||||||
|
int sysKeysDisabled; // System keys disabled flag
|
||||||
|
int windowNoResize; // Resize- and maximize gadgets disabled flag
|
||||||
|
int refreshRate; // Vertical monitor refresh rate
|
||||||
|
|
||||||
|
// Window status & parameters
|
||||||
|
int opened; // Flag telling if window is opened or not
|
||||||
|
int active; // Application active flag
|
||||||
|
int iconified; // Window iconified flag
|
||||||
|
int width, height; // Window width and heigth
|
||||||
|
int accelerated; // GL_TRUE if window is HW accelerated
|
||||||
|
|
||||||
|
// Framebuffer attributes
|
||||||
|
int redBits;
|
||||||
|
int greenBits;
|
||||||
|
int blueBits;
|
||||||
|
int alphaBits;
|
||||||
|
int depthBits;
|
||||||
|
int stencilBits;
|
||||||
|
int accumRedBits;
|
||||||
|
int accumGreenBits;
|
||||||
|
int accumBlueBits;
|
||||||
|
int accumAlphaBits;
|
||||||
|
int auxBuffers;
|
||||||
|
int stereo;
|
||||||
|
int samples;
|
||||||
|
|
||||||
|
// OpenGL extensions and context attributes
|
||||||
|
int has_GL_SGIS_generate_mipmap;
|
||||||
|
int has_GL_ARB_texture_non_power_of_two;
|
||||||
|
int glMajor, glMinor, glRevision;
|
||||||
|
int glForward, glDebug, glProfile;
|
||||||
|
|
||||||
|
PFNGLGETSTRINGIPROC GetStringi;
|
||||||
|
|
||||||
|
// ========= PLATFORM SPECIFIC PART ======================================
|
||||||
|
|
||||||
|
WindowRef window;
|
||||||
|
|
||||||
|
AGLContext aglContext;
|
||||||
|
AGLPixelFormat aglPixelFormat;
|
||||||
|
|
||||||
|
CGLContextObj cglContext;
|
||||||
|
CGLPixelFormatObj cglPixelFormat;
|
||||||
|
|
||||||
|
EventHandlerUPP windowUPP;
|
||||||
|
EventHandlerUPP mouseUPP;
|
||||||
|
EventHandlerUPP commandUPP;
|
||||||
|
EventHandlerUPP keyboardUPP;
|
||||||
|
};
|
||||||
|
|
||||||
|
GLFWGLOBAL _GLFWwin _glfwWin;
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// User input status (some of this should go in _GLFWwin)
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
GLFWGLOBAL struct {
|
||||||
|
|
||||||
|
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||||
|
|
||||||
|
// Mouse status
|
||||||
|
int MousePosX, MousePosY;
|
||||||
|
int WheelPos;
|
||||||
|
char MouseButton[ GLFW_MOUSE_BUTTON_LAST + 1 ];
|
||||||
|
|
||||||
|
// Keyboard status
|
||||||
|
char Key[ GLFW_KEY_LAST + 1 ];
|
||||||
|
int LastChar;
|
||||||
|
|
||||||
|
// User selected settings
|
||||||
|
int StickyKeys;
|
||||||
|
int StickyMouseButtons;
|
||||||
|
int KeyRepeat;
|
||||||
|
|
||||||
|
// ========= PLATFORM SPECIFIC PART ======================================
|
||||||
|
|
||||||
|
UInt32 Modifiers;
|
||||||
|
|
||||||
|
} _glfwInput;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Library global data
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
GLFWGLOBAL struct {
|
||||||
|
|
||||||
|
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||||
|
|
||||||
|
// Window opening hints
|
||||||
|
_GLFWhints hints;
|
||||||
|
|
||||||
|
// ========= PLATFORM SPECIFIC PART ======================================
|
||||||
|
|
||||||
|
// Timer data
|
||||||
|
struct {
|
||||||
|
double t0;
|
||||||
|
} Timer;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
// Bundle for dynamically-loading extension function pointers
|
||||||
|
CFBundleRef OpenGLFramework;
|
||||||
|
} Libs;
|
||||||
|
|
||||||
|
int Unbundled;
|
||||||
|
|
||||||
|
} _glfwLibrary;
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Prototypes for platform specific internal functions
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwChangeToResourcesDirectory( void );
|
||||||
|
|
||||||
|
#endif // _platform_h_
|
44
lib/cocoa/CMakeLists.txt
Normal file
44
lib/cocoa/CMakeLists.txt
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
|
||||||
|
configure_file(
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/libglfw.pc.cmake
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc @ONLY)
|
||||||
|
|
||||||
|
include_directories(
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
${CMAKE_SOURCE_DIR}/lib
|
||||||
|
${GLFW_INCLUDE_DIR})
|
||||||
|
|
||||||
|
set(cocoa_SOURCES
|
||||||
|
cocoa_enable.m
|
||||||
|
cocoa_fullscreen.m
|
||||||
|
cocoa_glext.m
|
||||||
|
cocoa_init.m
|
||||||
|
cocoa_joystick.m
|
||||||
|
cocoa_time.m
|
||||||
|
cocoa_window.m)
|
||||||
|
|
||||||
|
# For some reason, CMake doesn't know about .m
|
||||||
|
set_source_files_properties(${cocoa_SOURCES} PROPERTIES LANGUAGE C)
|
||||||
|
|
||||||
|
set(libglfw_SOURCES
|
||||||
|
${common_SOURCES}
|
||||||
|
${cocoa_SOURCES})
|
||||||
|
|
||||||
|
add_library(libglfwStatic STATIC ${libglfw_SOURCES})
|
||||||
|
add_library(libglfwShared SHARED ${libglfw_SOURCES})
|
||||||
|
target_link_libraries(libglfwShared ${GLFW_LIBRARIES})
|
||||||
|
set_target_properties(libglfwStatic libglfwShared PROPERTIES
|
||||||
|
CLEAN_DIRECT_OUTPUT 1
|
||||||
|
OUTPUT_NAME glfw
|
||||||
|
)
|
||||||
|
|
||||||
|
# Append -fno-common to the compile flags to work around a bug in the Apple GCC
|
||||||
|
get_target_property(CFLAGS libglfwShared COMPILE_FLAGS)
|
||||||
|
if(NOT CFLAGS)
|
||||||
|
set(CFLAGS "")
|
||||||
|
endif(NOT CFLAGS)
|
||||||
|
set_target_properties(libglfwShared PROPERTIES COMPILE_FLAGS "${CFLAGS} -fno-common")
|
||||||
|
|
||||||
|
install(TARGETS libglfwStatic libglfwShared DESTINATION lib)
|
||||||
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc DESTINATION lib/pkgconfig)
|
||||||
|
|
51
lib/cocoa/cocoa_enable.m
Normal file
51
lib/cocoa/cocoa_enable.m
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Cocoa/NSOpenGL
|
||||||
|
// API Version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** Platform implementation functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Enable and disable system keys
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformEnableSystemKeys( void )
|
||||||
|
{
|
||||||
|
// This is checked in macosx_window.m; we take no action here
|
||||||
|
}
|
||||||
|
|
||||||
|
void _glfwPlatformDisableSystemKeys( void )
|
||||||
|
{
|
||||||
|
// This is checked in macosx_window.m; we take no action here
|
||||||
|
// I don't think it's really possible to disable stuff like Exposé
|
||||||
|
// except in full-screen mode.
|
||||||
|
}
|
||||||
|
|
102
lib/cocoa/cocoa_fullscreen.m
Normal file
102
lib/cocoa/cocoa_fullscreen.m
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Cocoa/NSOpenGL
|
||||||
|
// API Version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Check whether the display mode should be included in enumeration
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static BOOL modeIsGood( NSDictionary *mode )
|
||||||
|
{
|
||||||
|
// This is a bit controversial, if you've got something other than an
|
||||||
|
// LCD computer monitor as an output device you might not want these
|
||||||
|
// checks. You might also want to reject modes which are interlaced,
|
||||||
|
// or TV out. There is no one-size-fits-all policy that can work here.
|
||||||
|
// This seems like a decent compromise, but certain applications may
|
||||||
|
// wish to patch this...
|
||||||
|
return [[mode objectForKey:(id)kCGDisplayBitsPerPixel] intValue] >= 15 &&
|
||||||
|
[mode objectForKey:(id)kCGDisplayModeIsSafeForHardware] != nil &&
|
||||||
|
[mode objectForKey:(id)kCGDisplayModeIsStretched] == nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Convert Core Graphics display mode to GLFW video mode
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static GLFWvidmode vidmodeFromCGDisplayMode( NSDictionary *mode )
|
||||||
|
{
|
||||||
|
unsigned int width = [[mode objectForKey:(id)kCGDisplayWidth] unsignedIntValue];
|
||||||
|
unsigned int height = [[mode objectForKey:(id)kCGDisplayHeight] unsignedIntValue];
|
||||||
|
unsigned int bps = [[mode objectForKey:(id)kCGDisplayBitsPerSample] unsignedIntValue];
|
||||||
|
|
||||||
|
GLFWvidmode result;
|
||||||
|
result.Width = width;
|
||||||
|
result.Height = height;
|
||||||
|
result.RedBits = bps;
|
||||||
|
result.GreenBits = bps;
|
||||||
|
result.BlueBits = bps;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** Platform implementation functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Get a list of available video modes
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount )
|
||||||
|
{
|
||||||
|
NSArray *modes = (NSArray *)CGDisplayAvailableModes( CGMainDisplayID() );
|
||||||
|
|
||||||
|
unsigned int i, j = 0, n = [modes count];
|
||||||
|
for( i = 0; i < n && i < (unsigned)maxcount; i++ )
|
||||||
|
{
|
||||||
|
NSDictionary *mode = [modes objectAtIndex:i];
|
||||||
|
if( modeIsGood( mode ) )
|
||||||
|
{
|
||||||
|
list[j++] = vidmodeFromCGDisplayMode( mode );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return j;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Get the desktop video mode
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformGetDesktopMode( GLFWvidmode *mode )
|
||||||
|
{
|
||||||
|
*mode = vidmodeFromCGDisplayMode( _glfwLibrary.DesktopMode );
|
||||||
|
}
|
||||||
|
|
63
lib/cocoa/cocoa_glext.m
Normal file
63
lib/cocoa/cocoa_glext.m
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Cocoa/NSOpenGL
|
||||||
|
// API Version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** Platform implementation functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Check if an OpenGL extension is available at runtime
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformExtensionSupported( const char *extension )
|
||||||
|
{
|
||||||
|
// There are no AGL, CGL or NSGL extensions.
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Get the function pointer to an OpenGL function
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void * _glfwPlatformGetProcAddress( const char *procname )
|
||||||
|
{
|
||||||
|
CFStringRef symbolName = CFStringCreateWithCString( kCFAllocatorDefault,
|
||||||
|
procname,
|
||||||
|
kCFStringEncodingASCII );
|
||||||
|
|
||||||
|
void *symbol = CFBundleGetFunctionPointerForName( _glfwLibrary.OpenGLFramework,
|
||||||
|
symbolName );
|
||||||
|
|
||||||
|
CFRelease( symbolName );
|
||||||
|
|
||||||
|
return symbol;
|
||||||
|
}
|
||||||
|
|
250
lib/cocoa/cocoa_init.m
Normal file
250
lib/cocoa/cocoa_init.m
Normal file
|
@ -0,0 +1,250 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Cocoa/NSOpenGL
|
||||||
|
// API Version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
// Needed for _NSGetProgname
|
||||||
|
#include <crt_externs.h>
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
@interface GLFWApplication : NSApplication
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation GLFWApplication
|
||||||
|
|
||||||
|
// From http://cocoadev.com/index.pl?GameKeyboardHandlingAlmost
|
||||||
|
// This works around an AppKit bug, where key up events while holding
|
||||||
|
// down the command key don't get sent to the key window.
|
||||||
|
- (void)sendEvent:(NSEvent *)event
|
||||||
|
{
|
||||||
|
if( [event type] == NSKeyUp && ( [event modifierFlags] & NSCommandKeyMask ) )
|
||||||
|
{
|
||||||
|
[[self keyWindow] sendEvent:event];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[super sendEvent:event];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
// Prior to Snow Leopard, we need to use this oddly-named semi-private API
|
||||||
|
// to get the application menu working properly. Need to be careful in
|
||||||
|
// case it goes away in a future OS update.
|
||||||
|
@interface NSApplication (NSAppleMenu)
|
||||||
|
- (void)setAppleMenu:(NSMenu *)m;
|
||||||
|
@end
|
||||||
|
|
||||||
|
// Keys to search for as potential application names
|
||||||
|
NSString *GLFWNameKeys[] =
|
||||||
|
{
|
||||||
|
@"CFBundleDisplayName",
|
||||||
|
@"CFBundleName",
|
||||||
|
@"CFBundleExecutable",
|
||||||
|
};
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Try to figure out what the calling application is called
|
||||||
|
//========================================================================
|
||||||
|
static NSString *findAppName( void )
|
||||||
|
{
|
||||||
|
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
|
||||||
|
|
||||||
|
unsigned int i;
|
||||||
|
for( i = 0; i < sizeof(GLFWNameKeys) / sizeof(GLFWNameKeys[0]); i++ )
|
||||||
|
{
|
||||||
|
id name = [infoDictionary objectForKey:GLFWNameKeys[i]];
|
||||||
|
if (name &&
|
||||||
|
[name isKindOfClass:[NSString class]] &&
|
||||||
|
![@"" isEqualToString:name])
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we get here, we're unbundled
|
||||||
|
if( !_glfwLibrary.Unbundled )
|
||||||
|
{
|
||||||
|
// Could do this only if we discover we're unbundled, but it should
|
||||||
|
// do no harm...
|
||||||
|
ProcessSerialNumber psn = { 0, kCurrentProcess };
|
||||||
|
TransformProcessType( &psn, kProcessTransformToForegroundApplication );
|
||||||
|
|
||||||
|
// Having the app in front of the terminal window is also generally
|
||||||
|
// handy. There is an NSApplication API to do this, but...
|
||||||
|
SetFrontProcess( &psn );
|
||||||
|
|
||||||
|
_glfwLibrary.Unbundled = GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
char **progname = _NSGetProgname();
|
||||||
|
if( progname && *progname )
|
||||||
|
{
|
||||||
|
// TODO: UTF8?
|
||||||
|
return [NSString stringWithUTF8String:*progname];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Really shouldn't get here
|
||||||
|
return @"GLFW Application";
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Set up the menu bar (manually)
|
||||||
|
// This is nasty, nasty stuff -- calls to undocumented semi-private APIs that
|
||||||
|
// could go away at any moment, lots of stuff that really should be
|
||||||
|
// localize(d|able), etc. Loading a nib would save us this horror, but that
|
||||||
|
// doesn't seem like a good thing to require of GLFW's clients.
|
||||||
|
//========================================================================
|
||||||
|
static void setUpMenuBar( void )
|
||||||
|
{
|
||||||
|
NSString *appName = findAppName();
|
||||||
|
|
||||||
|
NSMenu *bar = [[NSMenu alloc] init];
|
||||||
|
[NSApp setMainMenu:bar];
|
||||||
|
|
||||||
|
NSMenuItem *appMenuItem =
|
||||||
|
[bar addItemWithTitle:@"" action:NULL keyEquivalent:@""];
|
||||||
|
NSMenu *appMenu = [[NSMenu alloc] init];
|
||||||
|
[appMenuItem setSubmenu:appMenu];
|
||||||
|
|
||||||
|
[appMenu addItemWithTitle:[NSString stringWithFormat:@"About %@", appName]
|
||||||
|
action:@selector(orderFrontStandardAboutPanel:)
|
||||||
|
keyEquivalent:@""];
|
||||||
|
[appMenu addItem:[NSMenuItem separatorItem]];
|
||||||
|
NSMenu *servicesMenu = [[NSMenu alloc] init];
|
||||||
|
[NSApp setServicesMenu:servicesMenu];
|
||||||
|
[[appMenu addItemWithTitle:@"Services"
|
||||||
|
action:NULL
|
||||||
|
keyEquivalent:@""] setSubmenu:servicesMenu];
|
||||||
|
[appMenu addItem:[NSMenuItem separatorItem]];
|
||||||
|
[appMenu addItemWithTitle:[NSString stringWithFormat:@"Hide %@", appName]
|
||||||
|
action:@selector(hide:)
|
||||||
|
keyEquivalent:@"h"];
|
||||||
|
[[appMenu addItemWithTitle:@"Hide Others"
|
||||||
|
action:@selector(hideOtherApplications:)
|
||||||
|
keyEquivalent:@"h"]
|
||||||
|
setKeyEquivalentModifierMask:NSAlternateKeyMask | NSCommandKeyMask];
|
||||||
|
[appMenu addItemWithTitle:@"Show All"
|
||||||
|
action:@selector(unhideAllApplications:)
|
||||||
|
keyEquivalent:@""];
|
||||||
|
[appMenu addItem:[NSMenuItem separatorItem]];
|
||||||
|
[appMenu addItemWithTitle:[NSString stringWithFormat:@"Quit %@", appName]
|
||||||
|
action:@selector(terminate:)
|
||||||
|
keyEquivalent:@"q"];
|
||||||
|
|
||||||
|
NSMenuItem *windowMenuItem =
|
||||||
|
[bar addItemWithTitle:@"" action:NULL keyEquivalent:@""];
|
||||||
|
NSMenu *windowMenu = [[NSMenu alloc] initWithTitle:@"Window"];
|
||||||
|
[NSApp setWindowsMenu:windowMenu];
|
||||||
|
[windowMenuItem setSubmenu:windowMenu];
|
||||||
|
|
||||||
|
[windowMenu addItemWithTitle:@"Miniaturize"
|
||||||
|
action:@selector(performMiniaturize:)
|
||||||
|
keyEquivalent:@"m"];
|
||||||
|
[windowMenu addItemWithTitle:@"Zoom"
|
||||||
|
action:@selector(performZoom:)
|
||||||
|
keyEquivalent:@""];
|
||||||
|
[windowMenu addItem:[NSMenuItem separatorItem]];
|
||||||
|
[windowMenu addItemWithTitle:@"Bring All to Front"
|
||||||
|
action:@selector(arrangeInFront:)
|
||||||
|
keyEquivalent:@""];
|
||||||
|
|
||||||
|
// At least guard the call to private API to avoid an exception if it
|
||||||
|
// goes away. Hopefully that means the worst we'll break in future is to
|
||||||
|
// look ugly...
|
||||||
|
if( [NSApp respondsToSelector:@selector(setAppleMenu:)] )
|
||||||
|
{
|
||||||
|
[NSApp setAppleMenu:appMenu];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Terminate GLFW when exiting application
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void glfw_atexit( void )
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** Platform implementation functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Initialize the GLFW library
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformInit( void )
|
||||||
|
{
|
||||||
|
_glfwLibrary.AutoreleasePool = [[NSAutoreleasePool alloc] init];
|
||||||
|
|
||||||
|
// Implicitly create shared NSApplication instance
|
||||||
|
[GLFWApplication sharedApplication];
|
||||||
|
|
||||||
|
NSString* resourcePath = [[NSBundle mainBundle] resourcePath];
|
||||||
|
|
||||||
|
if( access( [resourcePath cStringUsingEncoding:NSUTF8StringEncoding], R_OK ) == 0 )
|
||||||
|
{
|
||||||
|
chdir( [resourcePath cStringUsingEncoding:NSUTF8StringEncoding] );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setting up menu bar must go exactly here else weirdness ensues
|
||||||
|
setUpMenuBar();
|
||||||
|
|
||||||
|
[NSApp finishLaunching];
|
||||||
|
|
||||||
|
// Install atexit routine
|
||||||
|
atexit( glfw_atexit );
|
||||||
|
|
||||||
|
_glfwPlatformSetTime( 0.0 );
|
||||||
|
|
||||||
|
_glfwLibrary.DesktopMode =
|
||||||
|
(NSDictionary *)CGDisplayCurrentMode( CGMainDisplayID() );
|
||||||
|
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Close window, if open, and shut down GLFW
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformTerminate( void )
|
||||||
|
{
|
||||||
|
glfwCloseWindow();
|
||||||
|
|
||||||
|
// TODO: Probably other cleanup
|
||||||
|
|
||||||
|
[_glfwLibrary.AutoreleasePool release];
|
||||||
|
_glfwLibrary.AutoreleasePool = nil;
|
||||||
|
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
65
lib/cocoa/cocoa_joystick.m
Normal file
65
lib/cocoa/cocoa_joystick.m
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Cocoa/NSOpenGL
|
||||||
|
// API Version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** Platform implementation functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Determine joystick capabilities
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformGetJoystickParam( int joy, int param )
|
||||||
|
{
|
||||||
|
// TODO: Implement this.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Get joystick axis positions
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes )
|
||||||
|
{
|
||||||
|
// TODO: Implement this.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Get joystick button states
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons )
|
||||||
|
{
|
||||||
|
// TODO: Implement this.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
53
lib/cocoa/cocoa_time.m
Normal file
53
lib/cocoa/cocoa_time.m
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Cocoa/NSOpenGL
|
||||||
|
// API Version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** Platform implementation functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Return timer value in seconds
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
double _glfwPlatformGetTime( void )
|
||||||
|
{
|
||||||
|
return [NSDate timeIntervalSinceReferenceDate] - _glfwLibrary.Timer.t0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Set timer value in seconds
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformSetTime( double time )
|
||||||
|
{
|
||||||
|
_glfwLibrary.Timer.t0 = [NSDate timeIntervalSinceReferenceDate] - time;
|
||||||
|
}
|
||||||
|
|
886
lib/cocoa/cocoa_window.m
Normal file
886
lib/cocoa/cocoa_window.m
Normal file
|
@ -0,0 +1,886 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Cocoa/NSOpenGL
|
||||||
|
// API Version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Delegate for window related notifications
|
||||||
|
// (but also used as an application delegate)
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
@interface GLFWWindowDelegate : NSObject
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation GLFWWindowDelegate
|
||||||
|
|
||||||
|
- (BOOL)windowShouldClose:(id)window
|
||||||
|
{
|
||||||
|
if( _glfwWin.windowCloseCallback )
|
||||||
|
{
|
||||||
|
if( !_glfwWin.windowCloseCallback() )
|
||||||
|
{
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is horribly ugly, but it works
|
||||||
|
glfwCloseWindow();
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)windowDidResize:(NSNotification *)notification
|
||||||
|
{
|
||||||
|
[_glfwWin.context update];
|
||||||
|
|
||||||
|
NSRect contentRect =
|
||||||
|
[_glfwWin.window contentRectForFrameRect:[_glfwWin.window frame]];
|
||||||
|
_glfwWin.width = contentRect.size.width;
|
||||||
|
_glfwWin.height = contentRect.size.height;
|
||||||
|
|
||||||
|
if( _glfwWin.windowSizeCallback )
|
||||||
|
{
|
||||||
|
_glfwWin.windowSizeCallback( _glfwWin.width, _glfwWin.height );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
|
||||||
|
{
|
||||||
|
if( _glfwWin.windowCloseCallback )
|
||||||
|
{
|
||||||
|
if( !_glfwWin.windowCloseCallback() )
|
||||||
|
{
|
||||||
|
return NSTerminateCancel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is horribly ugly, but it works
|
||||||
|
glfwCloseWindow();
|
||||||
|
return NSTerminateCancel;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
// TODO: Need to find mappings for F13-F15, volume down/up/mute, and eject.
|
||||||
|
static const unsigned int MAC_TO_GLFW_KEYCODE_MAPPING[128] =
|
||||||
|
{
|
||||||
|
/* 00 */ 'A',
|
||||||
|
/* 01 */ 'S',
|
||||||
|
/* 02 */ 'D',
|
||||||
|
/* 03 */ 'F',
|
||||||
|
/* 04 */ 'H',
|
||||||
|
/* 05 */ 'G',
|
||||||
|
/* 06 */ 'Z',
|
||||||
|
/* 07 */ 'X',
|
||||||
|
/* 08 */ 'C',
|
||||||
|
/* 09 */ 'V',
|
||||||
|
/* 0a */ -1,
|
||||||
|
/* 0b */ 'B',
|
||||||
|
/* 0c */ 'Q',
|
||||||
|
/* 0d */ 'W',
|
||||||
|
/* 0e */ 'E',
|
||||||
|
/* 0f */ 'R',
|
||||||
|
/* 10 */ 'Y',
|
||||||
|
/* 11 */ 'T',
|
||||||
|
/* 12 */ '1',
|
||||||
|
/* 13 */ '2',
|
||||||
|
/* 14 */ '3',
|
||||||
|
/* 15 */ '4',
|
||||||
|
/* 16 */ '6',
|
||||||
|
/* 17 */ '5',
|
||||||
|
/* 18 */ '=',
|
||||||
|
/* 19 */ '9',
|
||||||
|
/* 1a */ '7',
|
||||||
|
/* 1b */ '-',
|
||||||
|
/* 1c */ '8',
|
||||||
|
/* 1d */ '0',
|
||||||
|
/* 1e */ ']',
|
||||||
|
/* 1f */ 'O',
|
||||||
|
/* 20 */ 'U',
|
||||||
|
/* 21 */ '[',
|
||||||
|
/* 22 */ 'I',
|
||||||
|
/* 23 */ 'P',
|
||||||
|
/* 24 */ GLFW_KEY_ENTER,
|
||||||
|
/* 25 */ 'L',
|
||||||
|
/* 26 */ 'J',
|
||||||
|
/* 27 */ '\'',
|
||||||
|
/* 28 */ 'K',
|
||||||
|
/* 29 */ ';',
|
||||||
|
/* 2a */ '\\',
|
||||||
|
/* 2b */ ',',
|
||||||
|
/* 2c */ '/',
|
||||||
|
/* 2d */ 'N',
|
||||||
|
/* 2e */ 'M',
|
||||||
|
/* 2f */ '.',
|
||||||
|
/* 30 */ GLFW_KEY_TAB,
|
||||||
|
/* 31 */ GLFW_KEY_SPACE,
|
||||||
|
/* 32 */ '`',
|
||||||
|
/* 33 */ GLFW_KEY_BACKSPACE,
|
||||||
|
/* 34 */ -1,
|
||||||
|
/* 35 */ GLFW_KEY_ESC,
|
||||||
|
/* 36 */ GLFW_KEY_RSUPER,
|
||||||
|
/* 37 */ GLFW_KEY_LSUPER,
|
||||||
|
/* 38 */ GLFW_KEY_LSHIFT,
|
||||||
|
/* 39 */ GLFW_KEY_CAPS_LOCK,
|
||||||
|
/* 3a */ GLFW_KEY_LALT,
|
||||||
|
/* 3b */ GLFW_KEY_LCTRL,
|
||||||
|
/* 3c */ GLFW_KEY_RSHIFT,
|
||||||
|
/* 3d */ GLFW_KEY_RALT,
|
||||||
|
/* 3e */ GLFW_KEY_RCTRL,
|
||||||
|
/* 3f */ -1, /*Function*/
|
||||||
|
/* 40 */ GLFW_KEY_F17,
|
||||||
|
/* 41 */ GLFW_KEY_KP_DECIMAL,
|
||||||
|
/* 42 */ -1,
|
||||||
|
/* 43 */ GLFW_KEY_KP_MULTIPLY,
|
||||||
|
/* 44 */ -1,
|
||||||
|
/* 45 */ GLFW_KEY_KP_ADD,
|
||||||
|
/* 46 */ -1,
|
||||||
|
/* 47 */ -1, /*KeypadClear*/
|
||||||
|
/* 48 */ -1, /*VolumeUp*/
|
||||||
|
/* 49 */ -1, /*VolumeDown*/
|
||||||
|
/* 4a */ -1, /*Mute*/
|
||||||
|
/* 4b */ GLFW_KEY_KP_DIVIDE,
|
||||||
|
/* 4c */ GLFW_KEY_KP_ENTER,
|
||||||
|
/* 4d */ -1,
|
||||||
|
/* 4e */ GLFW_KEY_KP_SUBTRACT,
|
||||||
|
/* 4f */ GLFW_KEY_F18,
|
||||||
|
/* 50 */ GLFW_KEY_F19,
|
||||||
|
/* 51 */ GLFW_KEY_KP_EQUAL,
|
||||||
|
/* 52 */ GLFW_KEY_KP_0,
|
||||||
|
/* 53 */ GLFW_KEY_KP_1,
|
||||||
|
/* 54 */ GLFW_KEY_KP_2,
|
||||||
|
/* 55 */ GLFW_KEY_KP_3,
|
||||||
|
/* 56 */ GLFW_KEY_KP_4,
|
||||||
|
/* 57 */ GLFW_KEY_KP_5,
|
||||||
|
/* 58 */ GLFW_KEY_KP_6,
|
||||||
|
/* 59 */ GLFW_KEY_KP_7,
|
||||||
|
/* 5a */ GLFW_KEY_F20,
|
||||||
|
/* 5b */ GLFW_KEY_KP_8,
|
||||||
|
/* 5c */ GLFW_KEY_KP_9,
|
||||||
|
/* 5d */ -1,
|
||||||
|
/* 5e */ -1,
|
||||||
|
/* 5f */ -1,
|
||||||
|
/* 60 */ GLFW_KEY_F5,
|
||||||
|
/* 61 */ GLFW_KEY_F6,
|
||||||
|
/* 62 */ GLFW_KEY_F7,
|
||||||
|
/* 63 */ GLFW_KEY_F3,
|
||||||
|
/* 64 */ GLFW_KEY_F8,
|
||||||
|
/* 65 */ GLFW_KEY_F9,
|
||||||
|
/* 66 */ -1,
|
||||||
|
/* 67 */ GLFW_KEY_F11,
|
||||||
|
/* 68 */ -1,
|
||||||
|
/* 69 */ GLFW_KEY_F13,
|
||||||
|
/* 6a */ GLFW_KEY_F16,
|
||||||
|
/* 6b */ GLFW_KEY_F14,
|
||||||
|
/* 6c */ -1,
|
||||||
|
/* 6d */ GLFW_KEY_F10,
|
||||||
|
/* 6e */ -1,
|
||||||
|
/* 6f */ GLFW_KEY_F12,
|
||||||
|
/* 70 */ -1,
|
||||||
|
/* 71 */ GLFW_KEY_F15,
|
||||||
|
/* 72 */ GLFW_KEY_INSERT, /*Help*/
|
||||||
|
/* 73 */ GLFW_KEY_HOME,
|
||||||
|
/* 74 */ GLFW_KEY_PAGEUP,
|
||||||
|
/* 75 */ GLFW_KEY_DEL,
|
||||||
|
/* 76 */ GLFW_KEY_F4,
|
||||||
|
/* 77 */ GLFW_KEY_END,
|
||||||
|
/* 78 */ GLFW_KEY_F2,
|
||||||
|
/* 79 */ GLFW_KEY_PAGEDOWN,
|
||||||
|
/* 7a */ GLFW_KEY_F1,
|
||||||
|
/* 7b */ GLFW_KEY_LEFT,
|
||||||
|
/* 7c */ GLFW_KEY_RIGHT,
|
||||||
|
/* 7d */ GLFW_KEY_DOWN,
|
||||||
|
/* 7e */ GLFW_KEY_UP,
|
||||||
|
/* 7f */ -1,
|
||||||
|
};
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Converts a Mac OS X keycode to a GLFW keycode
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static int convertMacKeyCode( unsigned int macKeyCode )
|
||||||
|
{
|
||||||
|
if( macKeyCode >= 128 )
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This treats keycodes as *positional*; that is, we'll return 'a'
|
||||||
|
// for the key left of 's', even on an AZERTY keyboard. The charInput
|
||||||
|
// function should still get 'q' though.
|
||||||
|
return MAC_TO_GLFW_KEYCODE_MAPPING[macKeyCode];
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Content view class for the GLFW window
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
@interface GLFWContentView : NSView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation GLFWContentView
|
||||||
|
|
||||||
|
- (BOOL)isOpaque
|
||||||
|
{
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)canBecomeKeyView
|
||||||
|
{
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)acceptsFirstResponder
|
||||||
|
{
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)mouseDown:(NSEvent *)event
|
||||||
|
{
|
||||||
|
_glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS );
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)mouseDragged:(NSEvent *)event
|
||||||
|
{
|
||||||
|
[self mouseMoved:event];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)mouseUp:(NSEvent *)event
|
||||||
|
{
|
||||||
|
_glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_RELEASE );
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)mouseMoved:(NSEvent *)event
|
||||||
|
{
|
||||||
|
if( _glfwWin.mouseLock )
|
||||||
|
{
|
||||||
|
_glfwInput.MousePosX += [event deltaX];
|
||||||
|
_glfwInput.MousePosY += [event deltaY];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NSPoint p = [event locationInWindow];
|
||||||
|
|
||||||
|
// Cocoa coordinate system has origin at lower left
|
||||||
|
_glfwInput.MousePosX = p.x;
|
||||||
|
_glfwInput.MousePosY = [[_glfwWin.window contentView] bounds].size.height - p.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( _glfwWin.mousePosCallback )
|
||||||
|
{
|
||||||
|
_glfwWin.mousePosCallback( _glfwInput.MousePosX, _glfwInput.MousePosY );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)rightMouseDown:(NSEvent *)event
|
||||||
|
{
|
||||||
|
_glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_PRESS );
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)rightMouseDragged:(NSEvent *)event
|
||||||
|
{
|
||||||
|
[self mouseMoved:event];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)rightMouseUp:(NSEvent *)event
|
||||||
|
{
|
||||||
|
_glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_RELEASE );
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)otherMouseDown:(NSEvent *)event
|
||||||
|
{
|
||||||
|
_glfwInputMouseClick( [event buttonNumber], GLFW_PRESS );
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)otherMouseDragged:(NSEvent *)event
|
||||||
|
{
|
||||||
|
[self mouseMoved:event];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)otherMouseUp:(NSEvent *)event
|
||||||
|
{
|
||||||
|
_glfwInputMouseClick( [event buttonNumber], GLFW_RELEASE );
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)keyDown:(NSEvent *)event
|
||||||
|
{
|
||||||
|
NSUInteger length;
|
||||||
|
NSString* characters;
|
||||||
|
int i, code = convertMacKeyCode( [event keyCode] );
|
||||||
|
|
||||||
|
if( code != -1 )
|
||||||
|
{
|
||||||
|
_glfwInputKey( code, GLFW_PRESS );
|
||||||
|
|
||||||
|
if( [event modifierFlags] & NSCommandKeyMask )
|
||||||
|
{
|
||||||
|
if( !_glfwWin.sysKeysDisabled )
|
||||||
|
{
|
||||||
|
[super keyDown:event];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
characters = [event characters];
|
||||||
|
length = [characters length];
|
||||||
|
|
||||||
|
for( i = 0; i < length; i++ )
|
||||||
|
{
|
||||||
|
_glfwInputChar( [characters characterAtIndex:i], GLFW_PRESS );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)flagsChanged:(NSEvent *)event
|
||||||
|
{
|
||||||
|
unsigned int newModifierFlags = [event modifierFlags] | NSDeviceIndependentModifierFlagsMask;
|
||||||
|
int mode;
|
||||||
|
|
||||||
|
if( newModifierFlags > _glfwWin.modifierFlags )
|
||||||
|
{
|
||||||
|
mode = GLFW_PRESS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mode = GLFW_RELEASE;
|
||||||
|
}
|
||||||
|
|
||||||
|
_glfwWin.modifierFlags = newModifierFlags;
|
||||||
|
_glfwInputKey( MAC_TO_GLFW_KEYCODE_MAPPING[[event keyCode]], mode );
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)keyUp:(NSEvent *)event
|
||||||
|
{
|
||||||
|
NSUInteger length;
|
||||||
|
NSString* characters;
|
||||||
|
int i, code = convertMacKeyCode( [event keyCode] );
|
||||||
|
|
||||||
|
if( code != -1 )
|
||||||
|
{
|
||||||
|
_glfwInputKey( code, GLFW_RELEASE );
|
||||||
|
|
||||||
|
characters = [event characters];
|
||||||
|
length = [characters length];
|
||||||
|
|
||||||
|
for( i = 0; i < length; i++ )
|
||||||
|
{
|
||||||
|
_glfwInputChar( [characters characterAtIndex:i], GLFW_RELEASE );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)scrollWheel:(NSEvent *)event
|
||||||
|
{
|
||||||
|
_glfwInput.WheelPosFloating += [event deltaY];
|
||||||
|
_glfwInput.WheelPos = lrint(_glfwInput.WheelPosFloating);
|
||||||
|
|
||||||
|
if( _glfwWin.mouseWheelCallback )
|
||||||
|
{
|
||||||
|
_glfwWin.mouseWheelCallback( _glfwInput.WheelPos );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** Platform implementation functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Here is where the window is created, and the OpenGL rendering context is
|
||||||
|
// created
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformOpenWindow( int width, int height,
|
||||||
|
const _GLFWwndconfig *wndconfig,
|
||||||
|
const _GLFWfbconfig *fbconfig )
|
||||||
|
{
|
||||||
|
int colorBits;
|
||||||
|
|
||||||
|
_glfwWin.pixelFormat = nil;
|
||||||
|
_glfwWin.window = nil;
|
||||||
|
_glfwWin.context = nil;
|
||||||
|
_glfwWin.delegate = nil;
|
||||||
|
|
||||||
|
// Fail if OpenGL 3.0 or above was requested
|
||||||
|
if( wndconfig->glMajor > 2 )
|
||||||
|
{
|
||||||
|
_glfwPlatformCloseWindow();
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
_glfwWin.delegate = [[GLFWWindowDelegate alloc] init];
|
||||||
|
if( _glfwWin.delegate == nil )
|
||||||
|
{
|
||||||
|
_glfwPlatformCloseWindow();
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
[NSApp setDelegate:_glfwWin.delegate];
|
||||||
|
|
||||||
|
// Mac OS X needs non-zero color size, so set resonable values
|
||||||
|
colorBits = fbconfig->redBits + fbconfig->greenBits + fbconfig->blueBits;
|
||||||
|
if( colorBits == 0 )
|
||||||
|
{
|
||||||
|
colorBits = 24;
|
||||||
|
}
|
||||||
|
else if( colorBits < 15 )
|
||||||
|
{
|
||||||
|
colorBits = 15;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ignored hints:
|
||||||
|
// OpenGLMajor, OpenGLMinor, OpenGLForward:
|
||||||
|
// pending Mac OS X support for OpenGL 3.x
|
||||||
|
// OpenGLDebug
|
||||||
|
// pending it meaning anything on Mac OS X
|
||||||
|
|
||||||
|
// Don't use accumulation buffer support; it's not accelerated
|
||||||
|
// Aux buffers probably aren't accelerated either
|
||||||
|
|
||||||
|
CFDictionaryRef fullscreenMode = NULL;
|
||||||
|
if( wndconfig->mode == GLFW_FULLSCREEN )
|
||||||
|
{
|
||||||
|
fullscreenMode =
|
||||||
|
// I think it's safe to pass 0 to the refresh rate for this function
|
||||||
|
// rather than conditionalizing the code to call the version which
|
||||||
|
// doesn't specify refresh...
|
||||||
|
CGDisplayBestModeForParametersAndRefreshRateWithProperty(
|
||||||
|
CGMainDisplayID(),
|
||||||
|
colorBits + fbconfig->alphaBits,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
wndconfig->refreshRate,
|
||||||
|
// Controversial, see macosx_fullscreen.m for discussion
|
||||||
|
kCGDisplayModeIsSafeForHardware,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
width = [[(id)fullscreenMode objectForKey:(id)kCGDisplayWidth] intValue];
|
||||||
|
height = [[(id)fullscreenMode objectForKey:(id)kCGDisplayHeight] intValue];
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int styleMask = 0;
|
||||||
|
if( wndconfig->mode == GLFW_WINDOW )
|
||||||
|
{
|
||||||
|
styleMask = NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask;
|
||||||
|
|
||||||
|
if( !wndconfig->windowNoResize )
|
||||||
|
{
|
||||||
|
styleMask |= NSResizableWindowMask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
styleMask = NSBorderlessWindowMask;
|
||||||
|
}
|
||||||
|
|
||||||
|
_glfwWin.window = [[NSWindow alloc]
|
||||||
|
initWithContentRect:NSMakeRect(0, 0, width, height)
|
||||||
|
styleMask:styleMask
|
||||||
|
backing:NSBackingStoreBuffered
|
||||||
|
defer:NO];
|
||||||
|
[_glfwWin.window setContentView:[[GLFWContentView alloc] init]];
|
||||||
|
[_glfwWin.window setDelegate:_glfwWin.delegate];
|
||||||
|
[_glfwWin.window setAcceptsMouseMovedEvents:YES];
|
||||||
|
[_glfwWin.window center];
|
||||||
|
|
||||||
|
if( wndconfig->mode == GLFW_FULLSCREEN )
|
||||||
|
{
|
||||||
|
CGCaptureAllDisplays();
|
||||||
|
CGDisplaySwitchToMode( CGMainDisplayID(), fullscreenMode );
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int attribute_count = 0;
|
||||||
|
#define ADD_ATTR(x) attributes[attribute_count++] = x
|
||||||
|
#define ADD_ATTR2(x, y) (void)({ ADD_ATTR(x); ADD_ATTR(y); })
|
||||||
|
#define MAX_ATTRS 24 // urgh
|
||||||
|
NSOpenGLPixelFormatAttribute attributes[MAX_ATTRS];
|
||||||
|
|
||||||
|
ADD_ATTR( NSOpenGLPFADoubleBuffer );
|
||||||
|
|
||||||
|
if( wndconfig->mode == GLFW_FULLSCREEN )
|
||||||
|
{
|
||||||
|
ADD_ATTR( NSOpenGLPFAFullScreen );
|
||||||
|
ADD_ATTR( NSOpenGLPFANoRecovery );
|
||||||
|
ADD_ATTR2( NSOpenGLPFAScreenMask,
|
||||||
|
CGDisplayIDToOpenGLDisplayMask( CGMainDisplayID() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
ADD_ATTR2( NSOpenGLPFAColorSize, colorBits );
|
||||||
|
|
||||||
|
if( fbconfig->alphaBits > 0)
|
||||||
|
{
|
||||||
|
ADD_ATTR2( NSOpenGLPFAAlphaSize, fbconfig->alphaBits );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( fbconfig->depthBits > 0)
|
||||||
|
{
|
||||||
|
ADD_ATTR2( NSOpenGLPFADepthSize, fbconfig->depthBits );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( fbconfig->stencilBits > 0)
|
||||||
|
{
|
||||||
|
ADD_ATTR2( NSOpenGLPFAStencilSize, fbconfig->stencilBits );
|
||||||
|
}
|
||||||
|
|
||||||
|
int accumBits = fbconfig->accumRedBits + fbconfig->accumGreenBits +
|
||||||
|
fbconfig->accumBlueBits + fbconfig->accumAlphaBits;
|
||||||
|
|
||||||
|
if( accumBits > 0)
|
||||||
|
{
|
||||||
|
ADD_ATTR2( NSOpenGLPFAAccumSize, accumBits );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( fbconfig->auxBuffers > 0)
|
||||||
|
{
|
||||||
|
ADD_ATTR2( NSOpenGLPFAAuxBuffers, fbconfig->auxBuffers );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( fbconfig->stereo)
|
||||||
|
{
|
||||||
|
ADD_ATTR( NSOpenGLPFAStereo );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( fbconfig->samples > 0)
|
||||||
|
{
|
||||||
|
ADD_ATTR2( NSOpenGLPFASampleBuffers, 1 );
|
||||||
|
ADD_ATTR2( NSOpenGLPFASamples, fbconfig->samples );
|
||||||
|
}
|
||||||
|
|
||||||
|
ADD_ATTR(0);
|
||||||
|
|
||||||
|
_glfwWin.pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes];
|
||||||
|
if( _glfwWin.pixelFormat == nil )
|
||||||
|
{
|
||||||
|
_glfwPlatformCloseWindow();
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
_glfwWin.context = [[NSOpenGLContext alloc] initWithFormat:_glfwWin.pixelFormat
|
||||||
|
shareContext:nil];
|
||||||
|
if( _glfwWin.context == nil )
|
||||||
|
{
|
||||||
|
_glfwPlatformCloseWindow();
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
[_glfwWin.window makeKeyAndOrderFront:nil];
|
||||||
|
[_glfwWin.context setView:[_glfwWin.window contentView]];
|
||||||
|
|
||||||
|
if( wndconfig->mode == GLFW_FULLSCREEN )
|
||||||
|
{
|
||||||
|
// TODO: Make this work on pre-Leopard systems
|
||||||
|
[[_glfwWin.window contentView] enterFullScreenMode:[NSScreen mainScreen]
|
||||||
|
withOptions:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
[_glfwWin.context makeCurrentContext];
|
||||||
|
|
||||||
|
NSPoint point = [[NSCursor currentCursor] hotSpot];
|
||||||
|
_glfwInput.MousePosX = point.x;
|
||||||
|
_glfwInput.MousePosY = point.y;
|
||||||
|
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Properly kill the window / video display
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformCloseWindow( void )
|
||||||
|
{
|
||||||
|
[_glfwWin.window orderOut:nil];
|
||||||
|
|
||||||
|
if( _glfwWin.fullscreen )
|
||||||
|
{
|
||||||
|
[[_glfwWin.window contentView] exitFullScreenModeWithOptions:nil];
|
||||||
|
CGDisplaySwitchToMode( CGMainDisplayID(),
|
||||||
|
(CFDictionaryRef)_glfwLibrary.DesktopMode );
|
||||||
|
CGReleaseAllDisplays();
|
||||||
|
}
|
||||||
|
|
||||||
|
[_glfwWin.pixelFormat release];
|
||||||
|
_glfwWin.pixelFormat = nil;
|
||||||
|
|
||||||
|
[NSOpenGLContext clearCurrentContext];
|
||||||
|
[_glfwWin.context release];
|
||||||
|
_glfwWin.context = nil;
|
||||||
|
|
||||||
|
[_glfwWin.window setDelegate:nil];
|
||||||
|
[NSApp setDelegate:nil];
|
||||||
|
[_glfwWin.delegate release];
|
||||||
|
_glfwWin.delegate = nil;
|
||||||
|
|
||||||
|
[_glfwWin.window close];
|
||||||
|
_glfwWin.window = nil;
|
||||||
|
|
||||||
|
// TODO: Probably more cleanup
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Set the window title
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformSetWindowTitle( const char *title )
|
||||||
|
{
|
||||||
|
[_glfwWin.window setTitle:[NSString stringWithCString:title
|
||||||
|
encoding:NSISOLatin1StringEncoding]];
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Set the window size
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformSetWindowSize( int width, int height )
|
||||||
|
{
|
||||||
|
[_glfwWin.window setContentSize:NSMakeSize(width, height)];
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Set the window position
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformSetWindowPos( int x, int y )
|
||||||
|
{
|
||||||
|
NSRect contentRect = [_glfwWin.window contentRectForFrameRect:[_glfwWin.window frame]];
|
||||||
|
|
||||||
|
// We assume here that the client code wants to position the window within the
|
||||||
|
// screen the window currently occupies
|
||||||
|
NSRect screenRect = [[_glfwWin.window screen] visibleFrame];
|
||||||
|
contentRect.origin = NSMakePoint(screenRect.origin.x + x,
|
||||||
|
screenRect.origin.y + screenRect.size.height -
|
||||||
|
y - contentRect.size.height);
|
||||||
|
|
||||||
|
[_glfwWin.window setFrame:[_glfwWin.window frameRectForContentRect:contentRect]
|
||||||
|
display:YES];
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Iconify the window
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformIconifyWindow( void )
|
||||||
|
{
|
||||||
|
[_glfwWin.window miniaturize:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Restore (un-iconify) the window
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformRestoreWindow( void )
|
||||||
|
{
|
||||||
|
[_glfwWin.window deminiaturize:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Swap buffers
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformSwapBuffers( void )
|
||||||
|
{
|
||||||
|
// ARP appears to be unnecessary, but this is future-proof
|
||||||
|
[_glfwWin.context flushBuffer];
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Set double buffering swap interval
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformSwapInterval( int interval )
|
||||||
|
{
|
||||||
|
GLint sync = interval;
|
||||||
|
[_glfwWin.context setValues:&sync forParameter:NSOpenGLCPSwapInterval];
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Write back window parameters into GLFW window structure
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformRefreshWindowParams( void )
|
||||||
|
{
|
||||||
|
GLint value;
|
||||||
|
|
||||||
|
// Since GLFW 2.x doesn't understand screens, we use virtual screen zero
|
||||||
|
|
||||||
|
[_glfwWin.pixelFormat getValues:&value
|
||||||
|
forAttribute:NSOpenGLPFAAccelerated
|
||||||
|
forVirtualScreen:0];
|
||||||
|
_glfwWin.accelerated = value;
|
||||||
|
|
||||||
|
[_glfwWin.pixelFormat getValues:&value
|
||||||
|
forAttribute:NSOpenGLPFAAlphaSize
|
||||||
|
forVirtualScreen:0];
|
||||||
|
_glfwWin.alphaBits = value;
|
||||||
|
|
||||||
|
// It seems that the color size includes the size of the alpha channel
|
||||||
|
[_glfwWin.pixelFormat getValues:&value
|
||||||
|
forAttribute:NSOpenGLPFAColorSize
|
||||||
|
forVirtualScreen:0];
|
||||||
|
value -= _glfwWin.alphaBits;
|
||||||
|
_glfwWin.redBits = value / 3;
|
||||||
|
_glfwWin.greenBits = value / 3;
|
||||||
|
_glfwWin.blueBits = value / 3;
|
||||||
|
|
||||||
|
[_glfwWin.pixelFormat getValues:&value
|
||||||
|
forAttribute:NSOpenGLPFADepthSize
|
||||||
|
forVirtualScreen:0];
|
||||||
|
_glfwWin.depthBits = value;
|
||||||
|
|
||||||
|
[_glfwWin.pixelFormat getValues:&value
|
||||||
|
forAttribute:NSOpenGLPFAStencilSize
|
||||||
|
forVirtualScreen:0];
|
||||||
|
_glfwWin.stencilBits = value;
|
||||||
|
|
||||||
|
[_glfwWin.pixelFormat getValues:&value
|
||||||
|
forAttribute:NSOpenGLPFAAccumSize
|
||||||
|
forVirtualScreen:0];
|
||||||
|
_glfwWin.accumRedBits = value / 3;
|
||||||
|
_glfwWin.accumGreenBits = value / 3;
|
||||||
|
_glfwWin.accumBlueBits = value / 3;
|
||||||
|
|
||||||
|
// TODO: Figure out what to set this value to
|
||||||
|
_glfwWin.accumAlphaBits = 0;
|
||||||
|
|
||||||
|
[_glfwWin.pixelFormat getValues:&value
|
||||||
|
forAttribute:NSOpenGLPFAAuxBuffers
|
||||||
|
forVirtualScreen:0];
|
||||||
|
_glfwWin.auxBuffers = value;
|
||||||
|
|
||||||
|
[_glfwWin.pixelFormat getValues:&value
|
||||||
|
forAttribute:NSOpenGLPFAStereo
|
||||||
|
forVirtualScreen:0];
|
||||||
|
_glfwWin.stereo = value;
|
||||||
|
|
||||||
|
[_glfwWin.pixelFormat getValues:&value
|
||||||
|
forAttribute:NSOpenGLPFASamples
|
||||||
|
forVirtualScreen:0];
|
||||||
|
_glfwWin.samples = value;
|
||||||
|
|
||||||
|
// These are forced to false as long as Mac OS X lacks support for OpenGL 3.0+
|
||||||
|
_glfwWin.glForward = GL_FALSE;
|
||||||
|
_glfwWin.glDebug = GL_FALSE;
|
||||||
|
_glfwWin.glProfile = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Poll for new window and input events
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformPollEvents( void )
|
||||||
|
{
|
||||||
|
NSEvent *event;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
event = [NSApp nextEventMatchingMask:NSAnyEventMask
|
||||||
|
untilDate:[NSDate distantPast]
|
||||||
|
inMode:NSDefaultRunLoopMode
|
||||||
|
dequeue:YES];
|
||||||
|
|
||||||
|
if (event)
|
||||||
|
{
|
||||||
|
[NSApp sendEvent:event];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (event);
|
||||||
|
|
||||||
|
[_glfwLibrary.AutoreleasePool drain];
|
||||||
|
_glfwLibrary.AutoreleasePool = [[NSAutoreleasePool alloc] init];
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Wait for new window and input events
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformWaitEvents( void )
|
||||||
|
{
|
||||||
|
// I wanted to pass NO to dequeue:, and rely on PollEvents to
|
||||||
|
// dequeue and send. For reasons not at all clear to me, passing
|
||||||
|
// NO to dequeue: causes this method never to return.
|
||||||
|
NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask
|
||||||
|
untilDate:[NSDate distantFuture]
|
||||||
|
inMode:NSDefaultRunLoopMode
|
||||||
|
dequeue:YES];
|
||||||
|
[NSApp sendEvent:event];
|
||||||
|
|
||||||
|
_glfwPlatformPollEvents();
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Hide mouse cursor (lock it)
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformHideMouseCursor( void )
|
||||||
|
{
|
||||||
|
[NSCursor hide];
|
||||||
|
CGAssociateMouseAndMouseCursorPosition( false );
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Show mouse cursor (unlock it)
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformShowMouseCursor( void )
|
||||||
|
{
|
||||||
|
[NSCursor unhide];
|
||||||
|
CGAssociateMouseAndMouseCursorPosition( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Set physical mouse cursor position
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformSetMouseCursorPos( int x, int y )
|
||||||
|
{
|
||||||
|
// The library seems to assume that after calling this the mouse won't move,
|
||||||
|
// but obviously it will, and escape the app's window, and activate other apps,
|
||||||
|
// and other badness in pain. I think the API's just silly, but maybe I'm
|
||||||
|
// misunderstanding it...
|
||||||
|
|
||||||
|
// Also, (x, y) are window coords...
|
||||||
|
|
||||||
|
// Also, it doesn't seem possible to write this robustly without
|
||||||
|
// calculating the maximum y coordinate of all screens, since Cocoa's
|
||||||
|
// "global coordinates" are upside down from CG's...
|
||||||
|
|
||||||
|
// Without this (once per app run, but it's convenient to do it here)
|
||||||
|
// events will be suppressed for a default of 0.25 seconds after we
|
||||||
|
// move the cursor.
|
||||||
|
CGSetLocalEventsSuppressionInterval( 0.0 );
|
||||||
|
|
||||||
|
NSPoint localPoint = NSMakePoint( x, y );
|
||||||
|
NSPoint globalPoint = [_glfwWin.window convertBaseToScreen:localPoint];
|
||||||
|
CGPoint mainScreenOrigin = CGDisplayBounds( CGMainDisplayID() ).origin;
|
||||||
|
double mainScreenHeight = CGDisplayBounds( CGMainDisplayID() ).size.height;
|
||||||
|
CGPoint targetPoint = CGPointMake( globalPoint.x - mainScreenOrigin.x,
|
||||||
|
mainScreenHeight - globalPoint.y - mainScreenOrigin.y );
|
||||||
|
CGDisplayMoveCursorToPoint( CGMainDisplayID(), targetPoint );
|
||||||
|
}
|
||||||
|
|
11
lib/cocoa/libglfw.pc.cmake
Normal file
11
lib/cocoa/libglfw.pc.cmake
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
prefix=@PREFIX@
|
||||||
|
exec_prefix=@PREFIX@
|
||||||
|
libdir=@PREFIX@/lib
|
||||||
|
includedir=@PREFIX@/include
|
||||||
|
|
||||||
|
Name: GLFW
|
||||||
|
Description: A portable framework for OpenGL development
|
||||||
|
Version: 2.7
|
||||||
|
URL: http://glfw.sourceforge.net/
|
||||||
|
Libs: -L${libdir} -lglfw -framework AGL -framework OpenGL -framework Carbon
|
||||||
|
Cflags: -I${includedir}
|
189
lib/cocoa/platform.h
Normal file
189
lib/cocoa/platform.h
Normal file
|
@ -0,0 +1,189 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Cocoa/NSOpenGL
|
||||||
|
// API Version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#ifndef _platform_h_
|
||||||
|
#define _platform_h_
|
||||||
|
|
||||||
|
|
||||||
|
// This is the Mac OS X version of GLFW
|
||||||
|
#define _GLFW_MAC_OS_X
|
||||||
|
|
||||||
|
#if defined(__OBJC__)
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
#else
|
||||||
|
typedef void *id;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../../include/GL/glfw.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GL_VERSION_3_0
|
||||||
|
|
||||||
|
typedef const GLubyte * (APIENTRY *PFNGLGETSTRINGIPROC) (GLenum, GLuint);
|
||||||
|
|
||||||
|
#endif /*GL_VERSION_3_0*/
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// GLFW platform specific types
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Pointer length integer
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
typedef intptr_t GLFWintptr;
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Window structure
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
typedef struct _GLFWwin_struct _GLFWwin;
|
||||||
|
|
||||||
|
struct _GLFWwin_struct {
|
||||||
|
|
||||||
|
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||||
|
|
||||||
|
// User callback functions
|
||||||
|
GLFWwindowsizefun windowSizeCallback;
|
||||||
|
GLFWwindowclosefun windowCloseCallback;
|
||||||
|
GLFWwindowrefreshfun windowRefreshCallback;
|
||||||
|
GLFWmousebuttonfun mouseButtonCallback;
|
||||||
|
GLFWmouseposfun mousePosCallback;
|
||||||
|
GLFWmousewheelfun mouseWheelCallback;
|
||||||
|
GLFWkeyfun keyCallback;
|
||||||
|
GLFWcharfun charCallback;
|
||||||
|
|
||||||
|
// User selected window settings
|
||||||
|
int fullscreen; // Fullscreen flag
|
||||||
|
int mouseLock; // Mouse-lock flag
|
||||||
|
int autoPollEvents; // Auto polling flag
|
||||||
|
int sysKeysDisabled; // System keys disabled flag
|
||||||
|
int windowNoResize; // Resize- and maximize gadgets disabled flag
|
||||||
|
int refreshRate; // Vertical monitor refresh rate
|
||||||
|
|
||||||
|
// Window status & parameters
|
||||||
|
int opened; // Flag telling if window is opened or not
|
||||||
|
int active; // Application active flag
|
||||||
|
int iconified; // Window iconified flag
|
||||||
|
int width, height; // Window width and heigth
|
||||||
|
int accelerated; // GL_TRUE if window is HW accelerated
|
||||||
|
|
||||||
|
// Framebuffer attributes
|
||||||
|
int redBits;
|
||||||
|
int greenBits;
|
||||||
|
int blueBits;
|
||||||
|
int alphaBits;
|
||||||
|
int depthBits;
|
||||||
|
int stencilBits;
|
||||||
|
int accumRedBits;
|
||||||
|
int accumGreenBits;
|
||||||
|
int accumBlueBits;
|
||||||
|
int accumAlphaBits;
|
||||||
|
int auxBuffers;
|
||||||
|
int stereo;
|
||||||
|
int samples;
|
||||||
|
|
||||||
|
// OpenGL extensions and context attributes
|
||||||
|
int has_GL_SGIS_generate_mipmap;
|
||||||
|
int has_GL_ARB_texture_non_power_of_two;
|
||||||
|
int glMajor, glMinor, glRevision;
|
||||||
|
int glForward, glDebug, glProfile;
|
||||||
|
|
||||||
|
PFNGLGETSTRINGIPROC GetStringi;
|
||||||
|
|
||||||
|
// ========= PLATFORM SPECIFIC PART ======================================
|
||||||
|
|
||||||
|
id window;
|
||||||
|
id pixelFormat;
|
||||||
|
id context;
|
||||||
|
id delegate;
|
||||||
|
unsigned int modifierFlags;
|
||||||
|
};
|
||||||
|
|
||||||
|
GLFWGLOBAL _GLFWwin _glfwWin;
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Library global data
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
GLFWGLOBAL struct {
|
||||||
|
|
||||||
|
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||||
|
|
||||||
|
// Window opening hints
|
||||||
|
_GLFWhints hints;
|
||||||
|
|
||||||
|
// ========= PLATFORM SPECIFIC PART ======================================
|
||||||
|
|
||||||
|
// Timer data
|
||||||
|
struct {
|
||||||
|
double t0;
|
||||||
|
} Timer;
|
||||||
|
|
||||||
|
// dlopen handle for dynamically-loading extension function pointers
|
||||||
|
void *OpenGLFramework;
|
||||||
|
|
||||||
|
int Unbundled;
|
||||||
|
|
||||||
|
id DesktopMode;
|
||||||
|
|
||||||
|
id AutoreleasePool;
|
||||||
|
|
||||||
|
} _glfwLibrary;
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// User input status (some of this should go in _GLFWwin)
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
GLFWGLOBAL struct {
|
||||||
|
|
||||||
|
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||||
|
|
||||||
|
// Mouse status
|
||||||
|
int MousePosX, MousePosY;
|
||||||
|
int WheelPos;
|
||||||
|
char MouseButton[ GLFW_MOUSE_BUTTON_LAST+1 ];
|
||||||
|
|
||||||
|
// Keyboard status
|
||||||
|
char Key[ GLFW_KEY_LAST+1 ];
|
||||||
|
int LastChar;
|
||||||
|
|
||||||
|
// User selected settings
|
||||||
|
int StickyKeys;
|
||||||
|
int StickyMouseButtons;
|
||||||
|
int KeyRepeat;
|
||||||
|
|
||||||
|
|
||||||
|
// ========= PLATFORM SPECIFIC PART ======================================
|
||||||
|
|
||||||
|
double WheelPosFloating;
|
||||||
|
|
||||||
|
} _glfwInput;
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _platform_h_
|
310
lib/enable.c
Normal file
310
lib/enable.c
Normal file
|
@ -0,0 +1,310 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Any
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** GLFW internal functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Enable (show) mouse cursor
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void enableMouseCursor( void )
|
||||||
|
{
|
||||||
|
int centerPosX, centerPosY;
|
||||||
|
|
||||||
|
if( !_glfwWin.opened || !_glfwWin.mouseLock )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show mouse cursor
|
||||||
|
_glfwPlatformShowMouseCursor();
|
||||||
|
|
||||||
|
centerPosX = _glfwWin.width / 2;
|
||||||
|
centerPosY = _glfwWin.height / 2;
|
||||||
|
|
||||||
|
if( centerPosX != _glfwInput.MousePosX || centerPosY != _glfwInput.MousePosY )
|
||||||
|
{
|
||||||
|
_glfwPlatformSetMouseCursorPos( centerPosX, centerPosY );
|
||||||
|
|
||||||
|
_glfwInput.MousePosX = centerPosX;
|
||||||
|
_glfwInput.MousePosY = centerPosY;
|
||||||
|
|
||||||
|
if( _glfwWin.mousePosCallback )
|
||||||
|
{
|
||||||
|
_glfwWin.mousePosCallback( _glfwInput.MousePosX,
|
||||||
|
_glfwInput.MousePosY );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// From now on the mouse is unlocked
|
||||||
|
_glfwWin.mouseLock = GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Disable (hide) mouse cursor
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void disableMouseCursor( void )
|
||||||
|
{
|
||||||
|
if( !_glfwWin.opened || _glfwWin.mouseLock )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hide mouse cursor
|
||||||
|
_glfwPlatformHideMouseCursor();
|
||||||
|
|
||||||
|
// Move cursor to the middle of the window
|
||||||
|
_glfwPlatformSetMouseCursorPos( _glfwWin.width >> 1,
|
||||||
|
_glfwWin.height >> 1 );
|
||||||
|
|
||||||
|
// From now on the mouse is locked
|
||||||
|
_glfwWin.mouseLock = GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Enable sticky keys
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void enableStickyKeys( void )
|
||||||
|
{
|
||||||
|
_glfwInput.StickyKeys = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Disable sticky keys
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void disableStickyKeys( void )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
_glfwInput.StickyKeys = 0;
|
||||||
|
|
||||||
|
// Release all sticky keys
|
||||||
|
for( i = 0; i <= GLFW_KEY_LAST; i++ )
|
||||||
|
{
|
||||||
|
if( _glfwInput.Key[ i ] == 2 )
|
||||||
|
{
|
||||||
|
_glfwInput.Key[ i ] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Enable sticky mouse buttons
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void enableStickyMouseButtons( void )
|
||||||
|
{
|
||||||
|
_glfwInput.StickyMouseButtons = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Disable sticky mouse buttons
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void disableStickyMouseButtons( void )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
_glfwInput.StickyMouseButtons = 0;
|
||||||
|
|
||||||
|
// Release all sticky mouse buttons
|
||||||
|
for( i = 0; i <= GLFW_MOUSE_BUTTON_LAST; i++ )
|
||||||
|
{
|
||||||
|
if( _glfwInput.MouseButton[ i ] == 2 )
|
||||||
|
{
|
||||||
|
_glfwInput.MouseButton[ i ] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Enable system keys
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void enableSystemKeys( void )
|
||||||
|
{
|
||||||
|
if( !_glfwWin.sysKeysDisabled )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_glfwPlatformEnableSystemKeys();
|
||||||
|
|
||||||
|
// Indicate that system keys are no longer disabled
|
||||||
|
_glfwWin.sysKeysDisabled = GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Disable system keys
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void disableSystemKeys( void )
|
||||||
|
{
|
||||||
|
if( _glfwWin.sysKeysDisabled )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_glfwPlatformDisableSystemKeys();
|
||||||
|
|
||||||
|
// Indicate that system keys are now disabled
|
||||||
|
_glfwWin.sysKeysDisabled = GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Enable key repeat
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void enableKeyRepeat( void )
|
||||||
|
{
|
||||||
|
_glfwInput.KeyRepeat = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Disable key repeat
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void disableKeyRepeat( void )
|
||||||
|
{
|
||||||
|
_glfwInput.KeyRepeat = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Enable automatic event polling
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void enableAutoPollEvents( void )
|
||||||
|
{
|
||||||
|
_glfwWin.autoPollEvents = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Disable automatic event polling
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void disableAutoPollEvents( void )
|
||||||
|
{
|
||||||
|
_glfwWin.autoPollEvents = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** GLFW user functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Enable certain GLFW/window/system functions.
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI void glfwEnable( int token )
|
||||||
|
{
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch( token )
|
||||||
|
{
|
||||||
|
case GLFW_MOUSE_CURSOR:
|
||||||
|
enableMouseCursor();
|
||||||
|
break;
|
||||||
|
case GLFW_STICKY_KEYS:
|
||||||
|
enableStickyKeys();
|
||||||
|
break;
|
||||||
|
case GLFW_STICKY_MOUSE_BUTTONS:
|
||||||
|
enableStickyMouseButtons();
|
||||||
|
break;
|
||||||
|
case GLFW_SYSTEM_KEYS:
|
||||||
|
enableSystemKeys();
|
||||||
|
break;
|
||||||
|
case GLFW_KEY_REPEAT:
|
||||||
|
enableKeyRepeat();
|
||||||
|
break;
|
||||||
|
case GLFW_AUTO_POLL_EVENTS:
|
||||||
|
enableAutoPollEvents();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Disable certain GLFW/window/system functions.
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI void glfwDisable( int token )
|
||||||
|
{
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch( token )
|
||||||
|
{
|
||||||
|
case GLFW_MOUSE_CURSOR:
|
||||||
|
disableMouseCursor();
|
||||||
|
break;
|
||||||
|
case GLFW_STICKY_KEYS:
|
||||||
|
disableStickyKeys();
|
||||||
|
break;
|
||||||
|
case GLFW_STICKY_MOUSE_BUTTONS:
|
||||||
|
disableStickyMouseButtons();
|
||||||
|
break;
|
||||||
|
case GLFW_SYSTEM_KEYS:
|
||||||
|
disableSystemKeys();
|
||||||
|
break;
|
||||||
|
case GLFW_KEY_REPEAT:
|
||||||
|
disableKeyRepeat();
|
||||||
|
break;
|
||||||
|
case GLFW_AUTO_POLL_EVENTS:
|
||||||
|
disableAutoPollEvents();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
94
lib/fullscreen.c
Normal file
94
lib/fullscreen.c
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Any
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** GLFW user functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwGetVideoModes() - Get a list of available video modes
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI int glfwGetVideoModes( GLFWvidmode *list, int maxcount )
|
||||||
|
{
|
||||||
|
int count, i, swap, res1, res2, depth1, depth2;
|
||||||
|
GLFWvidmode vm;
|
||||||
|
|
||||||
|
if( !_glfwInitialized || maxcount <= 0 || list == (GLFWvidmode*) 0 )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get list of video modes
|
||||||
|
count = _glfwPlatformGetVideoModes( list, maxcount );
|
||||||
|
|
||||||
|
// Sort list (bubble sort)
|
||||||
|
do
|
||||||
|
{
|
||||||
|
swap = 0;
|
||||||
|
for( i = 0; i < count-1; ++ i )
|
||||||
|
{
|
||||||
|
res1 = list[i].Width*list[i].Height;
|
||||||
|
depth1 = list[i].RedBits+list[i].GreenBits+list[i].BlueBits;
|
||||||
|
res2 = list[i+1].Width*list[i+1].Height;
|
||||||
|
depth2 = list[i+1].RedBits+list[i+1].GreenBits+
|
||||||
|
list[i+1].BlueBits;
|
||||||
|
if( (depth2<depth1) || ((depth2==depth1) && (res2<res1)) )
|
||||||
|
{
|
||||||
|
vm = list[i];
|
||||||
|
list[i] = list[i+1];
|
||||||
|
list[i+1] = vm;
|
||||||
|
swap = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while( swap );
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwGetDesktopMode() - Get the desktop video mode
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI void glfwGetDesktopMode( GLFWvidmode *mode )
|
||||||
|
{
|
||||||
|
if( !_glfwInitialized || mode == (GLFWvidmode*) 0 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_glfwPlatformGetDesktopMode( mode );
|
||||||
|
}
|
||||||
|
|
235
lib/glext.c
Normal file
235
lib/glext.c
Normal file
|
@ -0,0 +1,235 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Any
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** GLFW internal functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
#ifndef GL_VERSION_3_0
|
||||||
|
#define GL_NUM_EXTENSIONS 0x821D
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Parses the OpenGL version string and extracts the version number
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwParseGLVersion( int *major, int *minor, int *rev )
|
||||||
|
{
|
||||||
|
GLuint _major, _minor = 0, _rev = 0;
|
||||||
|
const GLubyte *version;
|
||||||
|
const GLubyte *ptr;
|
||||||
|
|
||||||
|
// Get OpenGL version string
|
||||||
|
version = glGetString( GL_VERSION );
|
||||||
|
if( !version )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse string
|
||||||
|
ptr = version;
|
||||||
|
for( _major = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ )
|
||||||
|
{
|
||||||
|
_major = 10*_major + (*ptr - '0');
|
||||||
|
}
|
||||||
|
if( *ptr == '.' )
|
||||||
|
{
|
||||||
|
ptr ++;
|
||||||
|
for( _minor = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ )
|
||||||
|
{
|
||||||
|
_minor = 10*_minor + (*ptr - '0');
|
||||||
|
}
|
||||||
|
if( *ptr == '.' )
|
||||||
|
{
|
||||||
|
ptr ++;
|
||||||
|
for( _rev = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ )
|
||||||
|
{
|
||||||
|
_rev = 10*_rev + (*ptr - '0');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return parsed values
|
||||||
|
*major = _major;
|
||||||
|
*minor = _minor;
|
||||||
|
*rev = _rev;
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwStringInExtensionString() - Check if a string can be found in an
|
||||||
|
// OpenGL extension string
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwStringInExtensionString( const char *string,
|
||||||
|
const GLubyte *extensions )
|
||||||
|
{
|
||||||
|
const GLubyte *start;
|
||||||
|
GLubyte *where, *terminator;
|
||||||
|
|
||||||
|
// It takes a bit of care to be fool-proof about parsing the
|
||||||
|
// OpenGL extensions string. Don't be fooled by sub-strings,
|
||||||
|
// etc.
|
||||||
|
start = extensions;
|
||||||
|
while( 1 )
|
||||||
|
{
|
||||||
|
where = (GLubyte *) strstr( (const char *) start, string );
|
||||||
|
if( !where )
|
||||||
|
{
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
terminator = where + strlen( string );
|
||||||
|
if( where == start || *(where - 1) == ' ' )
|
||||||
|
{
|
||||||
|
if( *terminator == ' ' || *terminator == '\0' )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
start = terminator;
|
||||||
|
}
|
||||||
|
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** GLFW user functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Check if an OpenGL extension is available at runtime
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI int glfwExtensionSupported( const char *extension )
|
||||||
|
{
|
||||||
|
const GLubyte *extensions;
|
||||||
|
GLubyte *where;
|
||||||
|
GLint count;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized || !_glfwWin.opened )
|
||||||
|
{
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extension names should not have spaces
|
||||||
|
where = (GLubyte *) strchr( extension, ' ' );
|
||||||
|
if( where || *extension == '\0' )
|
||||||
|
{
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( _glfwWin.glMajor < 3 )
|
||||||
|
{
|
||||||
|
// Check if extension is in the old style OpenGL extensions string
|
||||||
|
|
||||||
|
extensions = glGetString( GL_EXTENSIONS );
|
||||||
|
if( extensions != NULL )
|
||||||
|
{
|
||||||
|
if( _glfwStringInExtensionString( extension, extensions ) )
|
||||||
|
{
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Check if extension is in the modern OpenGL extensions string list
|
||||||
|
|
||||||
|
glGetIntegerv( GL_NUM_EXTENSIONS, &count );
|
||||||
|
|
||||||
|
for( i = 0; i < count; i++ )
|
||||||
|
{
|
||||||
|
if( strcmp( (const char*) _glfwWin.GetStringi( GL_EXTENSIONS, i ),
|
||||||
|
extension ) == 0 )
|
||||||
|
{
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Additional platform specific extension checking (e.g. WGL)
|
||||||
|
if( _glfwPlatformExtensionSupported( extension ) )
|
||||||
|
{
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwGetProcAddress() - Get the function pointer to an OpenGL function.
|
||||||
|
// This function can be used to get access to extended OpenGL functions.
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI void * glfwGetProcAddress( const char *procname )
|
||||||
|
{
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized || !_glfwWin.opened )
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _glfwPlatformGetProcAddress( procname );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Returns the OpenGL version
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI void glfwGetGLVersion( int *major, int *minor, int *rev )
|
||||||
|
{
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized || !_glfwWin.opened )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( major != NULL )
|
||||||
|
{
|
||||||
|
*major = _glfwWin.glMajor;
|
||||||
|
}
|
||||||
|
if( minor != NULL )
|
||||||
|
{
|
||||||
|
*minor = _glfwWin.glMinor;
|
||||||
|
}
|
||||||
|
if( rev != NULL )
|
||||||
|
{
|
||||||
|
*rev = _glfwWin.glRevision;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
110
lib/init.c
Normal file
110
lib/init.c
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Any
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#define _init_c_
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** GLFW user functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwInit() - Initialize various GLFW state
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI int glfwInit( void )
|
||||||
|
{
|
||||||
|
// Is GLFW already initialized?
|
||||||
|
if( _glfwInitialized )
|
||||||
|
{
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset( &_glfwLibrary, 0, sizeof( _glfwLibrary ) );
|
||||||
|
memset( &_glfwWin, 0, sizeof( _glfwWin ) );
|
||||||
|
|
||||||
|
// Window is not yet opened
|
||||||
|
_glfwWin.opened = GL_FALSE;
|
||||||
|
|
||||||
|
// Default enable/disable settings
|
||||||
|
_glfwWin.sysKeysDisabled = GL_FALSE;
|
||||||
|
|
||||||
|
// Clear window hints
|
||||||
|
_glfwClearWindowHints();
|
||||||
|
|
||||||
|
// Platform specific initialization
|
||||||
|
if( !_glfwPlatformInit() )
|
||||||
|
{
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Form now on, GLFW state is valid
|
||||||
|
_glfwInitialized = GL_TRUE;
|
||||||
|
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Close window and shut down library
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI void glfwTerminate( void )
|
||||||
|
{
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Platform specific termination
|
||||||
|
if( !_glfwPlatformTerminate() )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// GLFW is no longer initialized
|
||||||
|
_glfwInitialized = GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwGetVersion() - Get GLFW version
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI void glfwGetVersion( int *major, int *minor, int *rev )
|
||||||
|
{
|
||||||
|
if( major != NULL ) *major = GLFW_VERSION_MAJOR;
|
||||||
|
if( minor != NULL ) *minor = GLFW_VERSION_MINOR;
|
||||||
|
if( rev != NULL ) *rev = GLFW_VERSION_REVISION;
|
||||||
|
}
|
||||||
|
|
280
lib/input.c
Normal file
280
lib/input.c
Normal file
|
@ -0,0 +1,280 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Any
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwGetKey()
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI int glfwGetKey( int key )
|
||||||
|
{
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized || !_glfwWin.opened )
|
||||||
|
{
|
||||||
|
return GLFW_RELEASE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is it a valid key?
|
||||||
|
if( key < 0 || key > GLFW_KEY_LAST )
|
||||||
|
{
|
||||||
|
return GLFW_RELEASE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( _glfwInput.Key[ key ] == GLFW_STICK )
|
||||||
|
{
|
||||||
|
// Sticky mode: release key now
|
||||||
|
_glfwInput.Key[ key ] = GLFW_RELEASE;
|
||||||
|
return GLFW_PRESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (int) _glfwInput.Key[ key ];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwGetMouseButton()
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI int glfwGetMouseButton( int button )
|
||||||
|
{
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized || !_glfwWin.opened )
|
||||||
|
{
|
||||||
|
return GLFW_RELEASE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is it a valid mouse button?
|
||||||
|
if( button < 0 || button > GLFW_MOUSE_BUTTON_LAST )
|
||||||
|
{
|
||||||
|
return GLFW_RELEASE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( _glfwInput.MouseButton[ button ] == GLFW_STICK )
|
||||||
|
{
|
||||||
|
// Sticky mode: release mouse button now
|
||||||
|
_glfwInput.MouseButton[ button ] = GLFW_RELEASE;
|
||||||
|
return GLFW_PRESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (int) _glfwInput.MouseButton[ button ];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwGetMousePos()
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI void glfwGetMousePos( int *xpos, int *ypos )
|
||||||
|
{
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized || !_glfwWin.opened )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return mouse position
|
||||||
|
if( xpos != NULL )
|
||||||
|
{
|
||||||
|
*xpos = _glfwInput.MousePosX;
|
||||||
|
}
|
||||||
|
if( ypos != NULL )
|
||||||
|
{
|
||||||
|
*ypos = _glfwInput.MousePosY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwSetMousePos()
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI void glfwSetMousePos( int xpos, int ypos )
|
||||||
|
{
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized || !_glfwWin.opened )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't do anything if the mouse position did not change
|
||||||
|
if( xpos == _glfwInput.MousePosX && ypos == _glfwInput.MousePosY )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set GLFW mouse position
|
||||||
|
_glfwInput.MousePosX = xpos;
|
||||||
|
_glfwInput.MousePosY = ypos;
|
||||||
|
|
||||||
|
// If we have a locked mouse, do not change cursor position
|
||||||
|
if( _glfwWin.mouseLock )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update physical cursor position
|
||||||
|
_glfwPlatformSetMouseCursorPos( xpos, ypos );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwGetMouseWheel()
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI int glfwGetMouseWheel( void )
|
||||||
|
{
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized || !_glfwWin.opened )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return mouse wheel position
|
||||||
|
return _glfwInput.WheelPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwSetMouseWheel()
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI void glfwSetMouseWheel( int pos )
|
||||||
|
{
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized || !_glfwWin.opened )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set mouse wheel position
|
||||||
|
_glfwInput.WheelPos = pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwSetKeyCallback() - Set callback function for keyboard input
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI void glfwSetKeyCallback( GLFWkeyfun cbfun )
|
||||||
|
{
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized || !_glfwWin.opened )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set callback function
|
||||||
|
_glfwWin.keyCallback = cbfun;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwSetCharCallback() - Set callback function for character input
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI void glfwSetCharCallback( GLFWcharfun cbfun )
|
||||||
|
{
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized || !_glfwWin.opened )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set callback function
|
||||||
|
_glfwWin.charCallback = cbfun;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwSetMouseButtonCallback() - Set callback function for mouse clicks
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI void glfwSetMouseButtonCallback( GLFWmousebuttonfun cbfun )
|
||||||
|
{
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized || !_glfwWin.opened )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set callback function
|
||||||
|
_glfwWin.mouseButtonCallback = cbfun;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwSetMousePosCallback() - Set callback function for mouse moves
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI void glfwSetMousePosCallback( GLFWmouseposfun cbfun )
|
||||||
|
{
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized || !_glfwWin.opened )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set callback function
|
||||||
|
_glfwWin.mousePosCallback = cbfun;
|
||||||
|
|
||||||
|
// Call the callback function to let the application know the current
|
||||||
|
// mouse position
|
||||||
|
if( cbfun )
|
||||||
|
{
|
||||||
|
cbfun( _glfwInput.MousePosX, _glfwInput.MousePosY );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwSetMouseWheelCallback() - Set callback function for mouse wheel
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI void glfwSetMouseWheelCallback( GLFWmousewheelfun cbfun )
|
||||||
|
{
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized || !_glfwWin.opened )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set callback function
|
||||||
|
_glfwWin.mouseWheelCallback = cbfun;
|
||||||
|
|
||||||
|
// Call the callback function to let the application know the current
|
||||||
|
// mouse wheel position
|
||||||
|
if( cbfun )
|
||||||
|
{
|
||||||
|
cbfun( _glfwInput.WheelPos );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
221
lib/internal.h
Normal file
221
lib/internal.h
Normal file
|
@ -0,0 +1,221 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Any
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#ifndef _internal_h_
|
||||||
|
#define _internal_h_
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// GLFWGLOBAL is a macro that places all global variables in the init.c
|
||||||
|
// module (all other modules reference global variables as 'extern')
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#if defined( _init_c_ )
|
||||||
|
#define GLFWGLOBAL
|
||||||
|
#else
|
||||||
|
#define GLFWGLOBAL extern
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Input handling definitions
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
// Internal key and button state/action definitions
|
||||||
|
#define GLFW_STICK 2
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// System independent include files
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Window opening hints (set by glfwOpenWindowHint)
|
||||||
|
// A bucket of semi-random stuff bunched together for historical reasons
|
||||||
|
// This is used only by the platform independent code and only to store
|
||||||
|
// parameters passed to us by glfwOpenWindowHint
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
typedef struct {
|
||||||
|
int refreshRate;
|
||||||
|
int accumRedBits;
|
||||||
|
int accumGreenBits;
|
||||||
|
int accumBlueBits;
|
||||||
|
int accumAlphaBits;
|
||||||
|
int auxBuffers;
|
||||||
|
int stereo;
|
||||||
|
int windowNoResize;
|
||||||
|
int samples;
|
||||||
|
int glMajor;
|
||||||
|
int glMinor;
|
||||||
|
int glForward;
|
||||||
|
int glDebug;
|
||||||
|
int glProfile;
|
||||||
|
} _GLFWhints;
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Platform specific definitions goes in platform.h (which also includes
|
||||||
|
// glfw.h)
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include "platform.h"
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Parameters relating to the creation of the context and window but not
|
||||||
|
// directly related to the properties of the framebuffer
|
||||||
|
// This is used to pass window and context creation parameters from the
|
||||||
|
// platform independent code to the platform specific code
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
typedef struct {
|
||||||
|
int mode;
|
||||||
|
int refreshRate;
|
||||||
|
int windowNoResize;
|
||||||
|
int glMajor;
|
||||||
|
int glMinor;
|
||||||
|
int glForward;
|
||||||
|
int glDebug;
|
||||||
|
int glProfile;
|
||||||
|
} _GLFWwndconfig;
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Framebuffer configuration descriptor, i.e. buffers and their sizes
|
||||||
|
// Also a platform specific ID used to map back to the actual backend APIs
|
||||||
|
// This is used to pass framebuffer parameters from the platform independent
|
||||||
|
// code to the platform specific code, and also to enumerate and select
|
||||||
|
// available framebuffer configurations
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
typedef struct {
|
||||||
|
int redBits;
|
||||||
|
int greenBits;
|
||||||
|
int blueBits;
|
||||||
|
int alphaBits;
|
||||||
|
int depthBits;
|
||||||
|
int stencilBits;
|
||||||
|
int accumRedBits;
|
||||||
|
int accumGreenBits;
|
||||||
|
int accumBlueBits;
|
||||||
|
int accumAlphaBits;
|
||||||
|
int auxBuffers;
|
||||||
|
int stereo;
|
||||||
|
int samples;
|
||||||
|
GLFWintptr platformID;
|
||||||
|
} _GLFWfbconfig;
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// System independent global variables (GLFW internals)
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
// Flag indicating if GLFW has been initialized
|
||||||
|
#if defined( _init_c_ )
|
||||||
|
int _glfwInitialized = 0;
|
||||||
|
#else
|
||||||
|
GLFWGLOBAL int _glfwInitialized;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Prototypes for platform specific implementation functions
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
// Init/terminate
|
||||||
|
int _glfwPlatformInit( void );
|
||||||
|
int _glfwPlatformTerminate( void );
|
||||||
|
|
||||||
|
// Enable/Disable
|
||||||
|
void _glfwPlatformEnableSystemKeys( void );
|
||||||
|
void _glfwPlatformDisableSystemKeys( void );
|
||||||
|
|
||||||
|
// Fullscreen
|
||||||
|
int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount );
|
||||||
|
void _glfwPlatformGetDesktopMode( GLFWvidmode *mode );
|
||||||
|
|
||||||
|
// OpenGL extensions
|
||||||
|
int _glfwPlatformExtensionSupported( const char *extension );
|
||||||
|
void * _glfwPlatformGetProcAddress( const char *procname );
|
||||||
|
|
||||||
|
// Joystick
|
||||||
|
int _glfwPlatformGetJoystickParam( int joy, int param );
|
||||||
|
int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes );
|
||||||
|
int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons );
|
||||||
|
|
||||||
|
// Time
|
||||||
|
double _glfwPlatformGetTime( void );
|
||||||
|
void _glfwPlatformSetTime( double time );
|
||||||
|
|
||||||
|
// Window management
|
||||||
|
int _glfwPlatformOpenWindow( int width, int height, const _GLFWwndconfig *wndconfig, const _GLFWfbconfig *fbconfig );
|
||||||
|
void _glfwPlatformCloseWindow( void );
|
||||||
|
void _glfwPlatformSetWindowTitle( const char *title );
|
||||||
|
void _glfwPlatformSetWindowSize( int width, int height );
|
||||||
|
void _glfwPlatformSetWindowPos( int x, int y );
|
||||||
|
void _glfwPlatformIconifyWindow( void );
|
||||||
|
void _glfwPlatformRestoreWindow( void );
|
||||||
|
void _glfwPlatformSwapBuffers( void );
|
||||||
|
void _glfwPlatformSwapInterval( int interval );
|
||||||
|
void _glfwPlatformRefreshWindowParams( void );
|
||||||
|
void _glfwPlatformPollEvents( void );
|
||||||
|
void _glfwPlatformWaitEvents( void );
|
||||||
|
void _glfwPlatformHideMouseCursor( void );
|
||||||
|
void _glfwPlatformShowMouseCursor( void );
|
||||||
|
void _glfwPlatformSetMouseCursorPos( int x, int y );
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Prototypes for platform independent internal functions
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
// Window management (window.c)
|
||||||
|
void _glfwClearWindowHints( void );
|
||||||
|
|
||||||
|
// Input handling (window.c)
|
||||||
|
void _glfwClearInput( void );
|
||||||
|
void _glfwInputDeactivation( void );
|
||||||
|
void _glfwInputKey( int key, int action );
|
||||||
|
void _glfwInputChar( int character, int action );
|
||||||
|
void _glfwInputMouseClick( int button, int action );
|
||||||
|
|
||||||
|
// OpenGL extensions (glext.c)
|
||||||
|
void _glfwParseGLVersion( int *major, int *minor, int *rev );
|
||||||
|
int _glfwStringInExtensionString( const char *string, const GLubyte *extensions );
|
||||||
|
|
||||||
|
// Framebuffer configs
|
||||||
|
const _GLFWfbconfig *_glfwChooseFBConfig( const _GLFWfbconfig *desired,
|
||||||
|
const _GLFWfbconfig *alternatives,
|
||||||
|
unsigned int count );
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _internal_h_
|
102
lib/joystick.c
Normal file
102
lib/joystick.c
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Any
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** GLFW user functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwGetJoystickParam() - Determine joystick capabilities
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI int glfwGetJoystickParam( int joy, int param )
|
||||||
|
{
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _glfwPlatformGetJoystickParam( joy, param );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwGetJoystickPos() - Get joystick axis positions
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI int glfwGetJoystickPos( int joy, float *pos, int numaxes )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear positions
|
||||||
|
for( i = 0; i < numaxes; i++ )
|
||||||
|
{
|
||||||
|
pos[ i ] = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _glfwPlatformGetJoystickPos( joy, pos, numaxes );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwGetJoystickButtons() - Get joystick button states
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI int glfwGetJoystickButtons( int joy,
|
||||||
|
unsigned char *buttons,
|
||||||
|
int numbuttons )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear button states
|
||||||
|
for( i = 0; i < numbuttons; i++ )
|
||||||
|
{
|
||||||
|
buttons[ i ] = GLFW_RELEASE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _glfwPlatformGetJoystickButtons( joy, buttons, numbuttons );
|
||||||
|
}
|
||||||
|
|
68
lib/time.c
Normal file
68
lib/time.c
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Any
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** GLFW user functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwGetTime() - Return timer value in seconds
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI double glfwGetTime( void )
|
||||||
|
{
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized )
|
||||||
|
{
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _glfwPlatformGetTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// glfwSetTime() - Set timer value in seconds
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
GLFWAPI void glfwSetTime( double time )
|
||||||
|
{
|
||||||
|
// Is GLFW initialized?
|
||||||
|
if( !_glfwInitialized )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_glfwPlatformSetTime( time );
|
||||||
|
}
|
||||||
|
|
55
lib/win32/CMakeLists.txt
Normal file
55
lib/win32/CMakeLists.txt
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
|
||||||
|
if(CYGWIN)
|
||||||
|
configure_file(
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/libglfw.pc.cmake
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc @ONLY)
|
||||||
|
|
||||||
|
# These lines are intended to remove the --export-all-symbols
|
||||||
|
# flag added in the Modules/Platform/CYGWIN.cmake file of the
|
||||||
|
# CMake distribution.
|
||||||
|
# This is a HACK. If you have trouble _linking_ the GLFW
|
||||||
|
# _shared_ library on Cygwin, try disabling this.
|
||||||
|
set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-shared")
|
||||||
|
set(CMAKE_SHARED_MODULE_CREATE_C_FLAGS ${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS})
|
||||||
|
|
||||||
|
endif(CYGWIN)
|
||||||
|
|
||||||
|
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/lib)
|
||||||
|
|
||||||
|
set(libglfw_SOURCES
|
||||||
|
${common_SOURCES}
|
||||||
|
win32_enable.c
|
||||||
|
win32_fullscreen.c
|
||||||
|
win32_glext.c
|
||||||
|
win32_init.c
|
||||||
|
win32_joystick.c
|
||||||
|
win32_time.c
|
||||||
|
win32_window.c
|
||||||
|
win32_dllmain.c)
|
||||||
|
|
||||||
|
add_library(libglfwStatic STATIC ${libglfw_SOURCES})
|
||||||
|
add_library(libglfwShared SHARED glfwdll.def ${libglfw_SOURCES})
|
||||||
|
|
||||||
|
target_link_libraries(libglfwShared ${OPENGL_gl_LIBRARY})
|
||||||
|
set_target_properties(libglfwShared PROPERTIES
|
||||||
|
DEFINE_SYMBOL GLFW_BUILD_DLL
|
||||||
|
PREFIX ""
|
||||||
|
IMPORT_PREFIX ""
|
||||||
|
IMPORT_SUFFIX "dll.lib")
|
||||||
|
|
||||||
|
set_target_properties(libglfwStatic libglfwShared PROPERTIES
|
||||||
|
CLEAN_DIRECT_OUTPUT 1
|
||||||
|
OUTPUT_NAME glfw)
|
||||||
|
|
||||||
|
if(CYGWIN)
|
||||||
|
# Build for the regular Win32 environment (not Cygwin)
|
||||||
|
set_target_properties(libglfwStatic libglfwShared PROPERTIES COMPILE_FLAGS "-mwin32 -mno-cygwin")
|
||||||
|
set_target_properties(libglfwStatic libglfwShared PROPERTIES LINK_FLAGS "-mwin32 -mno-cygwin")
|
||||||
|
endif(CYGWIN)
|
||||||
|
|
||||||
|
install(TARGETS libglfwStatic libglfwShared DESTINATION lib)
|
||||||
|
|
||||||
|
if(CYGWIN)
|
||||||
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc DESTINATION lib/pkgconfig)
|
||||||
|
endif(CYGWIN)
|
||||||
|
|
46
lib/win32/glfwdll.def
Normal file
46
lib/win32/glfwdll.def
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
LIBRARY GLFW.DLL
|
||||||
|
|
||||||
|
EXPORTS
|
||||||
|
glfwCloseWindow
|
||||||
|
glfwDisable
|
||||||
|
glfwEnable
|
||||||
|
glfwExtensionSupported
|
||||||
|
glfwGetDesktopMode
|
||||||
|
glfwGetGLVersion
|
||||||
|
glfwGetJoystickButtons
|
||||||
|
glfwGetJoystickParam
|
||||||
|
glfwGetJoystickPos
|
||||||
|
glfwGetKey
|
||||||
|
glfwGetMouseButton
|
||||||
|
glfwGetMousePos
|
||||||
|
glfwGetMouseWheel
|
||||||
|
glfwGetProcAddress
|
||||||
|
glfwGetTime
|
||||||
|
glfwGetVersion
|
||||||
|
glfwGetVideoModes
|
||||||
|
glfwGetWindowParam
|
||||||
|
glfwGetWindowSize
|
||||||
|
glfwIconifyWindow
|
||||||
|
glfwInit
|
||||||
|
glfwOpenWindow
|
||||||
|
glfwOpenWindowHint
|
||||||
|
glfwPollEvents
|
||||||
|
glfwRestoreWindow
|
||||||
|
glfwSetCharCallback
|
||||||
|
glfwSetKeyCallback
|
||||||
|
glfwSetMouseButtonCallback
|
||||||
|
glfwSetMousePos
|
||||||
|
glfwSetMousePosCallback
|
||||||
|
glfwSetMouseWheel
|
||||||
|
glfwSetMouseWheelCallback
|
||||||
|
glfwSetTime
|
||||||
|
glfwSetWindowCloseCallback
|
||||||
|
glfwSetWindowRefreshCallback
|
||||||
|
glfwSetWindowPos
|
||||||
|
glfwSetWindowSize
|
||||||
|
glfwSetWindowSizeCallback
|
||||||
|
glfwSetWindowTitle
|
||||||
|
glfwSwapBuffers
|
||||||
|
glfwSwapInterval
|
||||||
|
glfwTerminate
|
||||||
|
glfwWaitEvents
|
46
lib/win32/glfwdll_mgw1.def
Normal file
46
lib/win32/glfwdll_mgw1.def
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
LIBRARY GLFW.DLL
|
||||||
|
|
||||||
|
EXPORTS
|
||||||
|
glfwCloseWindow = glfwCloseWindow@0
|
||||||
|
glfwDisable = glfwDisable@4
|
||||||
|
glfwEnable = glfwEnable@4
|
||||||
|
glfwExtensionSupported = glfwExtensionSupported@4
|
||||||
|
glfwGetDesktopMode = glfwGetDesktopMode@4
|
||||||
|
glfwGetGLVersion = glfwGetGLVersion@12
|
||||||
|
glfwGetJoystickButtons = glfwGetJoystickButtons@12
|
||||||
|
glfwGetJoystickParam = glfwGetJoystickParam@8
|
||||||
|
glfwGetJoystickPos = glfwGetJoystickPos@12
|
||||||
|
glfwGetKey = glfwGetKey@4
|
||||||
|
glfwGetMouseButton = glfwGetMouseButton@4
|
||||||
|
glfwGetMousePos = glfwGetMousePos@8
|
||||||
|
glfwGetMouseWheel = glfwGetMouseWheel@0
|
||||||
|
glfwGetProcAddress = glfwGetProcAddress@4
|
||||||
|
glfwGetTime = glfwGetTime@0
|
||||||
|
glfwGetVersion = glfwGetVersion@12
|
||||||
|
glfwGetVideoModes = glfwGetVideoModes@8
|
||||||
|
glfwGetWindowParam = glfwGetWindowParam@4
|
||||||
|
glfwGetWindowSize = glfwGetWindowSize@8
|
||||||
|
glfwIconifyWindow = glfwIconifyWindow@0
|
||||||
|
glfwInit = glfwInit@0
|
||||||
|
glfwOpenWindow = glfwOpenWindow@36
|
||||||
|
glfwOpenWindowHint = glfwOpenWindowHint@8
|
||||||
|
glfwPollEvents = glfwPollEvents@0
|
||||||
|
glfwRestoreWindow = glfwRestoreWindow@0
|
||||||
|
glfwSetCharCallback = glfwSetCharCallback@4
|
||||||
|
glfwSetKeyCallback = glfwSetKeyCallback@4
|
||||||
|
glfwSetMouseButtonCallback = glfwSetMouseButtonCallback@4
|
||||||
|
glfwSetMousePos = glfwSetMousePos@8
|
||||||
|
glfwSetMousePosCallback = glfwSetMousePosCallback@4
|
||||||
|
glfwSetMouseWheel = glfwSetMouseWheel@4
|
||||||
|
glfwSetMouseWheelCallback = glfwSetMouseWheelCallback@4
|
||||||
|
glfwSetTime = glfwSetTime@8
|
||||||
|
glfwSetWindowCloseCallback = glfwSetWindowCloseCallback@4
|
||||||
|
glfwSetWindowRefreshCallback = glfwSetWindowRefreshCallback@4
|
||||||
|
glfwSetWindowPos = glfwSetWindowPos@8
|
||||||
|
glfwSetWindowSize = glfwSetWindowSize@8
|
||||||
|
glfwSetWindowSizeCallback = glfwSetWindowSizeCallback@4
|
||||||
|
glfwSetWindowTitle = glfwSetWindowTitle@4
|
||||||
|
glfwSwapBuffers = glfwSwapBuffers@0
|
||||||
|
glfwSwapInterval = glfwSwapInterval@4
|
||||||
|
glfwTerminate = glfwTerminate@0
|
||||||
|
glfwWaitEvents = glfwWaitEvents@0
|
46
lib/win32/glfwdll_mgw2.def
Normal file
46
lib/win32/glfwdll_mgw2.def
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
LIBRARY GLFW.DLL
|
||||||
|
|
||||||
|
EXPORTS
|
||||||
|
glfwCloseWindow@0
|
||||||
|
glfwDisable@4
|
||||||
|
glfwEnable@4
|
||||||
|
glfwExtensionSupported@4
|
||||||
|
glfwGetDesktopMode@4
|
||||||
|
glfwGetGLVersion@12
|
||||||
|
glfwGetJoystickButtons@12
|
||||||
|
glfwGetJoystickParam@8
|
||||||
|
glfwGetJoystickPos@12
|
||||||
|
glfwGetKey@4
|
||||||
|
glfwGetMouseButton@4
|
||||||
|
glfwGetMousePos@8
|
||||||
|
glfwGetMouseWheel@0
|
||||||
|
glfwGetProcAddress@4
|
||||||
|
glfwGetTime@0
|
||||||
|
glfwGetVersion@12
|
||||||
|
glfwGetVideoModes@8
|
||||||
|
glfwGetWindowParam@4
|
||||||
|
glfwGetWindowSize@8
|
||||||
|
glfwIconifyWindow@0
|
||||||
|
glfwInit@0
|
||||||
|
glfwOpenWindow@36
|
||||||
|
glfwOpenWindowHint@8
|
||||||
|
glfwPollEvents@0
|
||||||
|
glfwRestoreWindow@0
|
||||||
|
glfwSetCharCallback@4
|
||||||
|
glfwSetKeyCallback@4
|
||||||
|
glfwSetMouseButtonCallback@4
|
||||||
|
glfwSetMousePos@8
|
||||||
|
glfwSetMousePosCallback@4
|
||||||
|
glfwSetMouseWheel@4
|
||||||
|
glfwSetMouseWheelCallback@4
|
||||||
|
glfwSetTime@8
|
||||||
|
glfwSetWindowCloseCallback@4
|
||||||
|
glfwSetWindowRefreshCallback@4
|
||||||
|
glfwSetWindowPos@8
|
||||||
|
glfwSetWindowSize@8
|
||||||
|
glfwSetWindowSizeCallback@4
|
||||||
|
glfwSetWindowTitle@4
|
||||||
|
glfwSwapBuffers@0
|
||||||
|
glfwSwapInterval@4
|
||||||
|
glfwTerminate@0
|
||||||
|
glfwWaitEvents@0
|
11
lib/win32/libglfw.pc.cmake
Normal file
11
lib/win32/libglfw.pc.cmake
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
prefix=@CMAKE_INSTALL_PREFIX@
|
||||||
|
exec_prefix=${prefix}
|
||||||
|
libdir=${exec_prefix}/lib
|
||||||
|
includedir=${prefix}/include
|
||||||
|
|
||||||
|
Name: GLFW
|
||||||
|
Description: A portable framework for OpenGL development
|
||||||
|
Version: 2.7
|
||||||
|
URL: http://glfw.sourceforge.net/
|
||||||
|
Libs: -L${libdir} -lglfw @GLFW_LIBRARIES@
|
||||||
|
Cflags: -I${includedir} -mwin32
|
480
lib/win32/platform.h
Normal file
480
lib/win32/platform.h
Normal file
|
@ -0,0 +1,480 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Win32/WGL
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#ifndef _platform_h_
|
||||||
|
#define _platform_h_
|
||||||
|
|
||||||
|
|
||||||
|
// This is the Windows version of GLFW
|
||||||
|
#define _GLFW_WIN32
|
||||||
|
|
||||||
|
// We don't need all the fancy stuff
|
||||||
|
#define NOMINMAX
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#define VC_EXTRALEAN
|
||||||
|
|
||||||
|
// Include files
|
||||||
|
#include <windows.h>
|
||||||
|
#include <mmsystem.h>
|
||||||
|
#include "../../include/GL/glfw.h"
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Hack: Define things that some <windows.h>'s do not define
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
// Some old versions of w32api (used by MinGW and Cygwin) define
|
||||||
|
// WH_KEYBOARD_LL without typedef:ing KBDLLHOOKSTRUCT (!)
|
||||||
|
#if defined(__MINGW32__) || defined(__CYGWIN__)
|
||||||
|
#include <w32api.h>
|
||||||
|
#if defined(WH_KEYBOARD_LL) && (__W32API_MAJOR_VERSION == 1) && (__W32API_MINOR_VERSION <= 2)
|
||||||
|
#undef WH_KEYBOARD_LL
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// ** NOTE ** If this gives you compiler errors and you are using MinGW
|
||||||
|
// (or Dev-C++), update to w32api version 1.3 or later:
|
||||||
|
// http://sourceforge.net/project/showfiles.php?group_id=2435
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
#ifndef WH_KEYBOARD_LL
|
||||||
|
#define WH_KEYBOARD_LL 13
|
||||||
|
typedef struct tagKBDLLHOOKSTRUCT {
|
||||||
|
DWORD vkCode;
|
||||||
|
DWORD scanCode;
|
||||||
|
DWORD flags;
|
||||||
|
DWORD time;
|
||||||
|
DWORD dwExtraInfo;
|
||||||
|
} KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
|
||||||
|
#endif // WH_KEYBOARD_LL
|
||||||
|
|
||||||
|
#ifndef LLKHF_ALTDOWN
|
||||||
|
#define LLKHF_ALTDOWN 0x00000020
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SPI_SETSCREENSAVERRUNNING
|
||||||
|
#define SPI_SETSCREENSAVERRUNNING 97
|
||||||
|
#endif
|
||||||
|
#ifndef SPI_GETANIMATION
|
||||||
|
#define SPI_GETANIMATION 72
|
||||||
|
#endif
|
||||||
|
#ifndef SPI_SETANIMATION
|
||||||
|
#define SPI_SETANIMATION 73
|
||||||
|
#endif
|
||||||
|
#ifndef SPI_GETFOREGROUNDLOCKTIMEOUT
|
||||||
|
#define SPI_GETFOREGROUNDLOCKTIMEOUT 0x2000
|
||||||
|
#endif
|
||||||
|
#ifndef SPI_SETFOREGROUNDLOCKTIMEOUT
|
||||||
|
#define SPI_SETFOREGROUNDLOCKTIMEOUT 0x2001
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CDS_FULLSCREEN
|
||||||
|
#define CDS_FULLSCREEN 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef PFD_GENERIC_ACCELERATED
|
||||||
|
#define PFD_GENERIC_ACCELERATED 0x00001000
|
||||||
|
#endif
|
||||||
|
#ifndef PFD_DEPTH_DONTCARE
|
||||||
|
#define PFD_DEPTH_DONTCARE 0x20000000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENUM_CURRENT_SETTINGS
|
||||||
|
#define ENUM_CURRENT_SETTINGS -1
|
||||||
|
#endif
|
||||||
|
#ifndef ENUM_REGISTRY_SETTINGS
|
||||||
|
#define ENUM_REGISTRY_SETTINGS -2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WM_MOUSEWHEEL
|
||||||
|
#define WM_MOUSEWHEEL 0x020A
|
||||||
|
#endif
|
||||||
|
#ifndef WHEEL_DELTA
|
||||||
|
#define WHEEL_DELTA 120
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WM_XBUTTONDOWN
|
||||||
|
#define WM_XBUTTONDOWN 0x020B
|
||||||
|
#endif
|
||||||
|
#ifndef WM_XBUTTONUP
|
||||||
|
#define WM_XBUTTONUP 0x020C
|
||||||
|
#endif
|
||||||
|
#ifndef XBUTTON1
|
||||||
|
#define XBUTTON1 1
|
||||||
|
#endif
|
||||||
|
#ifndef XBUTTON2
|
||||||
|
#define XBUTTON2 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WGL_ARB_pixel_format
|
||||||
|
|
||||||
|
// wglSwapIntervalEXT typedef (Win32 buffer-swap interval control)
|
||||||
|
typedef int (APIENTRY * WGLSWAPINTERVALEXT_T) (int);
|
||||||
|
// wglGetPixelFormatAttribivARB typedef
|
||||||
|
typedef BOOL (WINAPI * WGLGETPIXELFORMATATTRIBIVARB_T) (HDC, int, int, UINT, const int *, int *);
|
||||||
|
// wglGetExtensionStringEXT typedef
|
||||||
|
typedef const char *(APIENTRY * WGLGETEXTENSIONSSTRINGEXT_T)( void );
|
||||||
|
// wglGetExtensionStringARB typedef
|
||||||
|
typedef const char *(APIENTRY * WGLGETEXTENSIONSSTRINGARB_T)( HDC );
|
||||||
|
|
||||||
|
/* Constants for wglGetPixelFormatAttribivARB */
|
||||||
|
#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
|
||||||
|
#define WGL_DRAW_TO_WINDOW_ARB 0x2001
|
||||||
|
#define WGL_SUPPORT_OPENGL_ARB 0x2010
|
||||||
|
#define WGL_ACCELERATION_ARB 0x2003
|
||||||
|
#define WGL_DOUBLE_BUFFER_ARB 0x2011
|
||||||
|
#define WGL_STEREO_ARB 0x2012
|
||||||
|
#define WGL_PIXEL_TYPE_ARB 0x2013
|
||||||
|
#define WGL_COLOR_BITS_ARB 0x2014
|
||||||
|
#define WGL_RED_BITS_ARB 0x2015
|
||||||
|
#define WGL_GREEN_BITS_ARB 0x2017
|
||||||
|
#define WGL_BLUE_BITS_ARB 0x2019
|
||||||
|
#define WGL_ALPHA_BITS_ARB 0x201B
|
||||||
|
#define WGL_ACCUM_BITS_ARB 0x201D
|
||||||
|
#define WGL_ACCUM_RED_BITS_ARB 0x201E
|
||||||
|
#define WGL_ACCUM_GREEN_BITS_ARB 0x201F
|
||||||
|
#define WGL_ACCUM_BLUE_BITS_ARB 0x2020
|
||||||
|
#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021
|
||||||
|
#define WGL_DEPTH_BITS_ARB 0x2022
|
||||||
|
#define WGL_STENCIL_BITS_ARB 0x2023
|
||||||
|
#define WGL_AUX_BUFFERS_ARB 0x2024
|
||||||
|
#define WGL_SAMPLE_BUFFERS_ARB 0x2041
|
||||||
|
#define WGL_SAMPLES_ARB 0x2042
|
||||||
|
|
||||||
|
/* Constants for WGL_ACCELERATION_ARB */
|
||||||
|
#define WGL_NO_ACCELERATION_ARB 0x2025
|
||||||
|
#define WGL_GENERIC_ACCELERATION_ARB 0x2026
|
||||||
|
#define WGL_FULL_ACCELERATION_ARB 0x2027
|
||||||
|
|
||||||
|
/* Constants for WGL_PIXEL_TYPE_ARB */
|
||||||
|
#define WGL_TYPE_RGBA_ARB 0x202B
|
||||||
|
#define WGL_TYPE_COLORINDEX_ARB 0x202C
|
||||||
|
|
||||||
|
#endif /*WGL_ARB_pixel_format*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef WGL_ARB_create_context
|
||||||
|
|
||||||
|
/* wglCreateContextAttribsARB */
|
||||||
|
typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC, HGLRC, const int *);
|
||||||
|
|
||||||
|
/* Tokens for wglCreateContextAttribsARB attributes */
|
||||||
|
#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091
|
||||||
|
#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092
|
||||||
|
#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093
|
||||||
|
#define WGL_CONTEXT_FLAGS_ARB 0x2094
|
||||||
|
#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126
|
||||||
|
|
||||||
|
/* Bits for WGL_CONTEXT_FLAGS_ARB */
|
||||||
|
#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001
|
||||||
|
#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002
|
||||||
|
|
||||||
|
/* Bits for WGL_CONTEXT_PROFILE_MASK_ARB */
|
||||||
|
#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
|
||||||
|
#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
|
||||||
|
|
||||||
|
#endif /*WGL_ARB_create_context*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GL_VERSION_3_0
|
||||||
|
|
||||||
|
typedef const GLubyte * (APIENTRY *PFNGLGETSTRINGIPROC) (GLenum, GLuint);
|
||||||
|
|
||||||
|
#endif /*GL_VERSION_3_0*/
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// DLLs that are loaded at glfwInit()
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
// gdi32.dll function pointer typedefs
|
||||||
|
#ifndef _GLFW_NO_DLOAD_GDI32
|
||||||
|
typedef int (WINAPI * CHOOSEPIXELFORMAT_T) (HDC,CONST PIXELFORMATDESCRIPTOR*);
|
||||||
|
typedef int (WINAPI * DESCRIBEPIXELFORMAT_T) (HDC,int,UINT,LPPIXELFORMATDESCRIPTOR);
|
||||||
|
typedef int (WINAPI * GETPIXELFORMAT_T) (HDC);
|
||||||
|
typedef BOOL (WINAPI * SETPIXELFORMAT_T) (HDC,int,const PIXELFORMATDESCRIPTOR*);
|
||||||
|
typedef BOOL (WINAPI * SWAPBUFFERS_T) (HDC);
|
||||||
|
#endif // _GLFW_NO_DLOAD_GDI32
|
||||||
|
|
||||||
|
// winmm.dll function pointer typedefs
|
||||||
|
#ifndef _GLFW_NO_DLOAD_WINMM
|
||||||
|
typedef MMRESULT (WINAPI * JOYGETDEVCAPSA_T) (UINT,LPJOYCAPSA,UINT);
|
||||||
|
typedef MMRESULT (WINAPI * JOYGETPOS_T) (UINT,LPJOYINFO);
|
||||||
|
typedef MMRESULT (WINAPI * JOYGETPOSEX_T) (UINT,LPJOYINFOEX);
|
||||||
|
typedef DWORD (WINAPI * TIMEGETTIME_T) (void);
|
||||||
|
#endif // _GLFW_NO_DLOAD_WINMM
|
||||||
|
|
||||||
|
|
||||||
|
// gdi32.dll shortcuts
|
||||||
|
#ifndef _GLFW_NO_DLOAD_GDI32
|
||||||
|
#define _glfw_ChoosePixelFormat _glfwLibrary.Libs.ChoosePixelFormat
|
||||||
|
#define _glfw_DescribePixelFormat _glfwLibrary.Libs.DescribePixelFormat
|
||||||
|
#define _glfw_GetPixelFormat _glfwLibrary.Libs.GetPixelFormat
|
||||||
|
#define _glfw_SetPixelFormat _glfwLibrary.Libs.SetPixelFormat
|
||||||
|
#define _glfw_SwapBuffers _glfwLibrary.Libs.SwapBuffers
|
||||||
|
#else
|
||||||
|
#define _glfw_ChoosePixelFormat ChoosePixelFormat
|
||||||
|
#define _glfw_DescribePixelFormat DescribePixelFormat
|
||||||
|
#define _glfw_GetPixelFormat GetPixelFormat
|
||||||
|
#define _glfw_SetPixelFormat SetPixelFormat
|
||||||
|
#define _glfw_SwapBuffers SwapBuffers
|
||||||
|
#endif // _GLFW_NO_DLOAD_GDI32
|
||||||
|
|
||||||
|
// winmm.dll shortcuts
|
||||||
|
#ifndef _GLFW_NO_DLOAD_WINMM
|
||||||
|
#define _glfw_joyGetDevCaps _glfwLibrary.Libs.joyGetDevCapsA
|
||||||
|
#define _glfw_joyGetPos _glfwLibrary.Libs.joyGetPos
|
||||||
|
#define _glfw_joyGetPosEx _glfwLibrary.Libs.joyGetPosEx
|
||||||
|
#define _glfw_timeGetTime _glfwLibrary.Libs.timeGetTime
|
||||||
|
#else
|
||||||
|
#define _glfw_joyGetDevCaps joyGetDevCapsA
|
||||||
|
#define _glfw_joyGetPos joyGetPos
|
||||||
|
#define _glfw_joyGetPosEx joyGetPosEx
|
||||||
|
#define _glfw_timeGetTime timeGetTime
|
||||||
|
#endif // _GLFW_NO_DLOAD_WINMM
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// GLFW platform specific types
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Pointer length integer
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
typedef INT_PTR GLFWintptr;
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Window structure
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
typedef struct _GLFWwin_struct _GLFWwin;
|
||||||
|
|
||||||
|
struct _GLFWwin_struct {
|
||||||
|
|
||||||
|
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||||
|
|
||||||
|
// User callback functions
|
||||||
|
GLFWwindowsizefun windowSizeCallback;
|
||||||
|
GLFWwindowclosefun windowCloseCallback;
|
||||||
|
GLFWwindowrefreshfun windowRefreshCallback;
|
||||||
|
GLFWmousebuttonfun mouseButtonCallback;
|
||||||
|
GLFWmouseposfun mousePosCallback;
|
||||||
|
GLFWmousewheelfun mouseWheelCallback;
|
||||||
|
GLFWkeyfun keyCallback;
|
||||||
|
GLFWcharfun charCallback;
|
||||||
|
|
||||||
|
// User selected window settings
|
||||||
|
int fullscreen; // Fullscreen flag
|
||||||
|
int mouseLock; // Mouse-lock flag
|
||||||
|
int autoPollEvents; // Auto polling flag
|
||||||
|
int sysKeysDisabled; // System keys disabled flag
|
||||||
|
int windowNoResize; // Resize- and maximize gadgets disabled flag
|
||||||
|
int refreshRate; // Vertical monitor refresh rate
|
||||||
|
|
||||||
|
// Window status & parameters
|
||||||
|
int opened; // Flag telling if window is opened or not
|
||||||
|
int active; // Application active flag
|
||||||
|
int iconified; // Window iconified flag
|
||||||
|
int width, height; // Window width and heigth
|
||||||
|
int accelerated; // GL_TRUE if window is HW accelerated
|
||||||
|
|
||||||
|
// Framebuffer attributes
|
||||||
|
int redBits;
|
||||||
|
int greenBits;
|
||||||
|
int blueBits;
|
||||||
|
int alphaBits;
|
||||||
|
int depthBits;
|
||||||
|
int stencilBits;
|
||||||
|
int accumRedBits;
|
||||||
|
int accumGreenBits;
|
||||||
|
int accumBlueBits;
|
||||||
|
int accumAlphaBits;
|
||||||
|
int auxBuffers;
|
||||||
|
int stereo;
|
||||||
|
int samples;
|
||||||
|
|
||||||
|
// OpenGL extensions and context attributes
|
||||||
|
int has_GL_SGIS_generate_mipmap;
|
||||||
|
int has_GL_ARB_texture_non_power_of_two;
|
||||||
|
int glMajor, glMinor, glRevision;
|
||||||
|
int glForward, glDebug, glProfile;
|
||||||
|
|
||||||
|
PFNGLGETSTRINGIPROC GetStringi;
|
||||||
|
|
||||||
|
|
||||||
|
// ========= PLATFORM SPECIFIC PART ======================================
|
||||||
|
|
||||||
|
// Platform specific window resources
|
||||||
|
HDC DC; // Private GDI device context
|
||||||
|
HGLRC context; // Permanent rendering context
|
||||||
|
HWND window; // Window handle
|
||||||
|
ATOM classAtom; // Window class atom
|
||||||
|
int modeID; // Mode ID for fullscreen mode
|
||||||
|
HHOOK keyboardHook; // Keyboard hook handle
|
||||||
|
DWORD dwStyle; // Window styles used for window creation
|
||||||
|
DWORD dwExStyle; // --"--
|
||||||
|
|
||||||
|
// Platform specific extensions (context specific)
|
||||||
|
WGLSWAPINTERVALEXT_T SwapIntervalEXT;
|
||||||
|
WGLGETPIXELFORMATATTRIBIVARB_T GetPixelFormatAttribivARB;
|
||||||
|
WGLGETEXTENSIONSSTRINGEXT_T GetExtensionsStringEXT;
|
||||||
|
WGLGETEXTENSIONSSTRINGARB_T GetExtensionsStringARB;
|
||||||
|
PFNWGLCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB;
|
||||||
|
GLboolean has_WGL_EXT_swap_control;
|
||||||
|
GLboolean has_WGL_ARB_multisample;
|
||||||
|
GLboolean has_WGL_ARB_pixel_format;
|
||||||
|
GLboolean has_WGL_ARB_create_context;
|
||||||
|
|
||||||
|
// Various platform specific internal variables
|
||||||
|
int oldMouseLock; // Old mouse-lock flag (used for remembering
|
||||||
|
// mouse-lock state when iconifying)
|
||||||
|
int oldMouseLockValid;
|
||||||
|
int desiredRefreshRate; // Desired vertical monitor refresh rate
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
GLFWGLOBAL _GLFWwin _glfwWin;
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// User input status (most of this should go in _GLFWwin)
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
GLFWGLOBAL struct {
|
||||||
|
|
||||||
|
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||||
|
|
||||||
|
// Mouse status
|
||||||
|
int MousePosX, MousePosY;
|
||||||
|
int WheelPos;
|
||||||
|
char MouseButton[ GLFW_MOUSE_BUTTON_LAST+1 ];
|
||||||
|
|
||||||
|
// Keyboard status
|
||||||
|
char Key[ GLFW_KEY_LAST+1 ];
|
||||||
|
int LastChar;
|
||||||
|
|
||||||
|
// User selected settings
|
||||||
|
int StickyKeys;
|
||||||
|
int StickyMouseButtons;
|
||||||
|
int KeyRepeat;
|
||||||
|
|
||||||
|
|
||||||
|
// ========= PLATFORM SPECIFIC PART ======================================
|
||||||
|
|
||||||
|
// Platform specific internal variables
|
||||||
|
int MouseMoved, OldMouseX, OldMouseY;
|
||||||
|
|
||||||
|
} _glfwInput;
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Library global data
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
GLFWGLOBAL struct {
|
||||||
|
|
||||||
|
// Window opening hints
|
||||||
|
_GLFWhints hints;
|
||||||
|
|
||||||
|
// ========= PLATFORM SPECIFIC PART ======================================
|
||||||
|
|
||||||
|
HINSTANCE instance; // Instance of the application
|
||||||
|
|
||||||
|
// Timer data
|
||||||
|
struct {
|
||||||
|
int HasPerformanceCounter;
|
||||||
|
double Resolution;
|
||||||
|
unsigned int t0_32;
|
||||||
|
__int64 t0_64;
|
||||||
|
} Timer;
|
||||||
|
|
||||||
|
// System information
|
||||||
|
struct {
|
||||||
|
int winVer;
|
||||||
|
int hasUnicode;
|
||||||
|
DWORD foregroundLockTimeout;
|
||||||
|
} Sys;
|
||||||
|
|
||||||
|
#if !defined(_GLFW_NO_DLOAD_WINMM) || !defined(_GLFW_NO_DLOAD_GDI32)
|
||||||
|
// Library handles and function pointers
|
||||||
|
struct {
|
||||||
|
#ifndef _GLFW_NO_DLOAD_GDI32
|
||||||
|
// gdi32.dll
|
||||||
|
HINSTANCE gdi32;
|
||||||
|
CHOOSEPIXELFORMAT_T ChoosePixelFormat;
|
||||||
|
DESCRIBEPIXELFORMAT_T DescribePixelFormat;
|
||||||
|
GETPIXELFORMAT_T GetPixelFormat;
|
||||||
|
SETPIXELFORMAT_T SetPixelFormat;
|
||||||
|
SWAPBUFFERS_T SwapBuffers;
|
||||||
|
#endif // _GLFW_NO_DLOAD_GDI32
|
||||||
|
|
||||||
|
// winmm.dll
|
||||||
|
#ifndef _GLFW_NO_DLOAD_WINMM
|
||||||
|
HINSTANCE winmm;
|
||||||
|
JOYGETDEVCAPSA_T joyGetDevCapsA;
|
||||||
|
JOYGETPOS_T joyGetPos;
|
||||||
|
JOYGETPOSEX_T joyGetPosEx;
|
||||||
|
TIMEGETTIME_T timeGetTime;
|
||||||
|
#endif // _GLFW_NO_DLOAD_WINMM
|
||||||
|
} Libs;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} _glfwLibrary;
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Various Windows version constants
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#define _GLFW_WIN_UNKNOWN 0x0000 // Earlier than 95 or NT4
|
||||||
|
#define _GLFW_WIN_95 0x0001
|
||||||
|
#define _GLFW_WIN_98 0x0002
|
||||||
|
#define _GLFW_WIN_ME 0x0003
|
||||||
|
#define _GLFW_WIN_UNKNOWN_9x 0x0004 // Later than ME
|
||||||
|
#define _GLFW_WIN_NT4 0x0101
|
||||||
|
#define _GLFW_WIN_2K 0x0102
|
||||||
|
#define _GLFW_WIN_XP 0x0103
|
||||||
|
#define _GLFW_WIN_NET_SERVER 0x0104
|
||||||
|
#define _GLFW_WIN_UNKNOWN_NT 0x0105 // Later than .NET Server
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Prototypes for platform specific internal functions
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
// Time
|
||||||
|
void _glfwInitTimer( void );
|
||||||
|
|
||||||
|
// Fullscreen support
|
||||||
|
int _glfwGetClosestVideoModeBPP( int *w, int *h, int *bpp, int *refresh );
|
||||||
|
int _glfwGetClosestVideoMode( int *w, int *h, int *r, int *g, int *b, int *refresh );
|
||||||
|
void _glfwSetVideoModeMODE( int mode );
|
||||||
|
void _glfwSetVideoMode( int *w, int *h, int r, int g, int b, int refresh );
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _platform_h_
|
49
lib/win32/win32_dllmain.c
Normal file
49
lib/win32/win32_dllmain.c
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Win32/WGL
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(GLFW_BUILD_DLL)
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// GLFW DLL entry point
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
BOOL WINAPI DllMain( HINSTANCE instance, DWORD reason, LPVOID reserved )
|
||||||
|
{
|
||||||
|
// NOTE: Some compilers complains about instance and x never being used -
|
||||||
|
// never mind that (we don't want to use them)!
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // GLFW_BUILD_DLL
|
||||||
|
|
155
lib/win32/win32_enable.c
Normal file
155
lib/win32/win32_enable.c
Normal file
|
@ -0,0 +1,155 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Win32/WGL
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** GLFW internal functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Low level keyboard hook (system callback) function
|
||||||
|
// Used to disable system keys under Windows NT
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static LRESULT CALLBACK keyboardHook( int nCode, WPARAM wParam, LPARAM lParam )
|
||||||
|
{
|
||||||
|
BOOL syskeys = FALSE;
|
||||||
|
PKBDLLHOOKSTRUCT p;
|
||||||
|
|
||||||
|
// We are only looking for keyboard events - interpret lParam as a
|
||||||
|
// pointer to a KBDLLHOOKSTRUCT
|
||||||
|
p = (PKBDLLHOOKSTRUCT) lParam;
|
||||||
|
|
||||||
|
if( nCode == HC_ACTION )
|
||||||
|
{
|
||||||
|
// We have a keyboard event
|
||||||
|
|
||||||
|
switch( wParam )
|
||||||
|
{
|
||||||
|
case WM_KEYDOWN:
|
||||||
|
case WM_SYSKEYDOWN:
|
||||||
|
case WM_KEYUP:
|
||||||
|
case WM_SYSKEYUP:
|
||||||
|
// Detect: ALT+TAB, ALT+ESC, ALT+F4, CTRL+ESC,
|
||||||
|
// LWIN, RWIN, APPS (mysterious menu key)
|
||||||
|
syskeys = ( p->vkCode == VK_TAB &&
|
||||||
|
p->flags & LLKHF_ALTDOWN ) ||
|
||||||
|
( p->vkCode == VK_ESCAPE &&
|
||||||
|
p->flags & LLKHF_ALTDOWN ) ||
|
||||||
|
( p->vkCode == VK_F4 &&
|
||||||
|
p->flags & LLKHF_ALTDOWN ) ||
|
||||||
|
( p->vkCode == VK_ESCAPE &&
|
||||||
|
(GetKeyState(VK_CONTROL) & 0x8000)) ||
|
||||||
|
p->vkCode == VK_LWIN ||
|
||||||
|
p->vkCode == VK_RWIN ||
|
||||||
|
p->vkCode == VK_APPS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Was it a system key combination (e.g. ALT+TAB)?
|
||||||
|
if( syskeys )
|
||||||
|
{
|
||||||
|
// Pass the key event to our window message loop
|
||||||
|
if( _glfwWin.opened )
|
||||||
|
{
|
||||||
|
PostMessage( _glfwWin.window, (UINT) wParam, p->vkCode, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// We've taken care of it - don't let the system know about this
|
||||||
|
// key event
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// It's a harmless key press, let the system deal with it
|
||||||
|
return CallNextHookEx( _glfwWin.keyboardHook, nCode, wParam, lParam );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** Platform implementation functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Enable system keys
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformEnableSystemKeys( void )
|
||||||
|
{
|
||||||
|
BOOL dummy;
|
||||||
|
|
||||||
|
// Use different methods depending on operating system version
|
||||||
|
if( _glfwLibrary.Sys.winVer >= _GLFW_WIN_NT4 )
|
||||||
|
{
|
||||||
|
if( _glfwWin.keyboardHook != NULL )
|
||||||
|
{
|
||||||
|
UnhookWindowsHookEx( _glfwWin.keyboardHook );
|
||||||
|
_glfwWin.keyboardHook = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(void) SystemParametersInfo( SPI_SETSCREENSAVERRUNNING, FALSE, &dummy, 0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Disable system keys
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformDisableSystemKeys( void )
|
||||||
|
{
|
||||||
|
BOOL dummy;
|
||||||
|
|
||||||
|
// Use different methods depending on operating system version
|
||||||
|
if( _glfwLibrary.Sys.winVer >= _GLFW_WIN_NT4 )
|
||||||
|
{
|
||||||
|
// Under Windows NT, install a low level keyboard hook
|
||||||
|
_glfwWin.keyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL,
|
||||||
|
keyboardHook,
|
||||||
|
_glfwLibrary.instance,
|
||||||
|
0 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Under Windows 95/98/ME, fool Windows that a screensaver
|
||||||
|
// is running => prevents ALT+TAB, CTRL+ESC and CTRL+ALT+DEL
|
||||||
|
(void) SystemParametersInfo( SPI_SETSCREENSAVERRUNNING, TRUE, &dummy, 0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
320
lib/win32/win32_fullscreen.c
Normal file
320
lib/win32/win32_fullscreen.c
Normal file
|
@ -0,0 +1,320 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Win32/WGL
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** GLFW internal functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Convert BPP to RGB bits based on "best guess"
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void bpp2rgb( int bpp, int *r, int *g, int *b )
|
||||||
|
{
|
||||||
|
int delta;
|
||||||
|
|
||||||
|
// We assume that by 32 they really meant 24
|
||||||
|
if( bpp == 32 )
|
||||||
|
{
|
||||||
|
bpp = 24;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert "bits per pixel" to red, green & blue sizes
|
||||||
|
|
||||||
|
*r = *g = *b = bpp / 3;
|
||||||
|
delta = bpp - (*r * 3);
|
||||||
|
if( delta >= 1 )
|
||||||
|
{
|
||||||
|
*g = *g + 1;
|
||||||
|
}
|
||||||
|
if( delta == 2 )
|
||||||
|
{
|
||||||
|
*r = *r + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Return closest video mode by dimensions, refresh rate and bits per pixel
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwGetClosestVideoModeBPP( int *w, int *h, int *bpp, int *refresh )
|
||||||
|
{
|
||||||
|
int mode, bestmode, match, bestmatch, rr, bestrr, success;
|
||||||
|
DEVMODE dm;
|
||||||
|
|
||||||
|
// Find best match
|
||||||
|
bestmatch = 0x7fffffff;
|
||||||
|
bestrr = 0x7fffffff;
|
||||||
|
mode = bestmode = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
dm.dmSize = sizeof( DEVMODE );
|
||||||
|
success = EnumDisplaySettings( NULL, mode, &dm );
|
||||||
|
if( success )
|
||||||
|
{
|
||||||
|
match = dm.dmBitsPerPel - *bpp;
|
||||||
|
if( match < 0 ) match = -match;
|
||||||
|
match = ( match << 25 ) |
|
||||||
|
( (dm.dmPelsWidth - *w) *
|
||||||
|
(dm.dmPelsWidth - *w) +
|
||||||
|
(dm.dmPelsHeight - *h) *
|
||||||
|
(dm.dmPelsHeight - *h) );
|
||||||
|
if( match < bestmatch )
|
||||||
|
{
|
||||||
|
bestmatch = match;
|
||||||
|
bestmode = mode;
|
||||||
|
bestrr = (dm.dmDisplayFrequency - *refresh) *
|
||||||
|
(dm.dmDisplayFrequency - *refresh);
|
||||||
|
}
|
||||||
|
else if( match == bestmatch && *refresh > 0 )
|
||||||
|
{
|
||||||
|
rr = (dm.dmDisplayFrequency - *refresh) *
|
||||||
|
(dm.dmDisplayFrequency - *refresh);
|
||||||
|
if( rr < bestrr )
|
||||||
|
{
|
||||||
|
bestmatch = match;
|
||||||
|
bestmode = mode;
|
||||||
|
bestrr = rr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mode ++;
|
||||||
|
}
|
||||||
|
while( success );
|
||||||
|
|
||||||
|
// Get the parameters for the best matching display mode
|
||||||
|
dm.dmSize = sizeof( DEVMODE );
|
||||||
|
(void) EnumDisplaySettings( NULL, bestmode, &dm );
|
||||||
|
|
||||||
|
// Fill out actual width and height
|
||||||
|
*w = dm.dmPelsWidth;
|
||||||
|
*h = dm.dmPelsHeight;
|
||||||
|
|
||||||
|
// Return bits per pixel
|
||||||
|
*bpp = dm.dmBitsPerPel;
|
||||||
|
|
||||||
|
// Return vertical refresh rate
|
||||||
|
*refresh = dm.dmDisplayFrequency;
|
||||||
|
|
||||||
|
return bestmode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Return closest video mode by dimensions, refresh rate and channel sizes
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static int getClosestVideoMode( int *w, int *h,
|
||||||
|
int *r, int *g, int *b,
|
||||||
|
int *refresh )
|
||||||
|
{
|
||||||
|
int bpp, bestmode;
|
||||||
|
|
||||||
|
// Colorbits = sum of red/green/blue bits
|
||||||
|
bpp = *r + *g + *b;
|
||||||
|
|
||||||
|
// If colorbits < 15 (e.g. 0) or >= 24, default to 32 bpp
|
||||||
|
if( bpp < 15 || bpp >= 24 )
|
||||||
|
{
|
||||||
|
bpp = 32;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find best match
|
||||||
|
bestmode = _glfwGetClosestVideoModeBPP( w, h, &bpp, refresh );
|
||||||
|
|
||||||
|
// Convert "bits per pixel" to red, green & blue sizes
|
||||||
|
bpp2rgb( bpp, r, g, b );
|
||||||
|
|
||||||
|
return bestmode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Change the current video mode
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwSetVideoModeMODE( int mode )
|
||||||
|
{
|
||||||
|
DEVMODE dm;
|
||||||
|
int success;
|
||||||
|
|
||||||
|
// Get the parameters for the best matching display mode
|
||||||
|
dm.dmSize = sizeof( DEVMODE );
|
||||||
|
(void) EnumDisplaySettings( NULL, mode, &dm );
|
||||||
|
|
||||||
|
// Set which fields we want to specify
|
||||||
|
dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL;
|
||||||
|
|
||||||
|
// Do we have a prefered refresh rate?
|
||||||
|
if( _glfwWin.desiredRefreshRate > 0 )
|
||||||
|
{
|
||||||
|
dm.dmFields = dm.dmFields | DM_DISPLAYFREQUENCY;
|
||||||
|
dm.dmDisplayFrequency = _glfwWin.desiredRefreshRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Change display setting
|
||||||
|
dm.dmSize = sizeof( DEVMODE );
|
||||||
|
success = ChangeDisplaySettings( &dm, CDS_FULLSCREEN );
|
||||||
|
|
||||||
|
// If the mode change was not possible, query the current display
|
||||||
|
// settings (we'll use the desktop resolution for fullscreen mode)
|
||||||
|
if( success == DISP_CHANGE_SUCCESSFUL )
|
||||||
|
{
|
||||||
|
_glfwWin.modeID = mode;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_glfwWin.modeID = ENUM_REGISTRY_SETTINGS;
|
||||||
|
EnumDisplaySettings( NULL, ENUM_REGISTRY_SETTINGS, &dm );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the window size to that of the display mode
|
||||||
|
_glfwWin.width = dm.dmPelsWidth;
|
||||||
|
_glfwWin.height = dm.dmPelsHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwSetVideoMode() - Change the current video mode
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwSetVideoMode( int *w, int *h, int r, int g, int b, int refresh )
|
||||||
|
{
|
||||||
|
int bestmode;
|
||||||
|
|
||||||
|
// Find a best match mode
|
||||||
|
bestmode = getClosestVideoMode( w, h, &r, &g, &b, &refresh );
|
||||||
|
|
||||||
|
// Change mode
|
||||||
|
_glfwSetVideoModeMODE( bestmode );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** GLFW user functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwPlatformGetVideoModes() - Get a list of available video modes
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount )
|
||||||
|
{
|
||||||
|
int count, success, mode, i, j;
|
||||||
|
int m1, m2, bpp, r, g, b;
|
||||||
|
DEVMODE dm;
|
||||||
|
|
||||||
|
// Loop through all video modes and extract all the UNIQUE modes
|
||||||
|
count = 0;
|
||||||
|
mode = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
// Get video mode properties
|
||||||
|
dm.dmSize = sizeof( DEVMODE );
|
||||||
|
success = EnumDisplaySettings( NULL, mode, &dm );
|
||||||
|
|
||||||
|
// Is it a valid mode? (only list depths >= 15 bpp)
|
||||||
|
if( success && dm.dmBitsPerPel >= 15 )
|
||||||
|
{
|
||||||
|
// Convert to RGB, and back to bpp ("mask out" alpha bits etc)
|
||||||
|
bpp2rgb( dm.dmBitsPerPel, &r, &g, &b );
|
||||||
|
bpp = r + g + b;
|
||||||
|
|
||||||
|
// Mode "code" for this mode
|
||||||
|
m1 = (bpp << 25) | (dm.dmPelsWidth * dm.dmPelsHeight);
|
||||||
|
|
||||||
|
// Insert mode in list (sorted), and avoid duplicates
|
||||||
|
for( i = 0; i < count; i ++ )
|
||||||
|
{
|
||||||
|
// Mode "code" for already listed mode
|
||||||
|
bpp = list[i].RedBits + list[i].GreenBits +
|
||||||
|
list[i].BlueBits;
|
||||||
|
m2 = (bpp << 25) | (list[i].Width * list[i].Height);
|
||||||
|
if( m1 <= m2 )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// New entry at the end of the list?
|
||||||
|
if( i >= count )
|
||||||
|
{
|
||||||
|
list[count].Width = dm.dmPelsWidth;
|
||||||
|
list[count].Height = dm.dmPelsHeight;
|
||||||
|
list[count].RedBits = r;
|
||||||
|
list[count].GreenBits = g;
|
||||||
|
list[count].BlueBits = b;
|
||||||
|
count ++;
|
||||||
|
}
|
||||||
|
// Insert new entry in the list?
|
||||||
|
else if( m1 < m2 )
|
||||||
|
{
|
||||||
|
for( j = count; j > i; j -- )
|
||||||
|
{
|
||||||
|
list[j] = list[j-1];
|
||||||
|
}
|
||||||
|
list[i].Width = dm.dmPelsWidth;
|
||||||
|
list[i].Height = dm.dmPelsHeight;
|
||||||
|
list[i].RedBits = r;
|
||||||
|
list[i].GreenBits = g;
|
||||||
|
list[i].BlueBits = b;
|
||||||
|
count ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mode ++;
|
||||||
|
}
|
||||||
|
while( success && (count < maxcount) );
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Get the desktop video mode
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformGetDesktopMode( GLFWvidmode *mode )
|
||||||
|
{
|
||||||
|
DEVMODE dm;
|
||||||
|
|
||||||
|
// Get desktop display mode
|
||||||
|
dm.dmSize = sizeof( DEVMODE );
|
||||||
|
(void) EnumDisplaySettings( NULL, ENUM_REGISTRY_SETTINGS, &dm );
|
||||||
|
|
||||||
|
// Return desktop mode parameters
|
||||||
|
mode->Width = dm.dmPelsWidth;
|
||||||
|
mode->Height = dm.dmPelsHeight;
|
||||||
|
bpp2rgb( dm.dmBitsPerPel, &mode->RedBits, &mode->GreenBits, &mode->BlueBits );
|
||||||
|
}
|
||||||
|
|
82
lib/win32/win32_glext.c
Normal file
82
lib/win32/win32_glext.c
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Win32/WGL
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** Platform implementation functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Check if the current context supports the specified WGL extension
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformExtensionSupported( const char *extension )
|
||||||
|
{
|
||||||
|
const GLubyte *extensions;
|
||||||
|
|
||||||
|
if( _glfwWin.GetExtensionsStringEXT != NULL )
|
||||||
|
{
|
||||||
|
extensions = (GLubyte *) _glfwWin.GetExtensionsStringEXT();
|
||||||
|
if( extensions != NULL )
|
||||||
|
{
|
||||||
|
if( _glfwStringInExtensionString( extension, extensions ) )
|
||||||
|
{
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( _glfwWin.GetExtensionsStringARB != NULL )
|
||||||
|
{
|
||||||
|
extensions = (GLubyte *) _glfwWin.GetExtensionsStringARB( _glfwWin.DC );
|
||||||
|
if( extensions != NULL )
|
||||||
|
{
|
||||||
|
if( _glfwStringInExtensionString( extension, extensions ) )
|
||||||
|
{
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Get the function pointer to an OpenGL function
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void *_glfwPlatformGetProcAddress( const char *procname )
|
||||||
|
{
|
||||||
|
return (void *) wglGetProcAddress( procname );
|
||||||
|
}
|
||||||
|
|
281
lib/win32/win32_init.c
Normal file
281
lib/win32/win32_init.c
Normal file
|
@ -0,0 +1,281 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Win32/WGL
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
// With the Borland C++ compiler, we want to disable FPU exceptions
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
#include <float.h>
|
||||||
|
#endif // __BORLANDC__
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** GLFW internal functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwInitLibraries() - Load necessary libraries (DLLs)
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static int _glfwInitLibraries( void )
|
||||||
|
{
|
||||||
|
// gdi32.dll (OpenGL pixel format functions & SwapBuffers)
|
||||||
|
#ifndef _GLFW_NO_DLOAD_GDI32
|
||||||
|
_glfwLibrary.Libs.gdi32 = LoadLibrary( "gdi32.dll" );
|
||||||
|
if( _glfwLibrary.Libs.gdi32 != NULL )
|
||||||
|
{
|
||||||
|
_glfwLibrary.Libs.ChoosePixelFormat = (CHOOSEPIXELFORMAT_T)
|
||||||
|
GetProcAddress( _glfwLibrary.Libs.gdi32, "ChoosePixelFormat" );
|
||||||
|
_glfwLibrary.Libs.DescribePixelFormat = (DESCRIBEPIXELFORMAT_T)
|
||||||
|
GetProcAddress( _glfwLibrary.Libs.gdi32, "DescribePixelFormat" );
|
||||||
|
_glfwLibrary.Libs.GetPixelFormat = (GETPIXELFORMAT_T)
|
||||||
|
GetProcAddress( _glfwLibrary.Libs.gdi32, "GetPixelFormat" );
|
||||||
|
_glfwLibrary.Libs.SetPixelFormat = (SETPIXELFORMAT_T)
|
||||||
|
GetProcAddress( _glfwLibrary.Libs.gdi32, "SetPixelFormat" );
|
||||||
|
_glfwLibrary.Libs.SwapBuffers = (SWAPBUFFERS_T)
|
||||||
|
GetProcAddress( _glfwLibrary.Libs.gdi32, "SwapBuffers" );
|
||||||
|
if( _glfwLibrary.Libs.ChoosePixelFormat == NULL ||
|
||||||
|
_glfwLibrary.Libs.DescribePixelFormat == NULL ||
|
||||||
|
_glfwLibrary.Libs.GetPixelFormat == NULL ||
|
||||||
|
_glfwLibrary.Libs.SetPixelFormat == NULL ||
|
||||||
|
_glfwLibrary.Libs.SwapBuffers == NULL )
|
||||||
|
{
|
||||||
|
FreeLibrary( _glfwLibrary.Libs.gdi32 );
|
||||||
|
_glfwLibrary.Libs.gdi32 = NULL;
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
#endif // _GLFW_NO_DLOAD_GDI32
|
||||||
|
|
||||||
|
// winmm.dll (for joystick and timer support)
|
||||||
|
#ifndef _GLFW_NO_DLOAD_WINMM
|
||||||
|
_glfwLibrary.Libs.winmm = LoadLibrary( "winmm.dll" );
|
||||||
|
if( _glfwLibrary.Libs.winmm != NULL )
|
||||||
|
{
|
||||||
|
_glfwLibrary.Libs.joyGetDevCapsA = (JOYGETDEVCAPSA_T)
|
||||||
|
GetProcAddress( _glfwLibrary.Libs.winmm, "joyGetDevCapsA" );
|
||||||
|
_glfwLibrary.Libs.joyGetPos = (JOYGETPOS_T)
|
||||||
|
GetProcAddress( _glfwLibrary.Libs.winmm, "joyGetPos" );
|
||||||
|
_glfwLibrary.Libs.joyGetPosEx = (JOYGETPOSEX_T)
|
||||||
|
GetProcAddress( _glfwLibrary.Libs.winmm, "joyGetPosEx" );
|
||||||
|
_glfwLibrary.Libs.timeGetTime = (TIMEGETTIME_T)
|
||||||
|
GetProcAddress( _glfwLibrary.Libs.winmm, "timeGetTime" );
|
||||||
|
if( _glfwLibrary.Libs.joyGetDevCapsA == NULL ||
|
||||||
|
_glfwLibrary.Libs.joyGetPos == NULL ||
|
||||||
|
_glfwLibrary.Libs.joyGetPosEx == NULL ||
|
||||||
|
_glfwLibrary.Libs.timeGetTime == NULL )
|
||||||
|
{
|
||||||
|
FreeLibrary( _glfwLibrary.Libs.winmm );
|
||||||
|
_glfwLibrary.Libs.winmm = NULL;
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
#endif // _GLFW_NO_DLOAD_WINMM
|
||||||
|
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwFreeLibraries() - Unload used libraries (DLLs)
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void _glfwFreeLibraries( void )
|
||||||
|
{
|
||||||
|
// gdi32.dll
|
||||||
|
#ifndef _GLFW_NO_DLOAD_GDI32
|
||||||
|
if( _glfwLibrary.Libs.gdi32 != NULL )
|
||||||
|
{
|
||||||
|
FreeLibrary( _glfwLibrary.Libs.gdi32 );
|
||||||
|
_glfwLibrary.Libs.gdi32 = NULL;
|
||||||
|
}
|
||||||
|
#endif // _GLFW_NO_DLOAD_GDI32
|
||||||
|
|
||||||
|
// winmm.dll
|
||||||
|
#ifndef _GLFW_NO_DLOAD_WINMM
|
||||||
|
if( _glfwLibrary.Libs.winmm != NULL )
|
||||||
|
{
|
||||||
|
FreeLibrary( _glfwLibrary.Libs.winmm );
|
||||||
|
_glfwLibrary.Libs.winmm = NULL;
|
||||||
|
}
|
||||||
|
#endif // _GLFW_NO_DLOAD_WINMM
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwTerminate_atexit() - Terminate GLFW when exiting application
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwTerminate_atexit( void )
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** Platform implementation functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwPlatformInit() - Initialize various GLFW state
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformInit( void )
|
||||||
|
{
|
||||||
|
OSVERSIONINFO osi;
|
||||||
|
|
||||||
|
// To make SetForegroundWindow() work as we want, we need to fiddle
|
||||||
|
// with the FOREGROUNDLOCKTIMEOUT system setting (we do this as early
|
||||||
|
// as possible in the hope of still being the foreground process)
|
||||||
|
SystemParametersInfo( SPI_GETFOREGROUNDLOCKTIMEOUT, 0,
|
||||||
|
&_glfwLibrary.Sys.foregroundLockTimeout, 0 );
|
||||||
|
SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0,
|
||||||
|
SPIF_SENDCHANGE );
|
||||||
|
|
||||||
|
// Check which OS version we are running
|
||||||
|
osi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
|
||||||
|
GetVersionEx( &osi );
|
||||||
|
_glfwLibrary.Sys.winVer = _GLFW_WIN_UNKNOWN;
|
||||||
|
if( osi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )
|
||||||
|
{
|
||||||
|
if( osi.dwMajorVersion == 4 && osi.dwMinorVersion < 10 )
|
||||||
|
{
|
||||||
|
_glfwLibrary.Sys.winVer = _GLFW_WIN_95;
|
||||||
|
}
|
||||||
|
else if( osi.dwMajorVersion == 4 && osi.dwMinorVersion < 90 )
|
||||||
|
{
|
||||||
|
_glfwLibrary.Sys.winVer = _GLFW_WIN_98;
|
||||||
|
}
|
||||||
|
else if( osi.dwMajorVersion == 4 && osi.dwMinorVersion == 90 )
|
||||||
|
{
|
||||||
|
_glfwLibrary.Sys.winVer = _GLFW_WIN_ME;
|
||||||
|
}
|
||||||
|
else if( osi.dwMajorVersion >= 4 )
|
||||||
|
{
|
||||||
|
_glfwLibrary.Sys.winVer = _GLFW_WIN_UNKNOWN_9x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( osi.dwPlatformId == VER_PLATFORM_WIN32_NT )
|
||||||
|
{
|
||||||
|
if( osi.dwMajorVersion == 4 && osi.dwMinorVersion == 0 )
|
||||||
|
{
|
||||||
|
_glfwLibrary.Sys.winVer = _GLFW_WIN_NT4;
|
||||||
|
}
|
||||||
|
else if( osi.dwMajorVersion == 5 && osi.dwMinorVersion == 0 )
|
||||||
|
{
|
||||||
|
_glfwLibrary.Sys.winVer = _GLFW_WIN_2K;
|
||||||
|
}
|
||||||
|
else if( osi.dwMajorVersion == 5 && osi.dwMinorVersion == 1 )
|
||||||
|
{
|
||||||
|
_glfwLibrary.Sys.winVer = _GLFW_WIN_XP;
|
||||||
|
}
|
||||||
|
else if( osi.dwMajorVersion == 5 && osi.dwMinorVersion == 2 )
|
||||||
|
{
|
||||||
|
_glfwLibrary.Sys.winVer = _GLFW_WIN_NET_SERVER;
|
||||||
|
}
|
||||||
|
else if( osi.dwMajorVersion >= 5 )
|
||||||
|
{
|
||||||
|
_glfwLibrary.Sys.winVer = _GLFW_WIN_UNKNOWN_NT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do we have Unicode support?
|
||||||
|
if( _glfwLibrary.Sys.winVer >= _GLFW_WIN_NT4 )
|
||||||
|
{
|
||||||
|
// Windows NT/2000/XP/.NET has Unicode support
|
||||||
|
_glfwLibrary.Sys.hasUnicode = GL_TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Windows 9x/ME does not have Unicode support
|
||||||
|
_glfwLibrary.Sys.hasUnicode = GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load libraries (DLLs)
|
||||||
|
if( !_glfwInitLibraries() )
|
||||||
|
{
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// With the Borland C++ compiler, we want to disable FPU exceptions
|
||||||
|
// (this is recommended for OpenGL applications under Windows)
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
_control87( MCW_EM, MCW_EM );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Retrieve GLFW instance handle
|
||||||
|
_glfwLibrary.instance = GetModuleHandle( NULL );
|
||||||
|
|
||||||
|
// System keys are not disabled
|
||||||
|
_glfwWin.keyboardHook = NULL;
|
||||||
|
|
||||||
|
// Install atexit() routine
|
||||||
|
atexit( _glfwTerminate_atexit );
|
||||||
|
|
||||||
|
// Start the timer
|
||||||
|
_glfwInitTimer();
|
||||||
|
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Close window and shut down library
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformTerminate( void )
|
||||||
|
{
|
||||||
|
// Close OpenGL window
|
||||||
|
glfwCloseWindow();
|
||||||
|
|
||||||
|
// Enable system keys again (if they were disabled)
|
||||||
|
glfwEnable( GLFW_SYSTEM_KEYS );
|
||||||
|
|
||||||
|
// Unload libraries (DLLs)
|
||||||
|
_glfwFreeLibraries();
|
||||||
|
|
||||||
|
// Restore FOREGROUNDLOCKTIMEOUT system setting
|
||||||
|
SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0,
|
||||||
|
(LPVOID)_glfwLibrary.Sys.foregroundLockTimeout,
|
||||||
|
SPIF_SENDCHANGE );
|
||||||
|
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
234
lib/win32/win32_joystick.c
Normal file
234
lib/win32/win32_joystick.c
Normal file
|
@ -0,0 +1,234 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Win32/WGL
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** GLFW internal functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwJoystickPresent() - Return GL_TRUE if joystick is present,
|
||||||
|
// else return GL_FALSE.
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static int _glfwJoystickPresent( int joy )
|
||||||
|
{
|
||||||
|
JOYINFO ji;
|
||||||
|
|
||||||
|
// Windows NT 4.0 MMSYSTEM only supports 2 sticks (other Windows
|
||||||
|
// versions support 16 sticks)
|
||||||
|
if( _glfwLibrary.Sys.winVer == _GLFW_WIN_NT4 && joy > GLFW_JOYSTICK_2 )
|
||||||
|
{
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is it a valid stick ID (Windows don't support more than 16 sticks)?
|
||||||
|
if( joy < GLFW_JOYSTICK_1 || joy > GLFW_JOYSTICK_16 )
|
||||||
|
{
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is the joystick present?
|
||||||
|
if( _glfw_joyGetPos( joy - GLFW_JOYSTICK_1, &ji ) != JOYERR_NOERROR )
|
||||||
|
{
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwCalcJoystickPos() - Calculate joystick position
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static float _glfwCalcJoystickPos( DWORD pos, DWORD min, DWORD max )
|
||||||
|
{
|
||||||
|
float fpos = (float) pos;
|
||||||
|
float fmin = (float) min;
|
||||||
|
float fmax = (float) max;
|
||||||
|
return (2.0f*(fpos - fmin) / (fmax - fmin)) - 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** Platform implementation functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwPlatformGetJoystickParam() - Determine joystick capabilities
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformGetJoystickParam( int joy, int param )
|
||||||
|
{
|
||||||
|
JOYCAPS jc;
|
||||||
|
|
||||||
|
// return 0;
|
||||||
|
|
||||||
|
// Is joystick present?
|
||||||
|
if( !_glfwJoystickPresent( joy ) )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We got this far, the joystick is present
|
||||||
|
if( param == GLFW_PRESENT )
|
||||||
|
{
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get joystick capabilities
|
||||||
|
_glfw_joyGetDevCaps( joy - GLFW_JOYSTICK_1, &jc, sizeof(JOYCAPS) );
|
||||||
|
|
||||||
|
switch( param )
|
||||||
|
{
|
||||||
|
case GLFW_AXES:
|
||||||
|
// Return number of joystick axes
|
||||||
|
return jc.wNumAxes;
|
||||||
|
|
||||||
|
case GLFW_BUTTONS:
|
||||||
|
// Return number of joystick axes
|
||||||
|
return jc.wNumButtons;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwPlatformGetJoystickPos() - Get joystick axis positions
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes )
|
||||||
|
{
|
||||||
|
JOYCAPS jc;
|
||||||
|
JOYINFOEX ji;
|
||||||
|
int axis;
|
||||||
|
|
||||||
|
// return 0;
|
||||||
|
|
||||||
|
// Is joystick present?
|
||||||
|
if( !_glfwJoystickPresent( joy ) )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get joystick capabilities
|
||||||
|
_glfw_joyGetDevCaps( joy - GLFW_JOYSTICK_1, &jc, sizeof(JOYCAPS) );
|
||||||
|
|
||||||
|
// Get joystick state
|
||||||
|
ji.dwSize = sizeof( JOYINFOEX );
|
||||||
|
ji.dwFlags = JOY_RETURNX | JOY_RETURNY | JOY_RETURNZ |
|
||||||
|
JOY_RETURNR | JOY_RETURNU | JOY_RETURNV;
|
||||||
|
_glfw_joyGetPosEx( joy - GLFW_JOYSTICK_1, &ji );
|
||||||
|
|
||||||
|
// Get position values for all axes
|
||||||
|
axis = 0;
|
||||||
|
if( axis < numaxes )
|
||||||
|
{
|
||||||
|
pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwXpos, jc.wXmin,
|
||||||
|
jc.wXmax );
|
||||||
|
}
|
||||||
|
if( axis < numaxes )
|
||||||
|
{
|
||||||
|
pos[ axis++ ] = -_glfwCalcJoystickPos( ji.dwYpos, jc.wYmin,
|
||||||
|
jc.wYmax );
|
||||||
|
}
|
||||||
|
if( axis < numaxes && jc.wCaps & JOYCAPS_HASZ )
|
||||||
|
{
|
||||||
|
pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwZpos, jc.wZmin,
|
||||||
|
jc.wZmax );
|
||||||
|
}
|
||||||
|
if( axis < numaxes && jc.wCaps & JOYCAPS_HASR )
|
||||||
|
{
|
||||||
|
pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwRpos, jc.wRmin,
|
||||||
|
jc.wRmax );
|
||||||
|
}
|
||||||
|
if( axis < numaxes && jc.wCaps & JOYCAPS_HASU )
|
||||||
|
{
|
||||||
|
pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwUpos, jc.wUmin,
|
||||||
|
jc.wUmax );
|
||||||
|
}
|
||||||
|
if( axis < numaxes && jc.wCaps & JOYCAPS_HASV )
|
||||||
|
{
|
||||||
|
pos[ axis++ ] = -_glfwCalcJoystickPos( ji.dwVpos, jc.wVmin,
|
||||||
|
jc.wVmax );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return number of returned axes
|
||||||
|
return axis;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwPlatformGetJoystickButtons() - Get joystick button states
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons,
|
||||||
|
int numbuttons )
|
||||||
|
{
|
||||||
|
JOYCAPS jc;
|
||||||
|
JOYINFOEX ji;
|
||||||
|
int button;
|
||||||
|
|
||||||
|
// return 0;
|
||||||
|
|
||||||
|
// Is joystick present?
|
||||||
|
if( !_glfwJoystickPresent( joy ) )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get joystick capabilities
|
||||||
|
_glfw_joyGetDevCaps( joy - GLFW_JOYSTICK_1, &jc, sizeof(JOYCAPS) );
|
||||||
|
|
||||||
|
// Get joystick state
|
||||||
|
ji.dwSize = sizeof( JOYINFOEX );
|
||||||
|
ji.dwFlags = JOY_RETURNBUTTONS;
|
||||||
|
_glfw_joyGetPosEx( joy - GLFW_JOYSTICK_1, &ji );
|
||||||
|
|
||||||
|
// Get states of all requested buttons
|
||||||
|
button = 0;
|
||||||
|
while( button < numbuttons && button < (int) jc.wNumButtons )
|
||||||
|
{
|
||||||
|
buttons[ button ] = (unsigned char)
|
||||||
|
(ji.dwButtons & (1UL << button) ? GLFW_PRESS : GLFW_RELEASE);
|
||||||
|
button ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
|
118
lib/win32/win32_time.c
Normal file
118
lib/win32/win32_time.c
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: Win32/WGL
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** GLFW internal functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwInitTimer() - Initialise timer
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwInitTimer( void )
|
||||||
|
{
|
||||||
|
__int64 freq;
|
||||||
|
|
||||||
|
// Check if we have a performance counter
|
||||||
|
if( QueryPerformanceFrequency( (LARGE_INTEGER *)&freq ) )
|
||||||
|
{
|
||||||
|
// Performance counter is available => use it!
|
||||||
|
_glfwLibrary.Timer.HasPerformanceCounter = GL_TRUE;
|
||||||
|
|
||||||
|
// Counter resolution is 1 / counter frequency
|
||||||
|
_glfwLibrary.Timer.Resolution = 1.0 / (double)freq;
|
||||||
|
|
||||||
|
// Set start time for timer
|
||||||
|
QueryPerformanceCounter( (LARGE_INTEGER *)&_glfwLibrary.Timer.t0_64 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// No performace counter available => use the tick counter
|
||||||
|
_glfwLibrary.Timer.HasPerformanceCounter = GL_FALSE;
|
||||||
|
|
||||||
|
// Counter resolution is 1 ms
|
||||||
|
_glfwLibrary.Timer.Resolution = 0.001;
|
||||||
|
|
||||||
|
// Set start time for timer
|
||||||
|
_glfwLibrary.Timer.t0_32 = _glfw_timeGetTime();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** Platform implementation functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Return timer value in seconds
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
double _glfwPlatformGetTime( void )
|
||||||
|
{
|
||||||
|
double t;
|
||||||
|
__int64 t_64;
|
||||||
|
|
||||||
|
if( _glfwLibrary.Timer.HasPerformanceCounter )
|
||||||
|
{
|
||||||
|
QueryPerformanceCounter( (LARGE_INTEGER *)&t_64 );
|
||||||
|
t = (double)(t_64 - _glfwLibrary.Timer.t0_64);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
t = (double)(_glfw_timeGetTime() - _glfwLibrary.Timer.t0_32);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate the current time in seconds
|
||||||
|
return t * _glfwLibrary.Timer.Resolution;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Set timer value in seconds
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformSetTime( double t )
|
||||||
|
{
|
||||||
|
__int64 t_64;
|
||||||
|
|
||||||
|
if( _glfwLibrary.Timer.HasPerformanceCounter )
|
||||||
|
{
|
||||||
|
QueryPerformanceCounter( (LARGE_INTEGER *)&t_64 );
|
||||||
|
_glfwLibrary.Timer.t0_64 = t_64 - (__int64)(t/_glfwLibrary.Timer.Resolution);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_glfwLibrary.Timer.t0_32 = _glfw_timeGetTime() - (int)(t*1000.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
1817
lib/win32/win32_window.c
Normal file
1817
lib/win32/win32_window.c
Normal file
File diff suppressed because it is too large
Load Diff
1030
lib/window.c
Normal file
1030
lib/window.c
Normal file
File diff suppressed because it is too large
Load Diff
36
lib/x11/CMakeLists.txt
Normal file
36
lib/x11/CMakeLists.txt
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
configure_file(
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/x11_config.h.cmake
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/x11_config.h @ONLY)
|
||||||
|
|
||||||
|
configure_file(
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/libglfw.pc.cmake
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc @ONLY)
|
||||||
|
|
||||||
|
include_directories(
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/..
|
||||||
|
${GLFW_INCLUDE_DIR})
|
||||||
|
|
||||||
|
set(libglfw_SOURCES
|
||||||
|
${common_SOURCES}
|
||||||
|
x11_enable.c
|
||||||
|
x11_fullscreen.c
|
||||||
|
x11_glext.c
|
||||||
|
x11_init.c
|
||||||
|
x11_joystick.c
|
||||||
|
x11_keysym2unicode.c
|
||||||
|
x11_time.c
|
||||||
|
x11_window.c)
|
||||||
|
|
||||||
|
add_library(libglfwStatic STATIC ${libglfw_SOURCES})
|
||||||
|
add_library(libglfwShared SHARED ${libglfw_SOURCES})
|
||||||
|
target_link_libraries(libglfwShared ${GLFW_LIBRARIES})
|
||||||
|
set_target_properties(libglfwStatic libglfwShared PROPERTIES
|
||||||
|
CLEAN_DIRECT_OUTPUT 1
|
||||||
|
OUTPUT_NAME glfw
|
||||||
|
)
|
||||||
|
|
||||||
|
install(TARGETS libglfwStatic libglfwShared DESTINATION lib)
|
||||||
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc DESTINATION lib/pkgconfig)
|
||||||
|
|
11
lib/x11/libglfw.pc.cmake
Normal file
11
lib/x11/libglfw.pc.cmake
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
prefix=@CMAKE_INSTALL_PREFIX@
|
||||||
|
exec_prefix=${prefix}
|
||||||
|
libdir=${exec_prefix}/lib
|
||||||
|
includedir=${prefix}/include
|
||||||
|
|
||||||
|
Name: GLFW
|
||||||
|
Description: A portable framework for OpenGL development
|
||||||
|
Version: 2.7
|
||||||
|
URL: http://glfw.sourceforge.net/
|
||||||
|
Libs: -L${libdir} -lglfw @GLFW_LIBRARIES@
|
||||||
|
Cflags: -I${includedir}
|
433
lib/x11/platform.h
Normal file
433
lib/x11/platform.h
Normal file
|
@ -0,0 +1,433 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: X11/GLX
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#ifndef _platform_h_
|
||||||
|
#define _platform_h_
|
||||||
|
|
||||||
|
|
||||||
|
// This is the X11 version of GLFW
|
||||||
|
#define _GLFW_X11
|
||||||
|
|
||||||
|
|
||||||
|
// Include files
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/keysym.h>
|
||||||
|
#include <X11/Xatom.h>
|
||||||
|
#include <GL/glx.h>
|
||||||
|
|
||||||
|
#include "../../include/GL/glfw.h"
|
||||||
|
#include "x11_config.h"
|
||||||
|
|
||||||
|
// We need declarations for GLX version 1.3 or above even if the server doesn't
|
||||||
|
// support version 1.3
|
||||||
|
#ifndef GLX_VERSION_1_3
|
||||||
|
#error "GLX header version 1.3 or above is required"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined( _GLFW_HAS_XF86VIDMODE ) && defined( _GLFW_HAS_XRANDR )
|
||||||
|
#error "Xf86VidMode and RandR extensions cannot both be enabled"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// With XFree86, we can use the XF86VidMode extension
|
||||||
|
#if defined( _GLFW_HAS_XF86VIDMODE )
|
||||||
|
#include <X11/extensions/xf86vmode.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined( _GLFW_HAS_XRANDR )
|
||||||
|
#include <X11/extensions/Xrandr.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Do we have support for dlopen/dlsym?
|
||||||
|
#if defined( _GLFW_HAS_DLOPEN )
|
||||||
|
#include <dlfcn.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// We support two different ways for getting the number of processors in
|
||||||
|
// the system: sysconf (POSIX) and sysctl (BSD?)
|
||||||
|
#if defined( _GLFW_HAS_SYSCONF )
|
||||||
|
|
||||||
|
// Use a single constant for querying number of online processors using
|
||||||
|
// the sysconf function (e.g. SGI defines _SC_NPROC_ONLN instead of
|
||||||
|
// _SC_NPROCESSORS_ONLN)
|
||||||
|
#ifndef _SC_NPROCESSORS_ONLN
|
||||||
|
#ifdef _SC_NPROC_ONLN
|
||||||
|
#define _SC_NPROCESSORS_ONLN _SC_NPROC_ONLN
|
||||||
|
#else
|
||||||
|
#error POSIX constant _SC_NPROCESSORS_ONLN not defined!
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Macro for querying the number of processors
|
||||||
|
#define _glfw_numprocessors(n) n=(int)sysconf(_SC_NPROCESSORS_ONLN)
|
||||||
|
|
||||||
|
#elif defined( _GLFW_HAS_SYSCTL )
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/sysctl.h>
|
||||||
|
|
||||||
|
// Macro for querying the number of processors
|
||||||
|
#define _glfw_numprocessors(n) { \
|
||||||
|
int mib[2], ncpu; \
|
||||||
|
size_t len = 1; \
|
||||||
|
mib[0] = CTL_HW; \
|
||||||
|
mib[1] = HW_NCPU; \
|
||||||
|
n = 1; \
|
||||||
|
if( sysctl( mib, 2, &ncpu, &len, NULL, 0 ) != -1 ) \
|
||||||
|
{ \
|
||||||
|
if( len > 0 ) \
|
||||||
|
{ \
|
||||||
|
n = ncpu; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
// If neither sysconf nor sysctl is supported, assume single processor
|
||||||
|
// system
|
||||||
|
#define _glfw_numprocessors(n) n=1
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Pointer length integer
|
||||||
|
// One day, this will most likely move into glfw.h
|
||||||
|
typedef intptr_t GLFWintptr;
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GLX_SGI_swap_control
|
||||||
|
|
||||||
|
// Function signature for GLX_SGI_swap_control
|
||||||
|
typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval);
|
||||||
|
|
||||||
|
#endif /*GLX_SGI_swap_control*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GLX_SGIX_fbconfig
|
||||||
|
|
||||||
|
/* Type definitions for GLX_SGIX_fbconfig */
|
||||||
|
typedef XID GLXFBConfigIDSGIX;
|
||||||
|
typedef struct __GLXFBConfigRec *GLXFBConfigSGIX;
|
||||||
|
|
||||||
|
/* Function signatures for GLX_SGIX_fbconfig */
|
||||||
|
typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, int attribute, int *value);
|
||||||
|
typedef GLXFBConfigSGIX * ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, int *attrib_list, int *nelements);
|
||||||
|
typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct);
|
||||||
|
typedef XVisualInfo * ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config);
|
||||||
|
|
||||||
|
/* Tokens for GLX_SGIX_fbconfig */
|
||||||
|
#define GLX_WINDOW_BIT_SGIX 0x00000001
|
||||||
|
#define GLX_PIXMAP_BIT_SGIX 0x00000002
|
||||||
|
#define GLX_RGBA_BIT_SGIX 0x00000001
|
||||||
|
#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002
|
||||||
|
#define GLX_DRAWABLE_TYPE_SGIX 0x8010
|
||||||
|
#define GLX_RENDER_TYPE_SGIX 0x8011
|
||||||
|
#define GLX_X_RENDERABLE_SGIX 0x8012
|
||||||
|
#define GLX_FBCONFIG_ID_SGIX 0x8013
|
||||||
|
#define GLX_RGBA_TYPE_SGIX 0x8014
|
||||||
|
#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015
|
||||||
|
#define GLX_SCREEN_EXT 0x800C
|
||||||
|
|
||||||
|
#endif /*GLX_SGIX_fbconfig*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GLX_ARB_create_context
|
||||||
|
|
||||||
|
/* Tokens for glXCreateContextAttribsARB attributes */
|
||||||
|
#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091
|
||||||
|
#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092
|
||||||
|
#define GLX_CONTEXT_FLAGS_ARB 0x2094
|
||||||
|
|
||||||
|
/* Bits for WGL_CONTEXT_FLAGS_ARB */
|
||||||
|
#define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001
|
||||||
|
#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002
|
||||||
|
|
||||||
|
/* Prototype for glXCreateContextAttribs */
|
||||||
|
typedef GLXContext (*PFNGLXCREATECONTEXTATTRIBSARBPROC)( Display *display, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list);
|
||||||
|
|
||||||
|
#endif /*GLX_ARB_create_context*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GLX_ARB_create_context_profile
|
||||||
|
|
||||||
|
/* Tokens for glXCreateContextAttribsARB attributes */
|
||||||
|
#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126
|
||||||
|
|
||||||
|
/* BIts for GLX_CONTEXT_PROFILE_MASK_ARB */
|
||||||
|
#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
|
||||||
|
#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
|
||||||
|
|
||||||
|
#endif /*GLX_ARB_create_context_profile*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GL_VERSION_3_0
|
||||||
|
|
||||||
|
typedef const GLubyte * (APIENTRY *PFNGLGETSTRINGIPROC) (GLenum, GLuint);
|
||||||
|
|
||||||
|
#endif /*GL_VERSION_3_0*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Global variables (GLFW internals)
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Window structure
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
typedef struct _GLFWwin_struct _GLFWwin;
|
||||||
|
|
||||||
|
struct _GLFWwin_struct {
|
||||||
|
|
||||||
|
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||||
|
|
||||||
|
// User callback functions
|
||||||
|
GLFWwindowsizefun windowSizeCallback;
|
||||||
|
GLFWwindowclosefun windowCloseCallback;
|
||||||
|
GLFWwindowrefreshfun windowRefreshCallback;
|
||||||
|
GLFWmousebuttonfun mouseButtonCallback;
|
||||||
|
GLFWmouseposfun mousePosCallback;
|
||||||
|
GLFWmousewheelfun mouseWheelCallback;
|
||||||
|
GLFWkeyfun keyCallback;
|
||||||
|
GLFWcharfun charCallback;
|
||||||
|
|
||||||
|
// User selected window settings
|
||||||
|
int fullscreen; // Fullscreen flag
|
||||||
|
int mouseLock; // Mouse-lock flag
|
||||||
|
int autoPollEvents; // Auto polling flag
|
||||||
|
int sysKeysDisabled; // System keys disabled flag
|
||||||
|
int windowNoResize; // Resize- and maximize gadgets disabled flag
|
||||||
|
int refreshRate; // Vertical monitor refresh rate
|
||||||
|
|
||||||
|
// Window status & parameters
|
||||||
|
int opened; // Flag telling if window is opened or not
|
||||||
|
int active; // Application active flag
|
||||||
|
int iconified; // Window iconified flag
|
||||||
|
int width, height; // Window width and heigth
|
||||||
|
int accelerated; // GL_TRUE if window is HW accelerated
|
||||||
|
|
||||||
|
// Framebuffer attributes
|
||||||
|
int redBits;
|
||||||
|
int greenBits;
|
||||||
|
int blueBits;
|
||||||
|
int alphaBits;
|
||||||
|
int depthBits;
|
||||||
|
int stencilBits;
|
||||||
|
int accumRedBits;
|
||||||
|
int accumGreenBits;
|
||||||
|
int accumBlueBits;
|
||||||
|
int accumAlphaBits;
|
||||||
|
int auxBuffers;
|
||||||
|
int stereo;
|
||||||
|
int samples;
|
||||||
|
|
||||||
|
// OpenGL extensions and context attributes
|
||||||
|
int has_GL_SGIS_generate_mipmap;
|
||||||
|
int has_GL_ARB_texture_non_power_of_two;
|
||||||
|
int glMajor, glMinor, glRevision;
|
||||||
|
int glForward, glDebug, glProfile;
|
||||||
|
|
||||||
|
PFNGLGETSTRINGIPROC GetStringi;
|
||||||
|
|
||||||
|
|
||||||
|
// ========= PLATFORM SPECIFIC PART ======================================
|
||||||
|
|
||||||
|
// Platform specific window resources
|
||||||
|
Colormap colormap; // Window colormap
|
||||||
|
Window window; // Window
|
||||||
|
Window root; // Root window for screen
|
||||||
|
int screen; // Screen ID
|
||||||
|
XVisualInfo *visual; // Visual for selected GLXFBConfig
|
||||||
|
GLXFBConfigID fbconfigID; // ID of selected GLXFBConfig
|
||||||
|
GLXContext context; // OpenGL rendering context
|
||||||
|
Atom wmDeleteWindow; // WM_DELETE_WINDOW atom
|
||||||
|
Atom wmPing; // _NET_WM_PING atom
|
||||||
|
Atom wmState; // _NET_WM_STATE atom
|
||||||
|
Atom wmStateFullscreen; // _NET_WM_STATE_FULLSCREEN atom
|
||||||
|
Atom wmActiveWindow; // _NET_ACTIVE_WINDOW atom
|
||||||
|
Cursor cursor; // Invisible cursor for hidden cursor
|
||||||
|
|
||||||
|
// GLX extensions
|
||||||
|
PFNGLXSWAPINTERVALSGIPROC SwapIntervalSGI;
|
||||||
|
PFNGLXGETFBCONFIGATTRIBSGIXPROC GetFBConfigAttribSGIX;
|
||||||
|
PFNGLXCHOOSEFBCONFIGSGIXPROC ChooseFBConfigSGIX;
|
||||||
|
PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC CreateContextWithConfigSGIX;
|
||||||
|
PFNGLXGETVISUALFROMFBCONFIGSGIXPROC GetVisualFromFBConfigSGIX;
|
||||||
|
PFNGLXCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB;
|
||||||
|
GLboolean has_GLX_SGIX_fbconfig;
|
||||||
|
GLboolean has_GLX_SGI_swap_control;
|
||||||
|
GLboolean has_GLX_ARB_multisample;
|
||||||
|
GLboolean has_GLX_ARB_create_context;
|
||||||
|
GLboolean has_GLX_ARB_create_context_profile;
|
||||||
|
|
||||||
|
// Various platform specific internal variables
|
||||||
|
GLboolean hasEWMH; // True if window manager supports EWMH
|
||||||
|
GLboolean overrideRedirect; // True if window is OverrideRedirect
|
||||||
|
GLboolean keyboardGrabbed; // True if keyboard is currently grabbed
|
||||||
|
GLboolean pointerGrabbed; // True if pointer is currently grabbed
|
||||||
|
GLboolean pointerHidden; // True if pointer is currently hidden
|
||||||
|
|
||||||
|
// Screensaver data
|
||||||
|
struct {
|
||||||
|
int changed;
|
||||||
|
int timeout;
|
||||||
|
int interval;
|
||||||
|
int blanking;
|
||||||
|
int exposure;
|
||||||
|
} Saver;
|
||||||
|
|
||||||
|
// Fullscreen data
|
||||||
|
struct {
|
||||||
|
int modeChanged;
|
||||||
|
#if defined( _GLFW_HAS_XF86VIDMODE )
|
||||||
|
XF86VidModeModeInfo oldMode;
|
||||||
|
#endif
|
||||||
|
#if defined( _GLFW_HAS_XRANDR )
|
||||||
|
SizeID oldSizeID;
|
||||||
|
int oldWidth;
|
||||||
|
int oldHeight;
|
||||||
|
Rotation oldRotation;
|
||||||
|
#endif
|
||||||
|
} FS;
|
||||||
|
};
|
||||||
|
|
||||||
|
GLFWGLOBAL _GLFWwin _glfwWin;
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// User input status (most of this should go in _GLFWwin)
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
GLFWGLOBAL struct {
|
||||||
|
|
||||||
|
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||||
|
|
||||||
|
// Mouse status
|
||||||
|
int MousePosX, MousePosY;
|
||||||
|
int WheelPos;
|
||||||
|
char MouseButton[ GLFW_MOUSE_BUTTON_LAST+1 ];
|
||||||
|
|
||||||
|
// Keyboard status
|
||||||
|
char Key[ GLFW_KEY_LAST+1 ];
|
||||||
|
int LastChar;
|
||||||
|
|
||||||
|
// User selected settings
|
||||||
|
int StickyKeys;
|
||||||
|
int StickyMouseButtons;
|
||||||
|
int KeyRepeat;
|
||||||
|
|
||||||
|
|
||||||
|
// ========= PLATFORM SPECIFIC PART ======================================
|
||||||
|
|
||||||
|
// Platform specific internal variables
|
||||||
|
int MouseMoved, CursorPosX, CursorPosY;
|
||||||
|
|
||||||
|
} _glfwInput;
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Library global data
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
GLFWGLOBAL struct {
|
||||||
|
|
||||||
|
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||||
|
|
||||||
|
// Window opening hints
|
||||||
|
_GLFWhints hints;
|
||||||
|
|
||||||
|
// ========= PLATFORM SPECIFIC PART ======================================
|
||||||
|
|
||||||
|
Display *display;
|
||||||
|
|
||||||
|
// Server-side GLX version
|
||||||
|
int glxMajor, glxMinor;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
int available;
|
||||||
|
int eventBase;
|
||||||
|
int errorBase;
|
||||||
|
} XF86VidMode;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
int available;
|
||||||
|
int eventBase;
|
||||||
|
int errorBase;
|
||||||
|
} XRandR;
|
||||||
|
|
||||||
|
// Timer data
|
||||||
|
struct {
|
||||||
|
double resolution;
|
||||||
|
long long t0;
|
||||||
|
} Timer;
|
||||||
|
|
||||||
|
#if defined(_GLFW_DLOPEN_LIBGL)
|
||||||
|
struct {
|
||||||
|
void *libGL; // dlopen handle for libGL.so
|
||||||
|
} Libs;
|
||||||
|
#endif
|
||||||
|
} _glfwLibrary;
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Joystick information & state
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
GLFWGLOBAL struct {
|
||||||
|
int Present;
|
||||||
|
int fd;
|
||||||
|
int NumAxes;
|
||||||
|
int NumButtons;
|
||||||
|
float *Axis;
|
||||||
|
unsigned char *Button;
|
||||||
|
} _glfwJoy[ GLFW_JOYSTICK_LAST + 1 ];
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Prototypes for platform specific internal functions
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
// Time
|
||||||
|
void _glfwInitTimer( void );
|
||||||
|
|
||||||
|
// Fullscreen support
|
||||||
|
int _glfwGetClosestVideoMode( int screen, int *width, int *height, int *rate );
|
||||||
|
void _glfwSetVideoModeMODE( int screen, int mode, int rate );
|
||||||
|
void _glfwSetVideoMode( int screen, int *width, int *height, int *rate );
|
||||||
|
void _glfwRestoreVideoMode( void );
|
||||||
|
|
||||||
|
// Joystick input
|
||||||
|
void _glfwInitJoysticks( void );
|
||||||
|
void _glfwTerminateJoysticks( void );
|
||||||
|
|
||||||
|
// Unicode support
|
||||||
|
long _glfwKeySym2Unicode( KeySym keysym );
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _platform_h_
|
14
lib/x11/x11_config.h.cmake
Normal file
14
lib/x11/x11_config.h.cmake
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
/* Configure build time options of GLFW */
|
||||||
|
|
||||||
|
/* Define this to 1 if XRandR is available */
|
||||||
|
#cmakedefine _GLFW_HAS_XRANDR 1
|
||||||
|
/* Define this to 1 if Xf86VidMode is available */
|
||||||
|
#cmakedefine _GLFW_HAS_XF86VIDMODE 1
|
||||||
|
|
||||||
|
/* Define this to 1 if glXGetProcAddress is available */
|
||||||
|
#cmakedefine _GLFW_HAS_GLXGETPROCADDRESS 1
|
||||||
|
/* Define this to 1 if glXGetProcAddressARB is available */
|
||||||
|
#cmakedefine _GLFW_HAS_GLXGETPROCADDRESSARB 1
|
||||||
|
/* Define this to 1 if glXGetProcAddressEXT is available */
|
||||||
|
#cmakedefine _GLFW_HAS_GLXGETPROCADDRESSEXT 1
|
||||||
|
|
64
lib/x11/x11_enable.c
Normal file
64
lib/x11/x11_enable.c
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: X11 (Unix)
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** Platform implementation functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Enable system keys
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformEnableSystemKeys( void )
|
||||||
|
{
|
||||||
|
if( _glfwWin.keyboardGrabbed )
|
||||||
|
{
|
||||||
|
XUngrabKeyboard( _glfwLibrary.display, CurrentTime );
|
||||||
|
_glfwWin.keyboardGrabbed = GL_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Disable system keys
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformDisableSystemKeys( void )
|
||||||
|
{
|
||||||
|
if( XGrabKeyboard( _glfwLibrary.display, _glfwWin.window, True,
|
||||||
|
GrabModeAsync, GrabModeAsync, CurrentTime ) ==
|
||||||
|
GrabSuccess )
|
||||||
|
{
|
||||||
|
_glfwWin.keyboardGrabbed = GL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
572
lib/x11/x11_fullscreen.c
Normal file
572
lib/x11/x11_fullscreen.c
Normal file
|
@ -0,0 +1,572 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: X11/GLX
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** GLFW internal functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Convert BPP to RGB bits (based on "best guess")
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void BPP2RGB( int bpp, int *r, int *g, int *b )
|
||||||
|
{
|
||||||
|
int delta;
|
||||||
|
|
||||||
|
// Special case: BPP = 32 (I don't think this is necessary for X11??)
|
||||||
|
if( bpp == 32 )
|
||||||
|
bpp = 24;
|
||||||
|
|
||||||
|
// Convert "bits per pixel" to red, green & blue sizes
|
||||||
|
*r = *g = *b = bpp / 3;
|
||||||
|
delta = bpp - (*r * 3);
|
||||||
|
if( delta >= 1 )
|
||||||
|
{
|
||||||
|
*g = *g + 1;
|
||||||
|
}
|
||||||
|
if( delta == 2 )
|
||||||
|
{
|
||||||
|
*r = *r + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Finds the video mode closest in size to the specified desired size
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwGetClosestVideoMode( int screen, int *width, int *height, int *rate )
|
||||||
|
{
|
||||||
|
#if defined( _GLFW_HAS_XRANDR )
|
||||||
|
int i, match, bestmatch;
|
||||||
|
int sizecount, bestsize;
|
||||||
|
int ratecount, bestrate;
|
||||||
|
short *ratelist;
|
||||||
|
XRRScreenConfiguration *sc;
|
||||||
|
XRRScreenSize *sizelist;
|
||||||
|
|
||||||
|
if( _glfwLibrary.XRandR.available )
|
||||||
|
{
|
||||||
|
sc = XRRGetScreenInfo( _glfwLibrary.display,
|
||||||
|
RootWindow( _glfwLibrary.display, screen ) );
|
||||||
|
|
||||||
|
sizelist = XRRConfigSizes( sc, &sizecount );
|
||||||
|
|
||||||
|
// Find the best matching mode
|
||||||
|
bestsize = -1;
|
||||||
|
bestmatch = INT_MAX;
|
||||||
|
for( i = 0; i < sizecount; i++ )
|
||||||
|
{
|
||||||
|
match = (*width - sizelist[i].width) *
|
||||||
|
(*width - sizelist[i].width) +
|
||||||
|
(*height - sizelist[i].height) *
|
||||||
|
(*height - sizelist[i].height);
|
||||||
|
if( match < bestmatch )
|
||||||
|
{
|
||||||
|
bestmatch = match;
|
||||||
|
bestsize = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( bestsize != -1 )
|
||||||
|
{
|
||||||
|
// Report width & height of best matching mode
|
||||||
|
*width = sizelist[bestsize].width;
|
||||||
|
*height = sizelist[bestsize].height;
|
||||||
|
|
||||||
|
if( *rate > 0 )
|
||||||
|
{
|
||||||
|
ratelist = XRRConfigRates( sc, bestsize, &ratecount );
|
||||||
|
|
||||||
|
bestrate = -1;
|
||||||
|
bestmatch = INT_MAX;
|
||||||
|
for( i = 0; i < ratecount; i++ )
|
||||||
|
{
|
||||||
|
match = abs( ratelist[i] - *rate );
|
||||||
|
if( match < bestmatch )
|
||||||
|
{
|
||||||
|
bestmatch = match;
|
||||||
|
bestrate = ratelist[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( bestrate != -1 )
|
||||||
|
{
|
||||||
|
*rate = bestrate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Free modelist
|
||||||
|
XRRFreeScreenConfigInfo( sc );
|
||||||
|
|
||||||
|
if( bestsize != -1 )
|
||||||
|
{
|
||||||
|
return bestsize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#elif defined( _GLFW_HAS_XF86VIDMODE )
|
||||||
|
XF86VidModeModeInfo **modelist;
|
||||||
|
int modecount, i, bestmode, bestmatch, match;
|
||||||
|
|
||||||
|
// Use the XF86VidMode extension to control video resolution
|
||||||
|
if( _glfwLibrary.XF86VidMode.available )
|
||||||
|
{
|
||||||
|
// Get a list of all available display modes
|
||||||
|
XF86VidModeGetAllModeLines( _glfwLibrary.display, screen,
|
||||||
|
&modecount, &modelist );
|
||||||
|
|
||||||
|
// Find the best matching mode
|
||||||
|
bestmode = -1;
|
||||||
|
bestmatch = INT_MAX;
|
||||||
|
for( i = 0; i < modecount; i++ )
|
||||||
|
{
|
||||||
|
match = (*width - modelist[i]->hdisplay) *
|
||||||
|
(*width - modelist[i]->hdisplay) +
|
||||||
|
(*height - modelist[i]->vdisplay) *
|
||||||
|
(*height - modelist[i]->vdisplay);
|
||||||
|
if( match < bestmatch )
|
||||||
|
{
|
||||||
|
bestmatch = match;
|
||||||
|
bestmode = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( bestmode != -1 )
|
||||||
|
{
|
||||||
|
// Report width & height of best matching mode
|
||||||
|
*width = modelist[ bestmode ]->hdisplay;
|
||||||
|
*height = modelist[ bestmode ]->vdisplay;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Free modelist
|
||||||
|
XFree( modelist );
|
||||||
|
|
||||||
|
if( bestmode != -1 )
|
||||||
|
{
|
||||||
|
return bestmode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Default: Simply use the screen resolution
|
||||||
|
*width = DisplayWidth( _glfwLibrary.display, screen );
|
||||||
|
*height = DisplayHeight( _glfwLibrary.display, screen );
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Change the current video mode
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwSetVideoModeMODE( int screen, int mode, int rate )
|
||||||
|
{
|
||||||
|
#if defined( _GLFW_HAS_XRANDR )
|
||||||
|
XRRScreenConfiguration *sc;
|
||||||
|
Window root;
|
||||||
|
|
||||||
|
if( _glfwLibrary.XRandR.available )
|
||||||
|
{
|
||||||
|
root = RootWindow( _glfwLibrary.display, screen );
|
||||||
|
sc = XRRGetScreenInfo( _glfwLibrary.display, root );
|
||||||
|
|
||||||
|
// Remember old size and flag that we have changed the mode
|
||||||
|
if( !_glfwWin.FS.modeChanged )
|
||||||
|
{
|
||||||
|
_glfwWin.FS.oldSizeID = XRRConfigCurrentConfiguration( sc, &_glfwWin.FS.oldRotation );
|
||||||
|
_glfwWin.FS.oldWidth = DisplayWidth( _glfwLibrary.display, screen );
|
||||||
|
_glfwWin.FS.oldHeight = DisplayHeight( _glfwLibrary.display, screen );
|
||||||
|
|
||||||
|
_glfwWin.FS.modeChanged = GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( rate > 0 )
|
||||||
|
{
|
||||||
|
// Set desired configuration
|
||||||
|
XRRSetScreenConfigAndRate( _glfwLibrary.display,
|
||||||
|
sc,
|
||||||
|
root,
|
||||||
|
mode,
|
||||||
|
RR_Rotate_0,
|
||||||
|
(short) rate,
|
||||||
|
CurrentTime );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Set desired configuration
|
||||||
|
XRRSetScreenConfig( _glfwLibrary.display,
|
||||||
|
sc,
|
||||||
|
root,
|
||||||
|
mode,
|
||||||
|
RR_Rotate_0,
|
||||||
|
CurrentTime );
|
||||||
|
}
|
||||||
|
|
||||||
|
XRRFreeScreenConfigInfo( sc );
|
||||||
|
}
|
||||||
|
#elif defined( _GLFW_HAS_XF86VIDMODE )
|
||||||
|
XF86VidModeModeInfo **modelist;
|
||||||
|
int modecount;
|
||||||
|
|
||||||
|
// Use the XF86VidMode extension to control video resolution
|
||||||
|
if( _glfwLibrary.XF86VidMode.available )
|
||||||
|
{
|
||||||
|
// Get a list of all available display modes
|
||||||
|
XF86VidModeGetAllModeLines( _glfwLibrary.display, screen,
|
||||||
|
&modecount, &modelist );
|
||||||
|
|
||||||
|
// Unlock mode switch if necessary
|
||||||
|
if( _glfwWin.FS.modeChanged )
|
||||||
|
{
|
||||||
|
XF86VidModeLockModeSwitch( _glfwLibrary.display, screen, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Change the video mode to the desired mode
|
||||||
|
XF86VidModeSwitchToMode( _glfwLibrary.display, screen,
|
||||||
|
modelist[ mode ] );
|
||||||
|
|
||||||
|
// Set viewport to upper left corner (where our window will be)
|
||||||
|
XF86VidModeSetViewPort( _glfwLibrary.display, screen, 0, 0 );
|
||||||
|
|
||||||
|
// Lock mode switch
|
||||||
|
XF86VidModeLockModeSwitch( _glfwLibrary.display, screen, 1 );
|
||||||
|
|
||||||
|
// Remember old mode and flag that we have changed the mode
|
||||||
|
if( !_glfwWin.FS.modeChanged )
|
||||||
|
{
|
||||||
|
_glfwWin.FS.oldMode = *modelist[ 0 ];
|
||||||
|
_glfwWin.FS.modeChanged = GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Free mode list
|
||||||
|
XFree( modelist );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Change the current video mode
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwSetVideoMode( int screen, int *width, int *height, int *rate )
|
||||||
|
{
|
||||||
|
int bestmode;
|
||||||
|
|
||||||
|
// Find a best match mode
|
||||||
|
bestmode = _glfwGetClosestVideoMode( screen, width, height, rate );
|
||||||
|
|
||||||
|
// Change mode
|
||||||
|
_glfwSetVideoModeMODE( screen, bestmode, *rate );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Restore the previously saved (original) video mode
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwRestoreVideoMode( void )
|
||||||
|
{
|
||||||
|
if( _glfwWin.FS.modeChanged )
|
||||||
|
{
|
||||||
|
#if defined( _GLFW_HAS_XRANDR )
|
||||||
|
if( _glfwLibrary.XRandR.available )
|
||||||
|
{
|
||||||
|
XRRScreenConfiguration *sc;
|
||||||
|
|
||||||
|
if( _glfwLibrary.XRandR.available )
|
||||||
|
{
|
||||||
|
sc = XRRGetScreenInfo( _glfwLibrary.display, _glfwWin.root );
|
||||||
|
|
||||||
|
XRRSetScreenConfig( _glfwLibrary.display,
|
||||||
|
sc,
|
||||||
|
_glfwWin.root,
|
||||||
|
_glfwWin.FS.oldSizeID,
|
||||||
|
_glfwWin.FS.oldRotation,
|
||||||
|
CurrentTime );
|
||||||
|
|
||||||
|
XRRFreeScreenConfigInfo( sc );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#elif defined( _GLFW_HAS_XF86VIDMODE )
|
||||||
|
if( _glfwLibrary.XF86VidMode.available )
|
||||||
|
{
|
||||||
|
// Unlock mode switch
|
||||||
|
XF86VidModeLockModeSwitch( _glfwLibrary.display, _glfwWin.screen, 0 );
|
||||||
|
|
||||||
|
// Change the video mode back to the old mode
|
||||||
|
XF86VidModeSwitchToMode( _glfwLibrary.display,
|
||||||
|
_glfwWin.screen,
|
||||||
|
&_glfwWin.FS.oldMode );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
_glfwWin.FS.modeChanged = GL_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** Platform implementation functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
struct _glfwResolution
|
||||||
|
{
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
};
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// List available video modes
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount )
|
||||||
|
{
|
||||||
|
int count, k, l, r, g, b, rgba, gl;
|
||||||
|
int depth, screen;
|
||||||
|
Display *dpy;
|
||||||
|
XVisualInfo *vislist, dummy;
|
||||||
|
int viscount, rgbcount, rescount;
|
||||||
|
int *rgbarray;
|
||||||
|
struct _glfwResolution *resarray;
|
||||||
|
#if defined( _GLFW_HAS_XRANDR )
|
||||||
|
XRRScreenConfiguration *sc;
|
||||||
|
XRRScreenSize *sizelist;
|
||||||
|
int sizecount;
|
||||||
|
#elif defined( _GLFW_HAS_XF86VIDMODE )
|
||||||
|
XF86VidModeModeInfo **modelist;
|
||||||
|
int modecount, width, height;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Get display and screen
|
||||||
|
dpy = _glfwLibrary.display;
|
||||||
|
screen = DefaultScreen( dpy );
|
||||||
|
|
||||||
|
// Get list of visuals
|
||||||
|
vislist = XGetVisualInfo( dpy, 0, &dummy, &viscount );
|
||||||
|
if( vislist == NULL )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
rgbarray = (int*) malloc( sizeof(int) * viscount );
|
||||||
|
rgbcount = 0;
|
||||||
|
|
||||||
|
// Build RGB array
|
||||||
|
for( k = 0; k < viscount; k++ )
|
||||||
|
{
|
||||||
|
// Does the visual support OpenGL & true color?
|
||||||
|
glXGetConfig( dpy, &vislist[k], GLX_USE_GL, &gl );
|
||||||
|
glXGetConfig( dpy, &vislist[k], GLX_RGBA, &rgba );
|
||||||
|
if( gl && rgba )
|
||||||
|
{
|
||||||
|
// Get color depth for this visual
|
||||||
|
depth = vislist[k].depth;
|
||||||
|
|
||||||
|
// Convert to RGB
|
||||||
|
BPP2RGB( depth, &r, &g, &b );
|
||||||
|
depth = (r<<16) | (g<<8) | b;
|
||||||
|
|
||||||
|
// Is this mode unique?
|
||||||
|
for( l = 0; l < rgbcount; l++ )
|
||||||
|
{
|
||||||
|
if( depth == rgbarray[ l ] )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( l >= rgbcount )
|
||||||
|
{
|
||||||
|
rgbarray[ rgbcount ] = depth;
|
||||||
|
rgbcount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rescount = 0;
|
||||||
|
resarray = NULL;
|
||||||
|
|
||||||
|
// Build resolution array
|
||||||
|
#if defined( _GLFW_HAS_XRANDR )
|
||||||
|
if( _glfwLibrary.XRandR.available )
|
||||||
|
{
|
||||||
|
sc = XRRGetScreenInfo( dpy, RootWindow( dpy, screen ) );
|
||||||
|
sizelist = XRRConfigSizes( sc, &sizecount );
|
||||||
|
|
||||||
|
resarray = (struct _glfwResolution*) malloc( sizeof(struct _glfwResolution) * sizecount );
|
||||||
|
|
||||||
|
for( k = 0; k < sizecount; k++ )
|
||||||
|
{
|
||||||
|
resarray[ rescount ].width = sizelist[ k ].width;
|
||||||
|
resarray[ rescount ].height = sizelist[ k ].height;
|
||||||
|
rescount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
XRRFreeScreenConfigInfo( sc );
|
||||||
|
}
|
||||||
|
#elif defined( _GLFW_HAS_XF86VIDMODE )
|
||||||
|
if( _glfwLibrary.XF86VidMode.available )
|
||||||
|
{
|
||||||
|
XF86VidModeGetAllModeLines( dpy, screen, &modecount, &modelist );
|
||||||
|
|
||||||
|
resarray = (struct _glfwResolution*) malloc( sizeof(struct _glfwResolution) * modecount );
|
||||||
|
|
||||||
|
for( k = 0; k < modecount; k++ )
|
||||||
|
{
|
||||||
|
width = modelist[ k ]->hdisplay;
|
||||||
|
height = modelist[ k ]->vdisplay;
|
||||||
|
|
||||||
|
// Is this mode unique?
|
||||||
|
for( l = 0; l < rescount; l++ )
|
||||||
|
{
|
||||||
|
if( width == resarray[ l ].width && height == resarray[ l ].height )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( l >= rescount )
|
||||||
|
{
|
||||||
|
resarray[ rescount ].width = width;
|
||||||
|
resarray[ rescount ].height = height;
|
||||||
|
rescount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
XFree( modelist );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if( !resarray )
|
||||||
|
{
|
||||||
|
rescount = 1;
|
||||||
|
resarray = (struct _glfwResolution*) malloc( sizeof(struct _glfwResolution) * rescount );
|
||||||
|
|
||||||
|
resarray[ 0 ].width = DisplayWidth( dpy, screen );
|
||||||
|
resarray[ 0 ].height = DisplayHeight( dpy, screen );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build permutations of colors and resolutions
|
||||||
|
count = 0;
|
||||||
|
for( k = 0; k < rgbcount && count < maxcount; k++ )
|
||||||
|
{
|
||||||
|
for( l = 0; l < rescount && count < maxcount; l++ )
|
||||||
|
{
|
||||||
|
list[count].Width = resarray[ l ].width;
|
||||||
|
list[count].Height = resarray[ l ].height;
|
||||||
|
list[count].RedBits = (rgbarray[ k ] >> 16) & 255;
|
||||||
|
list[count].GreenBits = (rgbarray[ k ] >> 8) & 255;
|
||||||
|
list[count].BlueBits = rgbarray[ k ] & 255;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Free visuals list
|
||||||
|
XFree( vislist );
|
||||||
|
|
||||||
|
free( resarray );
|
||||||
|
free( rgbarray );
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Get the desktop video mode
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformGetDesktopMode( GLFWvidmode *mode )
|
||||||
|
{
|
||||||
|
Display *dpy;
|
||||||
|
int bpp, screen;
|
||||||
|
#if defined( _GLFW_HAS_XF86VIDMODE )
|
||||||
|
XF86VidModeModeInfo **modelist;
|
||||||
|
int modecount;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Get display and screen
|
||||||
|
dpy = _glfwLibrary.display;
|
||||||
|
screen = DefaultScreen( dpy );
|
||||||
|
|
||||||
|
// Get display depth
|
||||||
|
bpp = DefaultDepth( dpy, screen );
|
||||||
|
|
||||||
|
// Convert BPP to RGB bits
|
||||||
|
BPP2RGB( bpp, &mode->RedBits, &mode->GreenBits, &mode->BlueBits );
|
||||||
|
|
||||||
|
#if defined( _GLFW_HAS_XRANDR )
|
||||||
|
if( _glfwLibrary.XRandR.available )
|
||||||
|
{
|
||||||
|
if( _glfwWin.FS.modeChanged )
|
||||||
|
{
|
||||||
|
mode->Width = _glfwWin.FS.oldWidth;
|
||||||
|
mode->Height = _glfwWin.FS.oldHeight;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#elif defined( _GLFW_HAS_XF86VIDMODE )
|
||||||
|
if( _glfwLibrary.XF86VidMode.available )
|
||||||
|
{
|
||||||
|
if( _glfwWin.FS.modeChanged )
|
||||||
|
{
|
||||||
|
// The old (desktop) mode is stored in _glfwWin.FS.oldMode
|
||||||
|
mode->Width = _glfwWin.FS.oldMode.hdisplay;
|
||||||
|
mode->Height = _glfwWin.FS.oldMode.vdisplay;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Use the XF86VidMode extension to get list of video modes
|
||||||
|
XF86VidModeGetAllModeLines( dpy, screen, &modecount,
|
||||||
|
&modelist );
|
||||||
|
|
||||||
|
// The first mode in the list is the current (desktio) mode
|
||||||
|
mode->Width = modelist[ 0 ]->hdisplay;
|
||||||
|
mode->Height = modelist[ 0 ]->vdisplay;
|
||||||
|
|
||||||
|
// Free list
|
||||||
|
XFree( modelist );
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Get current display width and height
|
||||||
|
mode->Width = DisplayWidth( dpy, screen );
|
||||||
|
mode->Height = DisplayHeight( dpy, screen );
|
||||||
|
}
|
||||||
|
|
90
lib/x11/x11_glext.c
Normal file
90
lib/x11/x11_glext.c
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: X11/GLX
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
void (*glXGetProcAddress(const GLubyte *procName))();
|
||||||
|
void (*glXGetProcAddressARB(const GLubyte *procName))();
|
||||||
|
void (*glXGetProcAddressEXT(const GLubyte *procName))();
|
||||||
|
|
||||||
|
// We support four different ways for getting addresses for GL/GLX
|
||||||
|
// extension functions: glXGetProcAddress, glXGetProcAddressARB,
|
||||||
|
// glXGetProcAddressEXT, and dlsym
|
||||||
|
#if defined( _GLFW_HAS_GLXGETPROCADDRESSARB )
|
||||||
|
#define _glfw_glXGetProcAddress(x) glXGetProcAddressARB(x)
|
||||||
|
#elif defined( _GLFW_HAS_GLXGETPROCADDRESS )
|
||||||
|
#define _glfw_glXGetProcAddress(x) glXGetProcAddress(x)
|
||||||
|
#elif defined( _GLFW_HAS_GLXGETPROCADDRESSEXT )
|
||||||
|
#define _glfw_glXGetProcAddress(x) glXGetProcAddressEXT(x)
|
||||||
|
#elif defined( _GLFW_HAS_DLOPEN )
|
||||||
|
#define _glfw_glXGetProcAddress(x) dlsym(_glfwLibs.libGL,x)
|
||||||
|
#define _GLFW_DLOPEN_LIBGL
|
||||||
|
#else
|
||||||
|
#define _glfw_glXGetProcAddress(x) NULL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** Platform implementation functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Check if an OpenGL extension is available at runtime
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformExtensionSupported( const char *extension )
|
||||||
|
{
|
||||||
|
const GLubyte *extensions;
|
||||||
|
|
||||||
|
// Get list of GLX extensions
|
||||||
|
extensions = (const GLubyte*) glXQueryExtensionsString( _glfwLibrary.display,
|
||||||
|
_glfwWin.screen );
|
||||||
|
if( extensions != NULL )
|
||||||
|
{
|
||||||
|
if( _glfwStringInExtensionString( extension, extensions ) )
|
||||||
|
{
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Get the function pointer to an OpenGL function
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void * _glfwPlatformGetProcAddress( const char *procname )
|
||||||
|
{
|
||||||
|
return (void *) _glfw_glXGetProcAddress( (const GLubyte *) procname );
|
||||||
|
}
|
||||||
|
|
206
lib/x11/x11_init.c
Normal file
206
lib/x11/x11_init.c
Normal file
|
@ -0,0 +1,206 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: X11/GLX
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** GLFW internal functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Dynamically load libraries
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void initLibraries( void )
|
||||||
|
{
|
||||||
|
#ifdef _GLFW_DLOPEN_LIBGL
|
||||||
|
int i;
|
||||||
|
char *libGL_names[ ] =
|
||||||
|
{
|
||||||
|
"libGL.so",
|
||||||
|
"libGL.so.1",
|
||||||
|
"/usr/lib/libGL.so",
|
||||||
|
"/usr/lib/libGL.so.1",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
_glfwLibrary.Libs.libGL = NULL;
|
||||||
|
for( i = 0; !libGL_names[ i ] != NULL; i ++ )
|
||||||
|
{
|
||||||
|
_glfwLibrary.Libs.libGL = dlopen( libGL_names[ i ],
|
||||||
|
RTLD_LAZY | RTLD_GLOBAL );
|
||||||
|
if( _glfwLibrary.Libs.libGL )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Terminate GLFW when exiting application
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void glfw_atexit( void )
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Initialize X11 display
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static int initDisplay( void )
|
||||||
|
{
|
||||||
|
// Open display
|
||||||
|
_glfwLibrary.display = XOpenDisplay( 0 );
|
||||||
|
if( !_glfwLibrary.display )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to open X display\n");
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for XF86VidMode extension
|
||||||
|
#ifdef _GLFW_HAS_XF86VIDMODE
|
||||||
|
_glfwLibrary.XF86VidMode.available =
|
||||||
|
XF86VidModeQueryExtension( _glfwLibrary.display,
|
||||||
|
&_glfwLibrary.XF86VidMode.eventBase,
|
||||||
|
&_glfwLibrary.XF86VidMode.errorBase);
|
||||||
|
#else
|
||||||
|
_glfwLibrary.XF86VidMode.available = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Check for XRandR extension
|
||||||
|
#ifdef _GLFW_HAS_XRANDR
|
||||||
|
_glfwLibrary.XRandR.available =
|
||||||
|
XRRQueryExtension( _glfwLibrary.display,
|
||||||
|
&_glfwLibrary.XRandR.eventBase,
|
||||||
|
&_glfwLibrary.XRandR.errorBase );
|
||||||
|
#else
|
||||||
|
_glfwLibrary.XRandR.available = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Fullscreen & screen saver settings
|
||||||
|
// Check if GLX is supported on this display
|
||||||
|
if( !glXQueryExtension( _glfwLibrary.display, NULL, NULL ) )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "GLX not supported\n");
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve GLX version
|
||||||
|
if( !glXQueryVersion( _glfwLibrary.display,
|
||||||
|
&_glfwLibrary.glxMajor,
|
||||||
|
&_glfwLibrary.glxMinor ) )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Unable to query GLX version\n");
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Terminate X11 display
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void terminateDisplay( void )
|
||||||
|
{
|
||||||
|
// Open display
|
||||||
|
if( _glfwLibrary.display )
|
||||||
|
{
|
||||||
|
XCloseDisplay( _glfwLibrary.display );
|
||||||
|
_glfwLibrary.display = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** Platform implementation functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Initialize various GLFW state
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformInit( void )
|
||||||
|
{
|
||||||
|
// Initialize display
|
||||||
|
if( !initDisplay() )
|
||||||
|
{
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to load libGL.so if necessary
|
||||||
|
initLibraries();
|
||||||
|
|
||||||
|
// Install atexit() routine
|
||||||
|
atexit( glfw_atexit );
|
||||||
|
|
||||||
|
// Initialize joysticks
|
||||||
|
_glfwInitJoysticks();
|
||||||
|
|
||||||
|
// Start the timer
|
||||||
|
_glfwInitTimer();
|
||||||
|
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Close window and shut down library
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformTerminate( void )
|
||||||
|
{
|
||||||
|
// Close OpenGL window
|
||||||
|
glfwCloseWindow();
|
||||||
|
|
||||||
|
// Terminate display
|
||||||
|
terminateDisplay();
|
||||||
|
|
||||||
|
// Terminate joysticks
|
||||||
|
_glfwTerminateJoysticks();
|
||||||
|
|
||||||
|
// Unload libGL.so if necessary
|
||||||
|
#ifdef _GLFW_DLOPEN_LIBGL
|
||||||
|
if( _glfwLibrary.Libs.libGL != NULL )
|
||||||
|
{
|
||||||
|
dlclose( _glfwLibrary.Libs.libGL );
|
||||||
|
_glfwLibrary.Libs.libGL = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
367
lib/x11/x11_joystick.c
Normal file
367
lib/x11/x11_joystick.c
Normal file
|
@ -0,0 +1,367 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: X11/GLX
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Note: Only Linux joystick input is supported at the moment. Other
|
||||||
|
// systems will behave as if there are no joysticks connected.
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** GLFW internal functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
#ifdef _GLFW_USE_LINUX_JOYSTICKS
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Here are the Linux joystick driver v1.x interface definitions that we
|
||||||
|
// use (we do not want to rely on <linux/joystick.h>):
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
// Joystick event types
|
||||||
|
#define JS_EVENT_BUTTON 0x01 /* button pressed/released */
|
||||||
|
#define JS_EVENT_AXIS 0x02 /* joystick moved */
|
||||||
|
#define JS_EVENT_INIT 0x80 /* initial state of device */
|
||||||
|
|
||||||
|
// Joystick event structure
|
||||||
|
struct js_event {
|
||||||
|
unsigned int time; /* (u32) event timestamp in milliseconds */
|
||||||
|
signed short value; /* (s16) value */
|
||||||
|
unsigned char type; /* (u8) event type */
|
||||||
|
unsigned char number; /* (u8) axis/button number */
|
||||||
|
};
|
||||||
|
|
||||||
|
// Joystick IOCTL commands
|
||||||
|
#define JSIOCGVERSION _IOR('j', 0x01, int) /* get driver version (u32) */
|
||||||
|
#define JSIOCGAXES _IOR('j', 0x11, char) /* get number of axes (u8) */
|
||||||
|
#define JSIOCGBUTTONS _IOR('j', 0x12, char) /* get number of buttons (u8) */
|
||||||
|
|
||||||
|
#endif // _GLFW_USE_LINUX_JOYSTICKS
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwInitJoysticks() - Initialize joystick interface
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwInitJoysticks( void )
|
||||||
|
{
|
||||||
|
#ifdef _GLFW_USE_LINUX_JOYSTICKS
|
||||||
|
int k, n, fd, joy_count;
|
||||||
|
char *joy_base_name, joy_dev_name[ 20 ];
|
||||||
|
int driver_version = 0x000800;
|
||||||
|
char ret_data;
|
||||||
|
#endif // _GLFW_USE_LINUX_JOYSTICKS
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// Start by saying that there are no sticks
|
||||||
|
for( i = 0; i <= GLFW_JOYSTICK_LAST; ++ i )
|
||||||
|
{
|
||||||
|
_glfwJoy[ i ].Present = GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _GLFW_USE_LINUX_JOYSTICKS
|
||||||
|
|
||||||
|
// Try to open joysticks (nonblocking)
|
||||||
|
joy_count = 0;
|
||||||
|
for( k = 0; k <= 1 && joy_count <= GLFW_JOYSTICK_LAST; ++ k )
|
||||||
|
{
|
||||||
|
// Pick joystick base name
|
||||||
|
switch( k )
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
joy_base_name = "/dev/input/js"; // USB sticks
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
joy_base_name = "/dev/js"; // "Legacy" sticks
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue; // (should never happen)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to open a few of these sticks
|
||||||
|
for( i = 0; i <= 50 && joy_count <= GLFW_JOYSTICK_LAST; ++ i )
|
||||||
|
{
|
||||||
|
sprintf( joy_dev_name, "%s%d", joy_base_name, i );
|
||||||
|
fd = open( joy_dev_name, O_NONBLOCK );
|
||||||
|
if( fd != -1 )
|
||||||
|
{
|
||||||
|
// Remember fd
|
||||||
|
_glfwJoy[ joy_count ].fd = fd;
|
||||||
|
|
||||||
|
// Check that the joystick driver version is 1.0+
|
||||||
|
ioctl( fd, JSIOCGVERSION, &driver_version );
|
||||||
|
if( driver_version < 0x010000 )
|
||||||
|
{
|
||||||
|
// It's an old 0.x interface (we don't support it)
|
||||||
|
close( fd );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get number of joystick axes
|
||||||
|
ioctl( fd, JSIOCGAXES, &ret_data );
|
||||||
|
_glfwJoy[ joy_count ].NumAxes = (int) ret_data;
|
||||||
|
|
||||||
|
// Get number of joystick buttons
|
||||||
|
ioctl( fd, JSIOCGBUTTONS, &ret_data );
|
||||||
|
_glfwJoy[ joy_count ].NumButtons = (int) ret_data;
|
||||||
|
|
||||||
|
// Allocate memory for joystick state
|
||||||
|
_glfwJoy[ joy_count ].Axis =
|
||||||
|
(float *) malloc( sizeof(float) *
|
||||||
|
_glfwJoy[ joy_count ].NumAxes );
|
||||||
|
if( _glfwJoy[ joy_count ].Axis == NULL )
|
||||||
|
{
|
||||||
|
close( fd );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
_glfwJoy[ joy_count ].Button =
|
||||||
|
(unsigned char *) malloc( sizeof(char) *
|
||||||
|
_glfwJoy[ joy_count ].NumButtons );
|
||||||
|
if( _glfwJoy[ joy_count ].Button == NULL )
|
||||||
|
{
|
||||||
|
free( _glfwJoy[ joy_count ].Axis );
|
||||||
|
close( fd );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear joystick state
|
||||||
|
for( n = 0; n < _glfwJoy[ joy_count ].NumAxes; ++ n )
|
||||||
|
{
|
||||||
|
_glfwJoy[ joy_count ].Axis[ n ] = 0.0f;
|
||||||
|
}
|
||||||
|
for( n = 0; n < _glfwJoy[ joy_count ].NumButtons; ++ n )
|
||||||
|
{
|
||||||
|
_glfwJoy[ joy_count ].Button[ n ] = GLFW_RELEASE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The joystick is supported and connected
|
||||||
|
_glfwJoy[ joy_count ].Present = GL_TRUE;
|
||||||
|
joy_count ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // _GLFW_USE_LINUX_JOYSTICKS
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwTerminateJoysticks() - Close all opened joystick handles
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwTerminateJoysticks( void )
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef _GLFW_USE_LINUX_JOYSTICKS
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// Close any opened joysticks
|
||||||
|
for( i = 0; i <= GLFW_JOYSTICK_LAST; ++ i )
|
||||||
|
{
|
||||||
|
if( _glfwJoy[ i ].Present )
|
||||||
|
{
|
||||||
|
close( _glfwJoy[ i ].fd );
|
||||||
|
free( _glfwJoy[ i ].Axis );
|
||||||
|
free( _glfwJoy[ i ].Button );
|
||||||
|
_glfwJoy[ i ].Present = GL_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // _GLFW_USE_LINUX_JOYSTICKS
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Empty joystick event queue
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
static void pollJoystickEvents( void )
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef _GLFW_USE_LINUX_JOYSTICKS
|
||||||
|
|
||||||
|
struct js_event e;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// Get joystick events for all GLFW joysticks
|
||||||
|
for( i = 0; i <= GLFW_JOYSTICK_LAST; ++ i )
|
||||||
|
{
|
||||||
|
// Is the stick present?
|
||||||
|
if( _glfwJoy[ i ].Present )
|
||||||
|
{
|
||||||
|
// Read all queued events (non-blocking)
|
||||||
|
while( read(_glfwJoy[i].fd, &e, sizeof(struct js_event)) > 0 )
|
||||||
|
{
|
||||||
|
// We don't care if it's an init event or not
|
||||||
|
e.type &= ~JS_EVENT_INIT;
|
||||||
|
|
||||||
|
// Check event type
|
||||||
|
switch( e.type )
|
||||||
|
{
|
||||||
|
case JS_EVENT_AXIS:
|
||||||
|
_glfwJoy[ i ].Axis[ e.number ] = (float) e.value /
|
||||||
|
32767.0f;
|
||||||
|
// We need to change the sign for the Y axes, so that
|
||||||
|
// positive = up/forward, according to the GLFW spec.
|
||||||
|
if( e.number & 1 )
|
||||||
|
{
|
||||||
|
_glfwJoy[ i ].Axis[ e.number ] =
|
||||||
|
-_glfwJoy[ i ].Axis[ e.number ];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case JS_EVENT_BUTTON:
|
||||||
|
_glfwJoy[ i ].Button[ e.number ] =
|
||||||
|
e.value ? GLFW_PRESS : GLFW_RELEASE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // _GLFW_USE_LINUX_JOYSTICKS
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** Platform implementation functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwPlatformGetJoystickParam() - Determine joystick capabilities
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformGetJoystickParam( int joy, int param )
|
||||||
|
{
|
||||||
|
// Is joystick present?
|
||||||
|
if( !_glfwJoy[ joy ].Present )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch( param )
|
||||||
|
{
|
||||||
|
case GLFW_PRESENT:
|
||||||
|
return GL_TRUE;
|
||||||
|
|
||||||
|
case GLFW_AXES:
|
||||||
|
return _glfwJoy[ joy ].NumAxes;
|
||||||
|
|
||||||
|
case GLFW_BUTTONS:
|
||||||
|
return _glfwJoy[ joy ].NumButtons;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwPlatformGetJoystickPos() - Get joystick axis positions
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// Is joystick present?
|
||||||
|
if( !_glfwJoy[ joy ].Present )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update joystick state
|
||||||
|
pollJoystickEvents();
|
||||||
|
|
||||||
|
// Does the joystick support less axes than requested?
|
||||||
|
if( _glfwJoy[ joy ].NumAxes < numaxes )
|
||||||
|
{
|
||||||
|
numaxes = _glfwJoy[ joy ].NumAxes;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy axis positions from internal state
|
||||||
|
for( i = 0; i < numaxes; ++ i )
|
||||||
|
{
|
||||||
|
pos[ i ] = _glfwJoy[ joy ].Axis[ i ];
|
||||||
|
}
|
||||||
|
|
||||||
|
return numaxes;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwPlatformGetJoystickButtons() - Get joystick button states
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons,
|
||||||
|
int numbuttons )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// Is joystick present?
|
||||||
|
if( !_glfwJoy[ joy ].Present )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update joystick state
|
||||||
|
pollJoystickEvents();
|
||||||
|
|
||||||
|
// Does the joystick support less buttons than requested?
|
||||||
|
if( _glfwJoy[ joy ].NumButtons < numbuttons )
|
||||||
|
{
|
||||||
|
numbuttons = _glfwJoy[ joy ].NumButtons;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy button states from internal state
|
||||||
|
for( i = 0; i < numbuttons; ++ i )
|
||||||
|
{
|
||||||
|
buttons[ i ] = _glfwJoy[ joy ].Button[ i ];
|
||||||
|
}
|
||||||
|
|
||||||
|
return numbuttons;
|
||||||
|
}
|
||||||
|
|
901
lib/x11/x11_keysym2unicode.c
Normal file
901
lib/x11/x11_keysym2unicode.c
Normal file
|
@ -0,0 +1,901 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: X11/GLX
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Marcus: This code was originally written by Markus G. Kuhn.
|
||||||
|
* I have made some slight changes (trimmed it down a bit from >60 KB to
|
||||||
|
* 20 KB), but the functionality is the same.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This module converts keysym values into the corresponding ISO 10646
|
||||||
|
* (UCS, Unicode) values.
|
||||||
|
*
|
||||||
|
* The array keysymtab[] contains pairs of X11 keysym values for graphical
|
||||||
|
* characters and the corresponding Unicode value. The function
|
||||||
|
* _glfwKeySym2Unicode() maps a keysym onto a Unicode value using a binary
|
||||||
|
* search, therefore keysymtab[] must remain SORTED by keysym value.
|
||||||
|
*
|
||||||
|
* We allow to represent any UCS character in the range U-00000000 to
|
||||||
|
* U-00FFFFFF by a keysym value in the range 0x01000000 to 0x01ffffff.
|
||||||
|
* This admittedly does not cover the entire 31-bit space of UCS, but
|
||||||
|
* it does cover all of the characters up to U-10FFFF, which can be
|
||||||
|
* represented by UTF-16, and more, and it is very unlikely that higher
|
||||||
|
* UCS codes will ever be assigned by ISO. So to get Unicode character
|
||||||
|
* U+ABCD you can directly use keysym 0x0100abcd.
|
||||||
|
*
|
||||||
|
* Original author: Markus G. Kuhn <mkuhn@acm.org>, University of
|
||||||
|
* Cambridge, April 2001
|
||||||
|
*
|
||||||
|
* Special thanks to Richard Verhoeven <river@win.tue.nl> for preparing
|
||||||
|
* an initial draft of the mapping table.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** KeySym to Unicode mapping table ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
static struct codepair {
|
||||||
|
unsigned short keysym;
|
||||||
|
unsigned short ucs;
|
||||||
|
} keysymtab[] = {
|
||||||
|
{ 0x01a1, 0x0104 },
|
||||||
|
{ 0x01a2, 0x02d8 },
|
||||||
|
{ 0x01a3, 0x0141 },
|
||||||
|
{ 0x01a5, 0x013d },
|
||||||
|
{ 0x01a6, 0x015a },
|
||||||
|
{ 0x01a9, 0x0160 },
|
||||||
|
{ 0x01aa, 0x015e },
|
||||||
|
{ 0x01ab, 0x0164 },
|
||||||
|
{ 0x01ac, 0x0179 },
|
||||||
|
{ 0x01ae, 0x017d },
|
||||||
|
{ 0x01af, 0x017b },
|
||||||
|
{ 0x01b1, 0x0105 },
|
||||||
|
{ 0x01b2, 0x02db },
|
||||||
|
{ 0x01b3, 0x0142 },
|
||||||
|
{ 0x01b5, 0x013e },
|
||||||
|
{ 0x01b6, 0x015b },
|
||||||
|
{ 0x01b7, 0x02c7 },
|
||||||
|
{ 0x01b9, 0x0161 },
|
||||||
|
{ 0x01ba, 0x015f },
|
||||||
|
{ 0x01bb, 0x0165 },
|
||||||
|
{ 0x01bc, 0x017a },
|
||||||
|
{ 0x01bd, 0x02dd },
|
||||||
|
{ 0x01be, 0x017e },
|
||||||
|
{ 0x01bf, 0x017c },
|
||||||
|
{ 0x01c0, 0x0154 },
|
||||||
|
{ 0x01c3, 0x0102 },
|
||||||
|
{ 0x01c5, 0x0139 },
|
||||||
|
{ 0x01c6, 0x0106 },
|
||||||
|
{ 0x01c8, 0x010c },
|
||||||
|
{ 0x01ca, 0x0118 },
|
||||||
|
{ 0x01cc, 0x011a },
|
||||||
|
{ 0x01cf, 0x010e },
|
||||||
|
{ 0x01d0, 0x0110 },
|
||||||
|
{ 0x01d1, 0x0143 },
|
||||||
|
{ 0x01d2, 0x0147 },
|
||||||
|
{ 0x01d5, 0x0150 },
|
||||||
|
{ 0x01d8, 0x0158 },
|
||||||
|
{ 0x01d9, 0x016e },
|
||||||
|
{ 0x01db, 0x0170 },
|
||||||
|
{ 0x01de, 0x0162 },
|
||||||
|
{ 0x01e0, 0x0155 },
|
||||||
|
{ 0x01e3, 0x0103 },
|
||||||
|
{ 0x01e5, 0x013a },
|
||||||
|
{ 0x01e6, 0x0107 },
|
||||||
|
{ 0x01e8, 0x010d },
|
||||||
|
{ 0x01ea, 0x0119 },
|
||||||
|
{ 0x01ec, 0x011b },
|
||||||
|
{ 0x01ef, 0x010f },
|
||||||
|
{ 0x01f0, 0x0111 },
|
||||||
|
{ 0x01f1, 0x0144 },
|
||||||
|
{ 0x01f2, 0x0148 },
|
||||||
|
{ 0x01f5, 0x0151 },
|
||||||
|
{ 0x01f8, 0x0159 },
|
||||||
|
{ 0x01f9, 0x016f },
|
||||||
|
{ 0x01fb, 0x0171 },
|
||||||
|
{ 0x01fe, 0x0163 },
|
||||||
|
{ 0x01ff, 0x02d9 },
|
||||||
|
{ 0x02a1, 0x0126 },
|
||||||
|
{ 0x02a6, 0x0124 },
|
||||||
|
{ 0x02a9, 0x0130 },
|
||||||
|
{ 0x02ab, 0x011e },
|
||||||
|
{ 0x02ac, 0x0134 },
|
||||||
|
{ 0x02b1, 0x0127 },
|
||||||
|
{ 0x02b6, 0x0125 },
|
||||||
|
{ 0x02b9, 0x0131 },
|
||||||
|
{ 0x02bb, 0x011f },
|
||||||
|
{ 0x02bc, 0x0135 },
|
||||||
|
{ 0x02c5, 0x010a },
|
||||||
|
{ 0x02c6, 0x0108 },
|
||||||
|
{ 0x02d5, 0x0120 },
|
||||||
|
{ 0x02d8, 0x011c },
|
||||||
|
{ 0x02dd, 0x016c },
|
||||||
|
{ 0x02de, 0x015c },
|
||||||
|
{ 0x02e5, 0x010b },
|
||||||
|
{ 0x02e6, 0x0109 },
|
||||||
|
{ 0x02f5, 0x0121 },
|
||||||
|
{ 0x02f8, 0x011d },
|
||||||
|
{ 0x02fd, 0x016d },
|
||||||
|
{ 0x02fe, 0x015d },
|
||||||
|
{ 0x03a2, 0x0138 },
|
||||||
|
{ 0x03a3, 0x0156 },
|
||||||
|
{ 0x03a5, 0x0128 },
|
||||||
|
{ 0x03a6, 0x013b },
|
||||||
|
{ 0x03aa, 0x0112 },
|
||||||
|
{ 0x03ab, 0x0122 },
|
||||||
|
{ 0x03ac, 0x0166 },
|
||||||
|
{ 0x03b3, 0x0157 },
|
||||||
|
{ 0x03b5, 0x0129 },
|
||||||
|
{ 0x03b6, 0x013c },
|
||||||
|
{ 0x03ba, 0x0113 },
|
||||||
|
{ 0x03bb, 0x0123 },
|
||||||
|
{ 0x03bc, 0x0167 },
|
||||||
|
{ 0x03bd, 0x014a },
|
||||||
|
{ 0x03bf, 0x014b },
|
||||||
|
{ 0x03c0, 0x0100 },
|
||||||
|
{ 0x03c7, 0x012e },
|
||||||
|
{ 0x03cc, 0x0116 },
|
||||||
|
{ 0x03cf, 0x012a },
|
||||||
|
{ 0x03d1, 0x0145 },
|
||||||
|
{ 0x03d2, 0x014c },
|
||||||
|
{ 0x03d3, 0x0136 },
|
||||||
|
{ 0x03d9, 0x0172 },
|
||||||
|
{ 0x03dd, 0x0168 },
|
||||||
|
{ 0x03de, 0x016a },
|
||||||
|
{ 0x03e0, 0x0101 },
|
||||||
|
{ 0x03e7, 0x012f },
|
||||||
|
{ 0x03ec, 0x0117 },
|
||||||
|
{ 0x03ef, 0x012b },
|
||||||
|
{ 0x03f1, 0x0146 },
|
||||||
|
{ 0x03f2, 0x014d },
|
||||||
|
{ 0x03f3, 0x0137 },
|
||||||
|
{ 0x03f9, 0x0173 },
|
||||||
|
{ 0x03fd, 0x0169 },
|
||||||
|
{ 0x03fe, 0x016b },
|
||||||
|
{ 0x047e, 0x203e },
|
||||||
|
{ 0x04a1, 0x3002 },
|
||||||
|
{ 0x04a2, 0x300c },
|
||||||
|
{ 0x04a3, 0x300d },
|
||||||
|
{ 0x04a4, 0x3001 },
|
||||||
|
{ 0x04a5, 0x30fb },
|
||||||
|
{ 0x04a6, 0x30f2 },
|
||||||
|
{ 0x04a7, 0x30a1 },
|
||||||
|
{ 0x04a8, 0x30a3 },
|
||||||
|
{ 0x04a9, 0x30a5 },
|
||||||
|
{ 0x04aa, 0x30a7 },
|
||||||
|
{ 0x04ab, 0x30a9 },
|
||||||
|
{ 0x04ac, 0x30e3 },
|
||||||
|
{ 0x04ad, 0x30e5 },
|
||||||
|
{ 0x04ae, 0x30e7 },
|
||||||
|
{ 0x04af, 0x30c3 },
|
||||||
|
{ 0x04b0, 0x30fc },
|
||||||
|
{ 0x04b1, 0x30a2 },
|
||||||
|
{ 0x04b2, 0x30a4 },
|
||||||
|
{ 0x04b3, 0x30a6 },
|
||||||
|
{ 0x04b4, 0x30a8 },
|
||||||
|
{ 0x04b5, 0x30aa },
|
||||||
|
{ 0x04b6, 0x30ab },
|
||||||
|
{ 0x04b7, 0x30ad },
|
||||||
|
{ 0x04b8, 0x30af },
|
||||||
|
{ 0x04b9, 0x30b1 },
|
||||||
|
{ 0x04ba, 0x30b3 },
|
||||||
|
{ 0x04bb, 0x30b5 },
|
||||||
|
{ 0x04bc, 0x30b7 },
|
||||||
|
{ 0x04bd, 0x30b9 },
|
||||||
|
{ 0x04be, 0x30bb },
|
||||||
|
{ 0x04bf, 0x30bd },
|
||||||
|
{ 0x04c0, 0x30bf },
|
||||||
|
{ 0x04c1, 0x30c1 },
|
||||||
|
{ 0x04c2, 0x30c4 },
|
||||||
|
{ 0x04c3, 0x30c6 },
|
||||||
|
{ 0x04c4, 0x30c8 },
|
||||||
|
{ 0x04c5, 0x30ca },
|
||||||
|
{ 0x04c6, 0x30cb },
|
||||||
|
{ 0x04c7, 0x30cc },
|
||||||
|
{ 0x04c8, 0x30cd },
|
||||||
|
{ 0x04c9, 0x30ce },
|
||||||
|
{ 0x04ca, 0x30cf },
|
||||||
|
{ 0x04cb, 0x30d2 },
|
||||||
|
{ 0x04cc, 0x30d5 },
|
||||||
|
{ 0x04cd, 0x30d8 },
|
||||||
|
{ 0x04ce, 0x30db },
|
||||||
|
{ 0x04cf, 0x30de },
|
||||||
|
{ 0x04d0, 0x30df },
|
||||||
|
{ 0x04d1, 0x30e0 },
|
||||||
|
{ 0x04d2, 0x30e1 },
|
||||||
|
{ 0x04d3, 0x30e2 },
|
||||||
|
{ 0x04d4, 0x30e4 },
|
||||||
|
{ 0x04d5, 0x30e6 },
|
||||||
|
{ 0x04d6, 0x30e8 },
|
||||||
|
{ 0x04d7, 0x30e9 },
|
||||||
|
{ 0x04d8, 0x30ea },
|
||||||
|
{ 0x04d9, 0x30eb },
|
||||||
|
{ 0x04da, 0x30ec },
|
||||||
|
{ 0x04db, 0x30ed },
|
||||||
|
{ 0x04dc, 0x30ef },
|
||||||
|
{ 0x04dd, 0x30f3 },
|
||||||
|
{ 0x04de, 0x309b },
|
||||||
|
{ 0x04df, 0x309c },
|
||||||
|
{ 0x05ac, 0x060c },
|
||||||
|
{ 0x05bb, 0x061b },
|
||||||
|
{ 0x05bf, 0x061f },
|
||||||
|
{ 0x05c1, 0x0621 },
|
||||||
|
{ 0x05c2, 0x0622 },
|
||||||
|
{ 0x05c3, 0x0623 },
|
||||||
|
{ 0x05c4, 0x0624 },
|
||||||
|
{ 0x05c5, 0x0625 },
|
||||||
|
{ 0x05c6, 0x0626 },
|
||||||
|
{ 0x05c7, 0x0627 },
|
||||||
|
{ 0x05c8, 0x0628 },
|
||||||
|
{ 0x05c9, 0x0629 },
|
||||||
|
{ 0x05ca, 0x062a },
|
||||||
|
{ 0x05cb, 0x062b },
|
||||||
|
{ 0x05cc, 0x062c },
|
||||||
|
{ 0x05cd, 0x062d },
|
||||||
|
{ 0x05ce, 0x062e },
|
||||||
|
{ 0x05cf, 0x062f },
|
||||||
|
{ 0x05d0, 0x0630 },
|
||||||
|
{ 0x05d1, 0x0631 },
|
||||||
|
{ 0x05d2, 0x0632 },
|
||||||
|
{ 0x05d3, 0x0633 },
|
||||||
|
{ 0x05d4, 0x0634 },
|
||||||
|
{ 0x05d5, 0x0635 },
|
||||||
|
{ 0x05d6, 0x0636 },
|
||||||
|
{ 0x05d7, 0x0637 },
|
||||||
|
{ 0x05d8, 0x0638 },
|
||||||
|
{ 0x05d9, 0x0639 },
|
||||||
|
{ 0x05da, 0x063a },
|
||||||
|
{ 0x05e0, 0x0640 },
|
||||||
|
{ 0x05e1, 0x0641 },
|
||||||
|
{ 0x05e2, 0x0642 },
|
||||||
|
{ 0x05e3, 0x0643 },
|
||||||
|
{ 0x05e4, 0x0644 },
|
||||||
|
{ 0x05e5, 0x0645 },
|
||||||
|
{ 0x05e6, 0x0646 },
|
||||||
|
{ 0x05e7, 0x0647 },
|
||||||
|
{ 0x05e8, 0x0648 },
|
||||||
|
{ 0x05e9, 0x0649 },
|
||||||
|
{ 0x05ea, 0x064a },
|
||||||
|
{ 0x05eb, 0x064b },
|
||||||
|
{ 0x05ec, 0x064c },
|
||||||
|
{ 0x05ed, 0x064d },
|
||||||
|
{ 0x05ee, 0x064e },
|
||||||
|
{ 0x05ef, 0x064f },
|
||||||
|
{ 0x05f0, 0x0650 },
|
||||||
|
{ 0x05f1, 0x0651 },
|
||||||
|
{ 0x05f2, 0x0652 },
|
||||||
|
{ 0x06a1, 0x0452 },
|
||||||
|
{ 0x06a2, 0x0453 },
|
||||||
|
{ 0x06a3, 0x0451 },
|
||||||
|
{ 0x06a4, 0x0454 },
|
||||||
|
{ 0x06a5, 0x0455 },
|
||||||
|
{ 0x06a6, 0x0456 },
|
||||||
|
{ 0x06a7, 0x0457 },
|
||||||
|
{ 0x06a8, 0x0458 },
|
||||||
|
{ 0x06a9, 0x0459 },
|
||||||
|
{ 0x06aa, 0x045a },
|
||||||
|
{ 0x06ab, 0x045b },
|
||||||
|
{ 0x06ac, 0x045c },
|
||||||
|
{ 0x06ae, 0x045e },
|
||||||
|
{ 0x06af, 0x045f },
|
||||||
|
{ 0x06b0, 0x2116 },
|
||||||
|
{ 0x06b1, 0x0402 },
|
||||||
|
{ 0x06b2, 0x0403 },
|
||||||
|
{ 0x06b3, 0x0401 },
|
||||||
|
{ 0x06b4, 0x0404 },
|
||||||
|
{ 0x06b5, 0x0405 },
|
||||||
|
{ 0x06b6, 0x0406 },
|
||||||
|
{ 0x06b7, 0x0407 },
|
||||||
|
{ 0x06b8, 0x0408 },
|
||||||
|
{ 0x06b9, 0x0409 },
|
||||||
|
{ 0x06ba, 0x040a },
|
||||||
|
{ 0x06bb, 0x040b },
|
||||||
|
{ 0x06bc, 0x040c },
|
||||||
|
{ 0x06be, 0x040e },
|
||||||
|
{ 0x06bf, 0x040f },
|
||||||
|
{ 0x06c0, 0x044e },
|
||||||
|
{ 0x06c1, 0x0430 },
|
||||||
|
{ 0x06c2, 0x0431 },
|
||||||
|
{ 0x06c3, 0x0446 },
|
||||||
|
{ 0x06c4, 0x0434 },
|
||||||
|
{ 0x06c5, 0x0435 },
|
||||||
|
{ 0x06c6, 0x0444 },
|
||||||
|
{ 0x06c7, 0x0433 },
|
||||||
|
{ 0x06c8, 0x0445 },
|
||||||
|
{ 0x06c9, 0x0438 },
|
||||||
|
{ 0x06ca, 0x0439 },
|
||||||
|
{ 0x06cb, 0x043a },
|
||||||
|
{ 0x06cc, 0x043b },
|
||||||
|
{ 0x06cd, 0x043c },
|
||||||
|
{ 0x06ce, 0x043d },
|
||||||
|
{ 0x06cf, 0x043e },
|
||||||
|
{ 0x06d0, 0x043f },
|
||||||
|
{ 0x06d1, 0x044f },
|
||||||
|
{ 0x06d2, 0x0440 },
|
||||||
|
{ 0x06d3, 0x0441 },
|
||||||
|
{ 0x06d4, 0x0442 },
|
||||||
|
{ 0x06d5, 0x0443 },
|
||||||
|
{ 0x06d6, 0x0436 },
|
||||||
|
{ 0x06d7, 0x0432 },
|
||||||
|
{ 0x06d8, 0x044c },
|
||||||
|
{ 0x06d9, 0x044b },
|
||||||
|
{ 0x06da, 0x0437 },
|
||||||
|
{ 0x06db, 0x0448 },
|
||||||
|
{ 0x06dc, 0x044d },
|
||||||
|
{ 0x06dd, 0x0449 },
|
||||||
|
{ 0x06de, 0x0447 },
|
||||||
|
{ 0x06df, 0x044a },
|
||||||
|
{ 0x06e0, 0x042e },
|
||||||
|
{ 0x06e1, 0x0410 },
|
||||||
|
{ 0x06e2, 0x0411 },
|
||||||
|
{ 0x06e3, 0x0426 },
|
||||||
|
{ 0x06e4, 0x0414 },
|
||||||
|
{ 0x06e5, 0x0415 },
|
||||||
|
{ 0x06e6, 0x0424 },
|
||||||
|
{ 0x06e7, 0x0413 },
|
||||||
|
{ 0x06e8, 0x0425 },
|
||||||
|
{ 0x06e9, 0x0418 },
|
||||||
|
{ 0x06ea, 0x0419 },
|
||||||
|
{ 0x06eb, 0x041a },
|
||||||
|
{ 0x06ec, 0x041b },
|
||||||
|
{ 0x06ed, 0x041c },
|
||||||
|
{ 0x06ee, 0x041d },
|
||||||
|
{ 0x06ef, 0x041e },
|
||||||
|
{ 0x06f0, 0x041f },
|
||||||
|
{ 0x06f1, 0x042f },
|
||||||
|
{ 0x06f2, 0x0420 },
|
||||||
|
{ 0x06f3, 0x0421 },
|
||||||
|
{ 0x06f4, 0x0422 },
|
||||||
|
{ 0x06f5, 0x0423 },
|
||||||
|
{ 0x06f6, 0x0416 },
|
||||||
|
{ 0x06f7, 0x0412 },
|
||||||
|
{ 0x06f8, 0x042c },
|
||||||
|
{ 0x06f9, 0x042b },
|
||||||
|
{ 0x06fa, 0x0417 },
|
||||||
|
{ 0x06fb, 0x0428 },
|
||||||
|
{ 0x06fc, 0x042d },
|
||||||
|
{ 0x06fd, 0x0429 },
|
||||||
|
{ 0x06fe, 0x0427 },
|
||||||
|
{ 0x06ff, 0x042a },
|
||||||
|
{ 0x07a1, 0x0386 },
|
||||||
|
{ 0x07a2, 0x0388 },
|
||||||
|
{ 0x07a3, 0x0389 },
|
||||||
|
{ 0x07a4, 0x038a },
|
||||||
|
{ 0x07a5, 0x03aa },
|
||||||
|
{ 0x07a7, 0x038c },
|
||||||
|
{ 0x07a8, 0x038e },
|
||||||
|
{ 0x07a9, 0x03ab },
|
||||||
|
{ 0x07ab, 0x038f },
|
||||||
|
{ 0x07ae, 0x0385 },
|
||||||
|
{ 0x07af, 0x2015 },
|
||||||
|
{ 0x07b1, 0x03ac },
|
||||||
|
{ 0x07b2, 0x03ad },
|
||||||
|
{ 0x07b3, 0x03ae },
|
||||||
|
{ 0x07b4, 0x03af },
|
||||||
|
{ 0x07b5, 0x03ca },
|
||||||
|
{ 0x07b6, 0x0390 },
|
||||||
|
{ 0x07b7, 0x03cc },
|
||||||
|
{ 0x07b8, 0x03cd },
|
||||||
|
{ 0x07b9, 0x03cb },
|
||||||
|
{ 0x07ba, 0x03b0 },
|
||||||
|
{ 0x07bb, 0x03ce },
|
||||||
|
{ 0x07c1, 0x0391 },
|
||||||
|
{ 0x07c2, 0x0392 },
|
||||||
|
{ 0x07c3, 0x0393 },
|
||||||
|
{ 0x07c4, 0x0394 },
|
||||||
|
{ 0x07c5, 0x0395 },
|
||||||
|
{ 0x07c6, 0x0396 },
|
||||||
|
{ 0x07c7, 0x0397 },
|
||||||
|
{ 0x07c8, 0x0398 },
|
||||||
|
{ 0x07c9, 0x0399 },
|
||||||
|
{ 0x07ca, 0x039a },
|
||||||
|
{ 0x07cb, 0x039b },
|
||||||
|
{ 0x07cc, 0x039c },
|
||||||
|
{ 0x07cd, 0x039d },
|
||||||
|
{ 0x07ce, 0x039e },
|
||||||
|
{ 0x07cf, 0x039f },
|
||||||
|
{ 0x07d0, 0x03a0 },
|
||||||
|
{ 0x07d1, 0x03a1 },
|
||||||
|
{ 0x07d2, 0x03a3 },
|
||||||
|
{ 0x07d4, 0x03a4 },
|
||||||
|
{ 0x07d5, 0x03a5 },
|
||||||
|
{ 0x07d6, 0x03a6 },
|
||||||
|
{ 0x07d7, 0x03a7 },
|
||||||
|
{ 0x07d8, 0x03a8 },
|
||||||
|
{ 0x07d9, 0x03a9 },
|
||||||
|
{ 0x07e1, 0x03b1 },
|
||||||
|
{ 0x07e2, 0x03b2 },
|
||||||
|
{ 0x07e3, 0x03b3 },
|
||||||
|
{ 0x07e4, 0x03b4 },
|
||||||
|
{ 0x07e5, 0x03b5 },
|
||||||
|
{ 0x07e6, 0x03b6 },
|
||||||
|
{ 0x07e7, 0x03b7 },
|
||||||
|
{ 0x07e8, 0x03b8 },
|
||||||
|
{ 0x07e9, 0x03b9 },
|
||||||
|
{ 0x07ea, 0x03ba },
|
||||||
|
{ 0x07eb, 0x03bb },
|
||||||
|
{ 0x07ec, 0x03bc },
|
||||||
|
{ 0x07ed, 0x03bd },
|
||||||
|
{ 0x07ee, 0x03be },
|
||||||
|
{ 0x07ef, 0x03bf },
|
||||||
|
{ 0x07f0, 0x03c0 },
|
||||||
|
{ 0x07f1, 0x03c1 },
|
||||||
|
{ 0x07f2, 0x03c3 },
|
||||||
|
{ 0x07f3, 0x03c2 },
|
||||||
|
{ 0x07f4, 0x03c4 },
|
||||||
|
{ 0x07f5, 0x03c5 },
|
||||||
|
{ 0x07f6, 0x03c6 },
|
||||||
|
{ 0x07f7, 0x03c7 },
|
||||||
|
{ 0x07f8, 0x03c8 },
|
||||||
|
{ 0x07f9, 0x03c9 },
|
||||||
|
{ 0x08a1, 0x23b7 },
|
||||||
|
{ 0x08a2, 0x250c },
|
||||||
|
{ 0x08a3, 0x2500 },
|
||||||
|
{ 0x08a4, 0x2320 },
|
||||||
|
{ 0x08a5, 0x2321 },
|
||||||
|
{ 0x08a6, 0x2502 },
|
||||||
|
{ 0x08a7, 0x23a1 },
|
||||||
|
{ 0x08a8, 0x23a3 },
|
||||||
|
{ 0x08a9, 0x23a4 },
|
||||||
|
{ 0x08aa, 0x23a6 },
|
||||||
|
{ 0x08ab, 0x239b },
|
||||||
|
{ 0x08ac, 0x239d },
|
||||||
|
{ 0x08ad, 0x239e },
|
||||||
|
{ 0x08ae, 0x23a0 },
|
||||||
|
{ 0x08af, 0x23a8 },
|
||||||
|
{ 0x08b0, 0x23ac },
|
||||||
|
{ 0x08bc, 0x2264 },
|
||||||
|
{ 0x08bd, 0x2260 },
|
||||||
|
{ 0x08be, 0x2265 },
|
||||||
|
{ 0x08bf, 0x222b },
|
||||||
|
{ 0x08c0, 0x2234 },
|
||||||
|
{ 0x08c1, 0x221d },
|
||||||
|
{ 0x08c2, 0x221e },
|
||||||
|
{ 0x08c5, 0x2207 },
|
||||||
|
{ 0x08c8, 0x223c },
|
||||||
|
{ 0x08c9, 0x2243 },
|
||||||
|
{ 0x08cd, 0x21d4 },
|
||||||
|
{ 0x08ce, 0x21d2 },
|
||||||
|
{ 0x08cf, 0x2261 },
|
||||||
|
{ 0x08d6, 0x221a },
|
||||||
|
{ 0x08da, 0x2282 },
|
||||||
|
{ 0x08db, 0x2283 },
|
||||||
|
{ 0x08dc, 0x2229 },
|
||||||
|
{ 0x08dd, 0x222a },
|
||||||
|
{ 0x08de, 0x2227 },
|
||||||
|
{ 0x08df, 0x2228 },
|
||||||
|
{ 0x08ef, 0x2202 },
|
||||||
|
{ 0x08f6, 0x0192 },
|
||||||
|
{ 0x08fb, 0x2190 },
|
||||||
|
{ 0x08fc, 0x2191 },
|
||||||
|
{ 0x08fd, 0x2192 },
|
||||||
|
{ 0x08fe, 0x2193 },
|
||||||
|
{ 0x09e0, 0x25c6 },
|
||||||
|
{ 0x09e1, 0x2592 },
|
||||||
|
{ 0x09e2, 0x2409 },
|
||||||
|
{ 0x09e3, 0x240c },
|
||||||
|
{ 0x09e4, 0x240d },
|
||||||
|
{ 0x09e5, 0x240a },
|
||||||
|
{ 0x09e8, 0x2424 },
|
||||||
|
{ 0x09e9, 0x240b },
|
||||||
|
{ 0x09ea, 0x2518 },
|
||||||
|
{ 0x09eb, 0x2510 },
|
||||||
|
{ 0x09ec, 0x250c },
|
||||||
|
{ 0x09ed, 0x2514 },
|
||||||
|
{ 0x09ee, 0x253c },
|
||||||
|
{ 0x09ef, 0x23ba },
|
||||||
|
{ 0x09f0, 0x23bb },
|
||||||
|
{ 0x09f1, 0x2500 },
|
||||||
|
{ 0x09f2, 0x23bc },
|
||||||
|
{ 0x09f3, 0x23bd },
|
||||||
|
{ 0x09f4, 0x251c },
|
||||||
|
{ 0x09f5, 0x2524 },
|
||||||
|
{ 0x09f6, 0x2534 },
|
||||||
|
{ 0x09f7, 0x252c },
|
||||||
|
{ 0x09f8, 0x2502 },
|
||||||
|
{ 0x0aa1, 0x2003 },
|
||||||
|
{ 0x0aa2, 0x2002 },
|
||||||
|
{ 0x0aa3, 0x2004 },
|
||||||
|
{ 0x0aa4, 0x2005 },
|
||||||
|
{ 0x0aa5, 0x2007 },
|
||||||
|
{ 0x0aa6, 0x2008 },
|
||||||
|
{ 0x0aa7, 0x2009 },
|
||||||
|
{ 0x0aa8, 0x200a },
|
||||||
|
{ 0x0aa9, 0x2014 },
|
||||||
|
{ 0x0aaa, 0x2013 },
|
||||||
|
{ 0x0aae, 0x2026 },
|
||||||
|
{ 0x0aaf, 0x2025 },
|
||||||
|
{ 0x0ab0, 0x2153 },
|
||||||
|
{ 0x0ab1, 0x2154 },
|
||||||
|
{ 0x0ab2, 0x2155 },
|
||||||
|
{ 0x0ab3, 0x2156 },
|
||||||
|
{ 0x0ab4, 0x2157 },
|
||||||
|
{ 0x0ab5, 0x2158 },
|
||||||
|
{ 0x0ab6, 0x2159 },
|
||||||
|
{ 0x0ab7, 0x215a },
|
||||||
|
{ 0x0ab8, 0x2105 },
|
||||||
|
{ 0x0abb, 0x2012 },
|
||||||
|
{ 0x0abc, 0x2329 },
|
||||||
|
{ 0x0abe, 0x232a },
|
||||||
|
{ 0x0ac3, 0x215b },
|
||||||
|
{ 0x0ac4, 0x215c },
|
||||||
|
{ 0x0ac5, 0x215d },
|
||||||
|
{ 0x0ac6, 0x215e },
|
||||||
|
{ 0x0ac9, 0x2122 },
|
||||||
|
{ 0x0aca, 0x2613 },
|
||||||
|
{ 0x0acc, 0x25c1 },
|
||||||
|
{ 0x0acd, 0x25b7 },
|
||||||
|
{ 0x0ace, 0x25cb },
|
||||||
|
{ 0x0acf, 0x25af },
|
||||||
|
{ 0x0ad0, 0x2018 },
|
||||||
|
{ 0x0ad1, 0x2019 },
|
||||||
|
{ 0x0ad2, 0x201c },
|
||||||
|
{ 0x0ad3, 0x201d },
|
||||||
|
{ 0x0ad4, 0x211e },
|
||||||
|
{ 0x0ad6, 0x2032 },
|
||||||
|
{ 0x0ad7, 0x2033 },
|
||||||
|
{ 0x0ad9, 0x271d },
|
||||||
|
{ 0x0adb, 0x25ac },
|
||||||
|
{ 0x0adc, 0x25c0 },
|
||||||
|
{ 0x0add, 0x25b6 },
|
||||||
|
{ 0x0ade, 0x25cf },
|
||||||
|
{ 0x0adf, 0x25ae },
|
||||||
|
{ 0x0ae0, 0x25e6 },
|
||||||
|
{ 0x0ae1, 0x25ab },
|
||||||
|
{ 0x0ae2, 0x25ad },
|
||||||
|
{ 0x0ae3, 0x25b3 },
|
||||||
|
{ 0x0ae4, 0x25bd },
|
||||||
|
{ 0x0ae5, 0x2606 },
|
||||||
|
{ 0x0ae6, 0x2022 },
|
||||||
|
{ 0x0ae7, 0x25aa },
|
||||||
|
{ 0x0ae8, 0x25b2 },
|
||||||
|
{ 0x0ae9, 0x25bc },
|
||||||
|
{ 0x0aea, 0x261c },
|
||||||
|
{ 0x0aeb, 0x261e },
|
||||||
|
{ 0x0aec, 0x2663 },
|
||||||
|
{ 0x0aed, 0x2666 },
|
||||||
|
{ 0x0aee, 0x2665 },
|
||||||
|
{ 0x0af0, 0x2720 },
|
||||||
|
{ 0x0af1, 0x2020 },
|
||||||
|
{ 0x0af2, 0x2021 },
|
||||||
|
{ 0x0af3, 0x2713 },
|
||||||
|
{ 0x0af4, 0x2717 },
|
||||||
|
{ 0x0af5, 0x266f },
|
||||||
|
{ 0x0af6, 0x266d },
|
||||||
|
{ 0x0af7, 0x2642 },
|
||||||
|
{ 0x0af8, 0x2640 },
|
||||||
|
{ 0x0af9, 0x260e },
|
||||||
|
{ 0x0afa, 0x2315 },
|
||||||
|
{ 0x0afb, 0x2117 },
|
||||||
|
{ 0x0afc, 0x2038 },
|
||||||
|
{ 0x0afd, 0x201a },
|
||||||
|
{ 0x0afe, 0x201e },
|
||||||
|
{ 0x0ba3, 0x003c },
|
||||||
|
{ 0x0ba6, 0x003e },
|
||||||
|
{ 0x0ba8, 0x2228 },
|
||||||
|
{ 0x0ba9, 0x2227 },
|
||||||
|
{ 0x0bc0, 0x00af },
|
||||||
|
{ 0x0bc2, 0x22a5 },
|
||||||
|
{ 0x0bc3, 0x2229 },
|
||||||
|
{ 0x0bc4, 0x230a },
|
||||||
|
{ 0x0bc6, 0x005f },
|
||||||
|
{ 0x0bca, 0x2218 },
|
||||||
|
{ 0x0bcc, 0x2395 },
|
||||||
|
{ 0x0bce, 0x22a4 },
|
||||||
|
{ 0x0bcf, 0x25cb },
|
||||||
|
{ 0x0bd3, 0x2308 },
|
||||||
|
{ 0x0bd6, 0x222a },
|
||||||
|
{ 0x0bd8, 0x2283 },
|
||||||
|
{ 0x0bda, 0x2282 },
|
||||||
|
{ 0x0bdc, 0x22a2 },
|
||||||
|
{ 0x0bfc, 0x22a3 },
|
||||||
|
{ 0x0cdf, 0x2017 },
|
||||||
|
{ 0x0ce0, 0x05d0 },
|
||||||
|
{ 0x0ce1, 0x05d1 },
|
||||||
|
{ 0x0ce2, 0x05d2 },
|
||||||
|
{ 0x0ce3, 0x05d3 },
|
||||||
|
{ 0x0ce4, 0x05d4 },
|
||||||
|
{ 0x0ce5, 0x05d5 },
|
||||||
|
{ 0x0ce6, 0x05d6 },
|
||||||
|
{ 0x0ce7, 0x05d7 },
|
||||||
|
{ 0x0ce8, 0x05d8 },
|
||||||
|
{ 0x0ce9, 0x05d9 },
|
||||||
|
{ 0x0cea, 0x05da },
|
||||||
|
{ 0x0ceb, 0x05db },
|
||||||
|
{ 0x0cec, 0x05dc },
|
||||||
|
{ 0x0ced, 0x05dd },
|
||||||
|
{ 0x0cee, 0x05de },
|
||||||
|
{ 0x0cef, 0x05df },
|
||||||
|
{ 0x0cf0, 0x05e0 },
|
||||||
|
{ 0x0cf1, 0x05e1 },
|
||||||
|
{ 0x0cf2, 0x05e2 },
|
||||||
|
{ 0x0cf3, 0x05e3 },
|
||||||
|
{ 0x0cf4, 0x05e4 },
|
||||||
|
{ 0x0cf5, 0x05e5 },
|
||||||
|
{ 0x0cf6, 0x05e6 },
|
||||||
|
{ 0x0cf7, 0x05e7 },
|
||||||
|
{ 0x0cf8, 0x05e8 },
|
||||||
|
{ 0x0cf9, 0x05e9 },
|
||||||
|
{ 0x0cfa, 0x05ea },
|
||||||
|
{ 0x0da1, 0x0e01 },
|
||||||
|
{ 0x0da2, 0x0e02 },
|
||||||
|
{ 0x0da3, 0x0e03 },
|
||||||
|
{ 0x0da4, 0x0e04 },
|
||||||
|
{ 0x0da5, 0x0e05 },
|
||||||
|
{ 0x0da6, 0x0e06 },
|
||||||
|
{ 0x0da7, 0x0e07 },
|
||||||
|
{ 0x0da8, 0x0e08 },
|
||||||
|
{ 0x0da9, 0x0e09 },
|
||||||
|
{ 0x0daa, 0x0e0a },
|
||||||
|
{ 0x0dab, 0x0e0b },
|
||||||
|
{ 0x0dac, 0x0e0c },
|
||||||
|
{ 0x0dad, 0x0e0d },
|
||||||
|
{ 0x0dae, 0x0e0e },
|
||||||
|
{ 0x0daf, 0x0e0f },
|
||||||
|
{ 0x0db0, 0x0e10 },
|
||||||
|
{ 0x0db1, 0x0e11 },
|
||||||
|
{ 0x0db2, 0x0e12 },
|
||||||
|
{ 0x0db3, 0x0e13 },
|
||||||
|
{ 0x0db4, 0x0e14 },
|
||||||
|
{ 0x0db5, 0x0e15 },
|
||||||
|
{ 0x0db6, 0x0e16 },
|
||||||
|
{ 0x0db7, 0x0e17 },
|
||||||
|
{ 0x0db8, 0x0e18 },
|
||||||
|
{ 0x0db9, 0x0e19 },
|
||||||
|
{ 0x0dba, 0x0e1a },
|
||||||
|
{ 0x0dbb, 0x0e1b },
|
||||||
|
{ 0x0dbc, 0x0e1c },
|
||||||
|
{ 0x0dbd, 0x0e1d },
|
||||||
|
{ 0x0dbe, 0x0e1e },
|
||||||
|
{ 0x0dbf, 0x0e1f },
|
||||||
|
{ 0x0dc0, 0x0e20 },
|
||||||
|
{ 0x0dc1, 0x0e21 },
|
||||||
|
{ 0x0dc2, 0x0e22 },
|
||||||
|
{ 0x0dc3, 0x0e23 },
|
||||||
|
{ 0x0dc4, 0x0e24 },
|
||||||
|
{ 0x0dc5, 0x0e25 },
|
||||||
|
{ 0x0dc6, 0x0e26 },
|
||||||
|
{ 0x0dc7, 0x0e27 },
|
||||||
|
{ 0x0dc8, 0x0e28 },
|
||||||
|
{ 0x0dc9, 0x0e29 },
|
||||||
|
{ 0x0dca, 0x0e2a },
|
||||||
|
{ 0x0dcb, 0x0e2b },
|
||||||
|
{ 0x0dcc, 0x0e2c },
|
||||||
|
{ 0x0dcd, 0x0e2d },
|
||||||
|
{ 0x0dce, 0x0e2e },
|
||||||
|
{ 0x0dcf, 0x0e2f },
|
||||||
|
{ 0x0dd0, 0x0e30 },
|
||||||
|
{ 0x0dd1, 0x0e31 },
|
||||||
|
{ 0x0dd2, 0x0e32 },
|
||||||
|
{ 0x0dd3, 0x0e33 },
|
||||||
|
{ 0x0dd4, 0x0e34 },
|
||||||
|
{ 0x0dd5, 0x0e35 },
|
||||||
|
{ 0x0dd6, 0x0e36 },
|
||||||
|
{ 0x0dd7, 0x0e37 },
|
||||||
|
{ 0x0dd8, 0x0e38 },
|
||||||
|
{ 0x0dd9, 0x0e39 },
|
||||||
|
{ 0x0dda, 0x0e3a },
|
||||||
|
{ 0x0ddf, 0x0e3f },
|
||||||
|
{ 0x0de0, 0x0e40 },
|
||||||
|
{ 0x0de1, 0x0e41 },
|
||||||
|
{ 0x0de2, 0x0e42 },
|
||||||
|
{ 0x0de3, 0x0e43 },
|
||||||
|
{ 0x0de4, 0x0e44 },
|
||||||
|
{ 0x0de5, 0x0e45 },
|
||||||
|
{ 0x0de6, 0x0e46 },
|
||||||
|
{ 0x0de7, 0x0e47 },
|
||||||
|
{ 0x0de8, 0x0e48 },
|
||||||
|
{ 0x0de9, 0x0e49 },
|
||||||
|
{ 0x0dea, 0x0e4a },
|
||||||
|
{ 0x0deb, 0x0e4b },
|
||||||
|
{ 0x0dec, 0x0e4c },
|
||||||
|
{ 0x0ded, 0x0e4d },
|
||||||
|
{ 0x0df0, 0x0e50 },
|
||||||
|
{ 0x0df1, 0x0e51 },
|
||||||
|
{ 0x0df2, 0x0e52 },
|
||||||
|
{ 0x0df3, 0x0e53 },
|
||||||
|
{ 0x0df4, 0x0e54 },
|
||||||
|
{ 0x0df5, 0x0e55 },
|
||||||
|
{ 0x0df6, 0x0e56 },
|
||||||
|
{ 0x0df7, 0x0e57 },
|
||||||
|
{ 0x0df8, 0x0e58 },
|
||||||
|
{ 0x0df9, 0x0e59 },
|
||||||
|
{ 0x0ea1, 0x3131 },
|
||||||
|
{ 0x0ea2, 0x3132 },
|
||||||
|
{ 0x0ea3, 0x3133 },
|
||||||
|
{ 0x0ea4, 0x3134 },
|
||||||
|
{ 0x0ea5, 0x3135 },
|
||||||
|
{ 0x0ea6, 0x3136 },
|
||||||
|
{ 0x0ea7, 0x3137 },
|
||||||
|
{ 0x0ea8, 0x3138 },
|
||||||
|
{ 0x0ea9, 0x3139 },
|
||||||
|
{ 0x0eaa, 0x313a },
|
||||||
|
{ 0x0eab, 0x313b },
|
||||||
|
{ 0x0eac, 0x313c },
|
||||||
|
{ 0x0ead, 0x313d },
|
||||||
|
{ 0x0eae, 0x313e },
|
||||||
|
{ 0x0eaf, 0x313f },
|
||||||
|
{ 0x0eb0, 0x3140 },
|
||||||
|
{ 0x0eb1, 0x3141 },
|
||||||
|
{ 0x0eb2, 0x3142 },
|
||||||
|
{ 0x0eb3, 0x3143 },
|
||||||
|
{ 0x0eb4, 0x3144 },
|
||||||
|
{ 0x0eb5, 0x3145 },
|
||||||
|
{ 0x0eb6, 0x3146 },
|
||||||
|
{ 0x0eb7, 0x3147 },
|
||||||
|
{ 0x0eb8, 0x3148 },
|
||||||
|
{ 0x0eb9, 0x3149 },
|
||||||
|
{ 0x0eba, 0x314a },
|
||||||
|
{ 0x0ebb, 0x314b },
|
||||||
|
{ 0x0ebc, 0x314c },
|
||||||
|
{ 0x0ebd, 0x314d },
|
||||||
|
{ 0x0ebe, 0x314e },
|
||||||
|
{ 0x0ebf, 0x314f },
|
||||||
|
{ 0x0ec0, 0x3150 },
|
||||||
|
{ 0x0ec1, 0x3151 },
|
||||||
|
{ 0x0ec2, 0x3152 },
|
||||||
|
{ 0x0ec3, 0x3153 },
|
||||||
|
{ 0x0ec4, 0x3154 },
|
||||||
|
{ 0x0ec5, 0x3155 },
|
||||||
|
{ 0x0ec6, 0x3156 },
|
||||||
|
{ 0x0ec7, 0x3157 },
|
||||||
|
{ 0x0ec8, 0x3158 },
|
||||||
|
{ 0x0ec9, 0x3159 },
|
||||||
|
{ 0x0eca, 0x315a },
|
||||||
|
{ 0x0ecb, 0x315b },
|
||||||
|
{ 0x0ecc, 0x315c },
|
||||||
|
{ 0x0ecd, 0x315d },
|
||||||
|
{ 0x0ece, 0x315e },
|
||||||
|
{ 0x0ecf, 0x315f },
|
||||||
|
{ 0x0ed0, 0x3160 },
|
||||||
|
{ 0x0ed1, 0x3161 },
|
||||||
|
{ 0x0ed2, 0x3162 },
|
||||||
|
{ 0x0ed3, 0x3163 },
|
||||||
|
{ 0x0ed4, 0x11a8 },
|
||||||
|
{ 0x0ed5, 0x11a9 },
|
||||||
|
{ 0x0ed6, 0x11aa },
|
||||||
|
{ 0x0ed7, 0x11ab },
|
||||||
|
{ 0x0ed8, 0x11ac },
|
||||||
|
{ 0x0ed9, 0x11ad },
|
||||||
|
{ 0x0eda, 0x11ae },
|
||||||
|
{ 0x0edb, 0x11af },
|
||||||
|
{ 0x0edc, 0x11b0 },
|
||||||
|
{ 0x0edd, 0x11b1 },
|
||||||
|
{ 0x0ede, 0x11b2 },
|
||||||
|
{ 0x0edf, 0x11b3 },
|
||||||
|
{ 0x0ee0, 0x11b4 },
|
||||||
|
{ 0x0ee1, 0x11b5 },
|
||||||
|
{ 0x0ee2, 0x11b6 },
|
||||||
|
{ 0x0ee3, 0x11b7 },
|
||||||
|
{ 0x0ee4, 0x11b8 },
|
||||||
|
{ 0x0ee5, 0x11b9 },
|
||||||
|
{ 0x0ee6, 0x11ba },
|
||||||
|
{ 0x0ee7, 0x11bb },
|
||||||
|
{ 0x0ee8, 0x11bc },
|
||||||
|
{ 0x0ee9, 0x11bd },
|
||||||
|
{ 0x0eea, 0x11be },
|
||||||
|
{ 0x0eeb, 0x11bf },
|
||||||
|
{ 0x0eec, 0x11c0 },
|
||||||
|
{ 0x0eed, 0x11c1 },
|
||||||
|
{ 0x0eee, 0x11c2 },
|
||||||
|
{ 0x0eef, 0x316d },
|
||||||
|
{ 0x0ef0, 0x3171 },
|
||||||
|
{ 0x0ef1, 0x3178 },
|
||||||
|
{ 0x0ef2, 0x317f },
|
||||||
|
{ 0x0ef3, 0x3181 },
|
||||||
|
{ 0x0ef4, 0x3184 },
|
||||||
|
{ 0x0ef5, 0x3186 },
|
||||||
|
{ 0x0ef6, 0x318d },
|
||||||
|
{ 0x0ef7, 0x318e },
|
||||||
|
{ 0x0ef8, 0x11eb },
|
||||||
|
{ 0x0ef9, 0x11f0 },
|
||||||
|
{ 0x0efa, 0x11f9 },
|
||||||
|
{ 0x0eff, 0x20a9 },
|
||||||
|
{ 0x13a4, 0x20ac },
|
||||||
|
{ 0x13bc, 0x0152 },
|
||||||
|
{ 0x13bd, 0x0153 },
|
||||||
|
{ 0x13be, 0x0178 },
|
||||||
|
{ 0x20ac, 0x20ac },
|
||||||
|
// Numeric keypad with numlock on
|
||||||
|
{ XK_KP_Space, ' ' },
|
||||||
|
{ XK_KP_Equal, '=' },
|
||||||
|
{ XK_KP_Multiply, '*' },
|
||||||
|
{ XK_KP_Add, '+' },
|
||||||
|
{ XK_KP_Separator, ',' },
|
||||||
|
{ XK_KP_Subtract, '-' },
|
||||||
|
{ XK_KP_Decimal, '.' },
|
||||||
|
{ XK_KP_Divide, '/' },
|
||||||
|
{ XK_KP_0, 0x0030 },
|
||||||
|
{ XK_KP_1, 0x0031 },
|
||||||
|
{ XK_KP_2, 0x0032 },
|
||||||
|
{ XK_KP_3, 0x0033 },
|
||||||
|
{ XK_KP_4, 0x0034 },
|
||||||
|
{ XK_KP_5, 0x0035 },
|
||||||
|
{ XK_KP_6, 0x0036 },
|
||||||
|
{ XK_KP_7, 0x0037 },
|
||||||
|
{ XK_KP_8, 0x0038 },
|
||||||
|
{ XK_KP_9, 0x0039 }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** GLFW internal functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// _glfwKeySym2Unicode() - Convert X11 KeySym to Unicode
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
long _glfwKeySym2Unicode( KeySym keysym )
|
||||||
|
{
|
||||||
|
int min = 0;
|
||||||
|
int max = sizeof(keysymtab) / sizeof(struct codepair) - 1;
|
||||||
|
int mid;
|
||||||
|
|
||||||
|
/* First check for Latin-1 characters (1:1 mapping) */
|
||||||
|
if( (keysym >= 0x0020 && keysym <= 0x007e) ||
|
||||||
|
(keysym >= 0x00a0 && keysym <= 0x00ff) )
|
||||||
|
{ return keysym;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Also check for directly encoded 24-bit UCS characters */
|
||||||
|
if( (keysym & 0xff000000) == 0x01000000 )
|
||||||
|
{
|
||||||
|
return keysym & 0x00ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Binary search in table */
|
||||||
|
while( max >= min )
|
||||||
|
{
|
||||||
|
mid = (min + max) / 2;
|
||||||
|
if( keysymtab[mid].keysym < keysym )
|
||||||
|
{
|
||||||
|
min = mid + 1;
|
||||||
|
}
|
||||||
|
else if( keysymtab[mid].keysym > keysym )
|
||||||
|
{
|
||||||
|
max = mid - 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Found it! */
|
||||||
|
return keysymtab[mid].ucs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* No matching Unicode value found */
|
||||||
|
return -1;
|
||||||
|
}
|
89
lib/x11/x11_time.c
Normal file
89
lib/x11/x11_time.c
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
//========================================================================
|
||||||
|
// GLFW - An OpenGL framework
|
||||||
|
// Platform: X11/GLX
|
||||||
|
// API version: 2.7
|
||||||
|
// WWW: http://www.glfw.org/
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Initialise timer
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwInitTimer( void )
|
||||||
|
{
|
||||||
|
struct timeval tv;
|
||||||
|
|
||||||
|
// "Resolution" is 1 us
|
||||||
|
_glfwLibrary.Timer.resolution = 1e-6;
|
||||||
|
|
||||||
|
// Set start-time for timer
|
||||||
|
gettimeofday( &tv, NULL );
|
||||||
|
_glfwLibrary.Timer.t0 = (long long) tv.tv_sec * (long long) 1000000 +
|
||||||
|
(long long) tv.tv_usec;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//************************************************************************
|
||||||
|
//**** Platform implementation functions ****
|
||||||
|
//************************************************************************
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Return timer value in seconds
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
double _glfwPlatformGetTime( void )
|
||||||
|
{
|
||||||
|
long long t;
|
||||||
|
struct timeval tv;
|
||||||
|
|
||||||
|
gettimeofday( &tv, NULL );
|
||||||
|
t = (long long) tv.tv_sec * (long long) 1000000 +
|
||||||
|
(long long) tv.tv_usec;
|
||||||
|
|
||||||
|
return (double)(t - _glfwLibrary.Timer.t0) * _glfwLibrary.Timer.resolution;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// Set timer value in seconds
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
void _glfwPlatformSetTime( double t )
|
||||||
|
{
|
||||||
|
long long t0;
|
||||||
|
struct timeval tv;
|
||||||
|
|
||||||
|
gettimeofday( &tv, NULL );
|
||||||
|
t0 = (long long) tv.tv_sec * (long long) 1000000 +
|
||||||
|
(long long) tv.tv_usec;
|
||||||
|
|
||||||
|
// Calulate new starting time
|
||||||
|
_glfwLibrary.Timer.t0 = t0 - (long long)(t/_glfwLibrary.Timer.resolution);
|
||||||
|
}
|
||||||
|
|
1875
lib/x11/x11_window.c
Normal file
1875
lib/x11/x11_window.c
Normal file
File diff suppressed because it is too large
Load Diff
821
readme.html
Normal file
821
readme.html
Normal file
|
@ -0,0 +1,821 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>GLFW Readme File</title>
|
||||||
|
<style type="text/css">
|
||||||
|
table { margin-left: 2em; border-style: solid; border-width: thin; }
|
||||||
|
tr.header { font-weight: bold; }
|
||||||
|
td { padding: 0.2em; border-style: solid; border-width: thin; }
|
||||||
|
pre { margin-left: 2em; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1>GLFW 2.7 <i>Lite</i></h1>
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li><a href="#sec1">Introduction</a></li>
|
||||||
|
<li><a href="#sec2">Compiling GLFW and the example programs</a></li>
|
||||||
|
<li><a href="#sec3">Installing GLFW</a></li>
|
||||||
|
<li><a href="#sec4">Using GLFW</a></li>
|
||||||
|
<li><a href="#sec9">Frequently Asked Questions</a></li>
|
||||||
|
<li><a href="#sec5">Version history</a></li>
|
||||||
|
<li><a href="#sec6">Directory structure of the GLFW distribution</a></li>
|
||||||
|
<li><a href="#sec7">Contacting the project</a></li>
|
||||||
|
<li><a href="#sec8">Acknowledgements</a></li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<a name="sec1">
|
||||||
|
<h2>1. Introduction</h2>
|
||||||
|
|
||||||
|
<p>Welcome to version 2.7 <i>Lite</i> of the GLFW OpenGL framework. GLFW is
|
||||||
|
a free, open source, portable framework for OpenGL application development. In
|
||||||
|
short, it is a library that constitutes a powerful API for handling operating
|
||||||
|
system specific tasks, such as opening an OpenGL window, reading keyboard and
|
||||||
|
mouse input, and more.</p>
|
||||||
|
|
||||||
|
<p><em>Please note</em> that this is the <i>Lite</i> version of GLFW, which
|
||||||
|
means that some areas of functionality present in 2.x mainline versions of GLFW
|
||||||
|
have been removed.</p>
|
||||||
|
|
||||||
|
<a name="sec2">
|
||||||
|
<h2>2. Compiling GLFW and the example programs</h2>
|
||||||
|
|
||||||
|
<p>To compile GLFW and the accompanying example programs, you will need the <a
|
||||||
|
href="http://www.cmake.org/">CMake</a> build system.</p>
|
||||||
|
|
||||||
|
<a name="sec3">
|
||||||
|
<h2>3. Installing GLFW</h2>
|
||||||
|
|
||||||
|
<p>A rudimentary installation target is provided for all supported platforms
|
||||||
|
via the CMake build system.</p>
|
||||||
|
|
||||||
|
<p>For Unix-like platforms, the command is:</p>
|
||||||
|
|
||||||
|
<p class="pre"><pre>$ make install</pre></p>
|
||||||
|
|
||||||
|
<p>Note that you may need to run this command as root or via
|
||||||
|
<code>sudo(1)</code> in order to install GLFW into the various system
|
||||||
|
directories.</p>
|
||||||
|
|
||||||
|
<p>For Visual C++ and other integrated development environments, an installation
|
||||||
|
target should appear in the by CMake generated project files.</p>
|
||||||
|
|
||||||
|
<a name="sec4">
|
||||||
|
<h2>4. Using GLFW</h2>
|
||||||
|
|
||||||
|
<p>There are two aspects to using GLFW:
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<ol>
|
||||||
|
<li>How the GLFW API works</li>
|
||||||
|
<li>How to compile programs that use GLFW</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<p>The first point is covered in the <a href="docs/UsersGuide.pdf">GLFW
|
||||||
|
Users Guide</a> and the <a href="docs/Reference.pdf">GLFW Reference
|
||||||
|
Manual</a>, and we suggest that you read at least the Users Guide, since
|
||||||
|
it's a good introduction to the GLFW API.</p>
|
||||||
|
|
||||||
|
<p>Designing and compiling programs that use GLFW is not very difficult.
|
||||||
|
A few rules for successfully designing GLFW-based programs are presented
|
||||||
|
in the following sections.</p>
|
||||||
|
|
||||||
|
<h3>4.1 Include <code>GL/glfw.h</code></h3>
|
||||||
|
|
||||||
|
<p>In your program, you should include <code>GL/glfw.h</code> like this:</p>
|
||||||
|
|
||||||
|
<p><pre>#include <GL/glfw.h></pre></p>
|
||||||
|
|
||||||
|
<p>This include file defines all the necessary constants, types and prototypes
|
||||||
|
that are used to interact with the GLFW API. It also includes
|
||||||
|
<code>GL/gl.h</code> and <code>GL/glu.h</code>, and - <em>it defines all the
|
||||||
|
necessary constants and types that are necessary for OpenGL to work on
|
||||||
|
different platforms</em>.</p>
|
||||||
|
|
||||||
|
<p>For instance, under Windows you are normally required to include
|
||||||
|
<code>windows.h</code> before you include <code>GL/gl.h</code>. If you write
|
||||||
|
such a program, it would not compile under e.g. Linux since
|
||||||
|
<code>windows.h</code> does not exist under Linux. <code>GL/glfw.h</code>
|
||||||
|
takes care of these things for you. Note however that it does not actually
|
||||||
|
include <code>windows.h</code>, it merely mimics the parts of it that are
|
||||||
|
needed for <code>GL/gl.h</code> and <code>GL/glu.h</code> (this way we do not
|
||||||
|
get the thousands of constants, types and prototypes that could otherwise
|
||||||
|
possibly interfere with our own declarations).</p>
|
||||||
|
|
||||||
|
<p>In other words:
|
||||||
|
<ul>
|
||||||
|
<li>Do <em>not</em> include <code>GL/gl.h</code> or <code>GL/glu.h</code>
|
||||||
|
(GLFW does it for you)</li>
|
||||||
|
<li>Do <em>not</em> include <code>windows.h</code> unless you need
|
||||||
|
to write Win32-specific code</li>
|
||||||
|
<li>If you <em>do</em> need to include <code>windows.h</code>, do it
|
||||||
|
<em>before</em> including <code>GL/glfw.h</code>.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>4.2 Link with the correct libraries</h3>
|
||||||
|
|
||||||
|
<h4>4.2.1 Windows static library</h4>
|
||||||
|
|
||||||
|
<p>If you link with the static version of GLFW, it is also necessary to
|
||||||
|
link with some system libraries that GLFW uses.</p>
|
||||||
|
|
||||||
|
<p>When linking a program under Windows that uses the static version of GLFW,
|
||||||
|
you must also link with the following libraries: <code>opengl32</code>,
|
||||||
|
<code>user32</code> and <code>kernel32</code>. Some of these libraries may be
|
||||||
|
linked with by default by your compiler. In the table below you can see the
|
||||||
|
minimum required link options for each supported Windows compiler (you may want
|
||||||
|
to add other libraries as well, such as <code>glu32</code>):</p>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr class="header">
|
||||||
|
<td>Compiler</td>
|
||||||
|
<td>Link options</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Borland C++ Builder</td>
|
||||||
|
<td><code>glfw.lib opengl32.lib</code></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Cygwin</td>
|
||||||
|
<td><i>See Unix static library below</i></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>LCC-Win32</td>
|
||||||
|
<td><code>glfw.lib opengl32.lib</code></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Microsoft Visual C++</td>
|
||||||
|
<td><code>glfw.lib opengl32.lib user32.lib</code></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>MinGW32</td>
|
||||||
|
<td><code>-lglfw -lopengl32</code></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>OpenWatcom</td>
|
||||||
|
<td><code>glfw.lib opengl32.lib user32.lib</code></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Pelles C</td>
|
||||||
|
<td><code>glfw.lib opengl32.lib user32.lib kernel32.lib</code></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
<h4>4.2.2 Windows DLL</h4>
|
||||||
|
|
||||||
|
<p>To compile a program that uses the DLL version of GLFW, you need to define
|
||||||
|
the <code>GLFW_DLL</code> constant. This can either be done with a compiler switch,
|
||||||
|
typically by adding <code>-DGLFW_DLL</code> to the list of compiler options. You can
|
||||||
|
also do it by adding the following line to all your source files that include
|
||||||
|
<code>glfw.h</code>, <em>before</em> including it:</p>
|
||||||
|
|
||||||
|
<p><pre>#define GLFW_DLL</pre></p>
|
||||||
|
|
||||||
|
<p>When linking a program under Windows that uses the DLL version of GLFW,
|
||||||
|
the only library you need to link with for GLFW to work is <code>glfwdll</code>.
|
||||||
|
In the table below you can see the minimum required link options for each
|
||||||
|
supported Windows compiler (you may want to add other libraries as well,
|
||||||
|
such as <code>opengl32</code> and <code>glu32</code>):</p>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr class="header">
|
||||||
|
<td>Compiler</td>
|
||||||
|
<td>Link options</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Borland C++ Builder</td>
|
||||||
|
<td><code>glfwdll.lib</code></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Cygwin</td>
|
||||||
|
<td><code>-lglfwdll</code></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>LCC-Win32</td>
|
||||||
|
<td><code>glfwdll.lib</code></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Microsoft Visual C++</td>
|
||||||
|
<td><code>glfwdll.lib</code></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>MinGW32</td>
|
||||||
|
<td><code>-lglfwdll</code></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>OpenWatcom</td>
|
||||||
|
<td><code>glfwdll.lib</code></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Pelles C</td>
|
||||||
|
<td><code>glfwdll.lib</code></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h4>4.2.3 Unix static library</h4>
|
||||||
|
|
||||||
|
<p>GLFW now supports
|
||||||
|
<a href="http://pkgconfig.freedesktop.org/wiki/">pkgconfig</a>,
|
||||||
|
and a libglfw.pc file is generated and installed when you install the library.
|
||||||
|
For systems that do not provide pkgconfig, you should look in this file for the
|
||||||
|
proper compile and link flags for your system, as determined by compile.sh at
|
||||||
|
compile time.</p>
|
||||||
|
|
||||||
|
<p>A typical compile and link command line may look like this (using GCC):</p>
|
||||||
|
|
||||||
|
<p><pre>gcc `pkg-config --cflags libglfw` -o myprog myprog.c `pkg-config --libs libglfw`</pre></p>
|
||||||
|
|
||||||
|
<p>If you use GLU functions in your program then you should also add the
|
||||||
|
<code>-lGLU</code> flag.
|
||||||
|
|
||||||
|
|
||||||
|
<h4>4.2.5 Mac OS X static library</h4>
|
||||||
|
|
||||||
|
<p>When compiling and linking a program under Mac OS X that uses GLFW, you
|
||||||
|
must also link with the following frameworks: <code>Carbon.framework</code>,
|
||||||
|
<code>AGL.framework</code> and <code>OpenGL.framework</code>.
|
||||||
|
|
||||||
|
<p>If you are using Xcode, you simply add the GLFW library
|
||||||
|
<code>libglfw.a</code> and these frameworks to your project. If, however, you
|
||||||
|
are building your program from the command line, there are two methods for
|
||||||
|
correctly linking your GLFW program.</p>
|
||||||
|
|
||||||
|
<p>GLFW now supports <a
|
||||||
|
href="http://pkgconfig.freedesktop.org/wiki/">pkgconfig</a>, and a pkgconfig
|
||||||
|
file named libglfw.pc is generated and installed when you install the library.
|
||||||
|
You can find pkgconfig in most packaging systems, such as <a
|
||||||
|
href="http://www.finkproject.org/">Fink</a> and <a
|
||||||
|
href="http://darwinports.opendarwin.org/">DarwinPorts</a>, so if you have one
|
||||||
|
of them installed, simply install pkgconfig. Once you have pkgconfig available,
|
||||||
|
the command line for compiling and linking your program is:</p>
|
||||||
|
|
||||||
|
<p><pre>gcc `pkg-config --cflags libglfw` -o myprog myprog.c `pkg-config --libs libglfw`</pre></p>
|
||||||
|
|
||||||
|
<p>If you do not wish to use pkgconfig, you will need to add the required
|
||||||
|
frameworks and libraries to your command line using the <code>-l</code> and
|
||||||
|
<code>-framework</code> switches, i.e.:</p>
|
||||||
|
|
||||||
|
<p><pre>gcc -o myprog myprog.c -lglfw -framework Carbon -framework AGL -framework OpenGL</pre></p>
|
||||||
|
|
||||||
|
<p>Note that you do not add the .framework extension to a framework when adding
|
||||||
|
it from the command line.</p>
|
||||||
|
|
||||||
|
<p>These frameworks contain all GL and GLU functions, so there is no need to
|
||||||
|
add additional libraries or frameworks when using GLU functionality. Also note
|
||||||
|
that even though your machine may have Unix-style GL libraries, they are for
|
||||||
|
use with the X Window System, and will <em>not</em> work with the Mac OS X
|
||||||
|
native version of GLFW.</p>
|
||||||
|
|
||||||
|
<a name="#sec9" />
|
||||||
|
<h2>9. Frequently Asked Questions</h2>
|
||||||
|
|
||||||
|
<a name="sec5" />
|
||||||
|
<h2>5. Version history</h2>
|
||||||
|
|
||||||
|
<h3>2.7 <i>Lite</i></h3>
|
||||||
|
<ul>
|
||||||
|
<li>Removed all threading support</li>
|
||||||
|
<li>Removed all image and texture loading support</li>
|
||||||
|
<li>Removed all build files not related to CMake</li>
|
||||||
|
<li>Removed D, Delphi and Lua bindings</li>
|
||||||
|
<li>Imported CMake work from pre-3.0 branch</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>2.7</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Added <code>GLFW_OPENGL_VERSION_MAJOR</code>,
|
||||||
|
<code>GLFW_OPENGL_VERSION_MINOR</code> and
|
||||||
|
<code>GLFW_OPENGL_FORWARD_COMPAT</code> hints for versioned context
|
||||||
|
creation support</li>
|
||||||
|
<li>Added <code>GLFW_NO_GLU</code> macro for disabling the inclusion of the
|
||||||
|
GLU header</li>
|
||||||
|
<li>Added the proper DEF file to the Visual C++ DLL project file</li>
|
||||||
|
<li>Added a rudimentary joystick API testing example</li>
|
||||||
|
<li>Changed all comments in public header file to plain C style</li>
|
||||||
|
<li>Removed all deprecated platforms</li>
|
||||||
|
<li>[X11] Added <code>x11-distro-install</code> install target, intended for packagers</li>
|
||||||
|
<li>[X11] Removed support for GLX version 1.3 and below</li>
|
||||||
|
<li>[X11] Bugfix: Misspelt struct member in XF86VidMode code path</li>
|
||||||
|
<li>[MacOSX] Bugfix: Key repeat events were ignored on 10.5 Leopard</li>
|
||||||
|
<li>[Win32] Bugfix: Improper use of wParam for <code>WM_SYSCOMMAND</code></li>
|
||||||
|
<li>[Win32] Bugfix: Derivatives of stream.c not cleaned up by compile.bat</li>
|
||||||
|
<li>[Win32] Bugfix: Pointer for <code>GetExtensionsStringARB</code> was not initialized</li>
|
||||||
|
<li>[Win32] Bugfix: Updated API version in makefiles</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>2.6</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Added <code>GLFW_FSAA_SAMPLES</code> multi-sampling hint</li>
|
||||||
|
<li>Added <code>GLFW_WINDOW_NO_RESIZE</code> hint for non-resizable windows</li>
|
||||||
|
<li>Added install targets for all Unix-like build targets</li>
|
||||||
|
<li>Added <code>glfwReadMemoryImage</code> function for creating a
|
||||||
|
<code>GLFWImage</code> object from an image file in a memory buffer</li>
|
||||||
|
<li>Added <code>glfwLoadMemoryTexture2D</code> function for decoding an image
|
||||||
|
file in a memory buffer into a texture</li>
|
||||||
|
<li>Added <code>glfwLoadTextureImage2D</code> function for loading a
|
||||||
|
<code>GLFWImage</code> object into a texture</li>
|
||||||
|
<li>Added cross-compilation support for MinGW under a Unix-like host</li>
|
||||||
|
<li>D bindings updated and all examples ported to modern D</li>
|
||||||
|
<li>Delphi bindings updated to reflect API additions</li>
|
||||||
|
<li>Bugfix: The interaction between key repeat and window focus code caused duplicate presses</li>
|
||||||
|
<li>Bugfix: The mouse position was not properly updated when re-enabling the mouse cursor</li>
|
||||||
|
<li>[Win32] Added pkgconfig file generation for Cygwin</li>
|
||||||
|
<li>[Win32] Added version number to window class name</li>
|
||||||
|
<li>[Win32] Added optional loading of user provided window icon resource</li>
|
||||||
|
<li>[Win32] Bugfix: Very small sleep periods were forced to higher value</li>
|
||||||
|
<li>[Win32] Bugfix: The nmake makefile did not handle paths with spaces correctly</li>
|
||||||
|
<li>[Win32] Bugfix: Removed assembly RDTSC timing code</li>
|
||||||
|
<li>[Win32] Bugfix: Hidden cursor was not clipped to windowed windows</li>
|
||||||
|
<li>[X11] Added XRandR code path for fullscreen windows</li>
|
||||||
|
<li>[X11] Added building of shared library</li>
|
||||||
|
<li>[X11] Added <a href="http://tronche.com/gui/x/icccm/">ICCCM</a> WM fullscreen hints</li>
|
||||||
|
<li>[X11] Added support for the <code>_NET_WM_PING</code> protocol</li>
|
||||||
|
<li>[X11] Added pkgconfig file generation</li>
|
||||||
|
<li>[X11] Added setting of WM size hints</li>
|
||||||
|
<li>[X11] Bugfix: Removed assembly RDTSC timing code</li>
|
||||||
|
<li>[X11] Bugfix: Window re-opening now works properly (including fullscreen windows)</li>
|
||||||
|
<li>[X11] Bugfix: Potential crash bug in video mode matching code</li>
|
||||||
|
<li>[X11] Bugfix: Static buffers imposed an invisible limit on reported video mode count</li>
|
||||||
|
<li>[X11] Bugfix: Interaction with certain window managers when setting input
|
||||||
|
focus would cause termination with a BadMatch error</li>
|
||||||
|
<li>[X11] Bugfix: Keypad keys did not trigger the character callback</li>
|
||||||
|
<li>[MacOSX] Added pkgconfig file generation</li>
|
||||||
|
<li>[MacOSX] Added building of shared library</li>
|
||||||
|
<li>[MacOSX] Added building of Universal Binary libraries</li>
|
||||||
|
<li>[MacOSX] Replaced fullscreen code path with CGL version</li>
|
||||||
|
<li>[MacOSX] Bugfix: Binaries without bundles or resource forks now interact
|
||||||
|
properly with the WM</li>
|
||||||
|
<li>[MacOSX] Bugfix: Replaced Carbon event time source with <code>gettimeofday</code></li>
|
||||||
|
<li>[MacOSX] Bugfix: Added code to minimize the dreaded OpenGL application startup jump</li>
|
||||||
|
<li>[MacOSX] Bugfix: Fixed broken implementation of
|
||||||
|
<code>glfwSetMousePos</code> for windowed mode</li>
|
||||||
|
<li>[MacOSX] Bugfix: Fixed broken implementation of hidden cursor</li>
|
||||||
|
<li>[MacOSX] Bugfix: Capturing all displays and not just the main one</li>
|
||||||
|
<li>[AmigaOS] Obsoleted platform due to lack of maintainer and community interest</li>
|
||||||
|
<li>[DOS] Obsoleted platform due to lack of maintainer and community interest</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>2.5</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Added the function glfwWaitEvents</li>
|
||||||
|
<li>Added window close callback, which enables a program to prevent a user
|
||||||
|
from closing a window with the window manager</li>
|
||||||
|
<li>Added window refresh callback, which is called when the window needs
|
||||||
|
to be refreshed</li>
|
||||||
|
<li>Added support for loading alpha textures (GLFW_ALPHA_MAP_BIT)</li>
|
||||||
|
<li>Added support for the Lua programming language</li>
|
||||||
|
<li>Added support for the D programming language</li>
|
||||||
|
<li>Added support for the Pelles C compiler for Windows</li>
|
||||||
|
<li>Added API level support for up to eight mouse buttons</li>
|
||||||
|
<li>[Win32] Added support for up to five mouse buttons</li>
|
||||||
|
<li>[Win32] Mouse down events capture mouse input</li>
|
||||||
|
<li>[Win32] Bugfix: The DLL now exports glfwSetTime</li>
|
||||||
|
<li>[Win32] Fix: The GLFW window is now placed in the upper left corner
|
||||||
|
of the desktop working area</li>
|
||||||
|
<li>[Win32/X11] Bugfix: More robust check for SwapInterval</li>
|
||||||
|
<li>[X11] Added support for USB joysticks under Linux (/dev/input/js*)</li>
|
||||||
|
<li>[X11] Bugfix: Added support for GLX extensions in glfwExtensionSupported</li>
|
||||||
|
<li>[X11] Bugfix: More robust fullscreen mode (?)</li>
|
||||||
|
<li>[X11] Bugfix: Runtime check of XF86VidMode support for the active
|
||||||
|
display</li>
|
||||||
|
<li>[X11] Bugfix: Some mouse button events were reported incorrectly</li>
|
||||||
|
<li>[MacOSX] Added support for the input char callback.</li>
|
||||||
|
<li>[MacOSX] Added video mode validation and duplicate elimination.</li>
|
||||||
|
<li>[MacOSX] Switched to a new MakeBundle.sh script.</li>
|
||||||
|
<li>[MacOSX] Added emulation of the window refresh callback.</li>
|
||||||
|
<li>[MacOSX] Bugfix: The window and its associated resources are now
|
||||||
|
properly released.</li>
|
||||||
|
<li>[MacOSX] Bugfix: Removed support for more than eight mouse buttons.</li>
|
||||||
|
<li>[x86 CPUs] Improved Intel mobile CPU detection (e.g. disables RDTSC
|
||||||
|
timing on Centrino systems)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>2.4.2</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Preliminary native Mac OS X support (via the Carbon interface)</li>
|
||||||
|
<li>Preliminary DOS support (DJGPP + Mesa)</li>
|
||||||
|
<li>Changed license to the zlib license (almost identical to the previous
|
||||||
|
GLFW license), so now GLFW is OSI Certified</li>
|
||||||
|
<li>Rewrote the GLFW documentation in LaTeX, meaning several improvements
|
||||||
|
(both visual and practical)</li>
|
||||||
|
<li>Added the <b>support</b> folder to the distribution, which includes
|
||||||
|
support for various languages</li>
|
||||||
|
<li>[Win32] Added OpenWatcom compiler support (thanks Sebastian
|
||||||
|
Schuberth!)</li>
|
||||||
|
<li>[Win32] Changed fallback timer from GetTickCount to timeGetTime,
|
||||||
|
which usually provides better resolution</li>
|
||||||
|
<li>[Win32] Bugfix: Accumulator buffer selection should be more
|
||||||
|
robust</li>
|
||||||
|
<li>[Win32] Bugfix: If stereo rendering is requested, and no stereo pixel
|
||||||
|
format could be created, glfwOpenWindow now fails</li>
|
||||||
|
<li>[Win32] Bugfix: glfwSetWindowSize now sets the size of the client
|
||||||
|
area, NOT the entire window, meaning that there is a 1:1 relationship
|
||||||
|
between glfwSetWindowSize and glfwGetWindowSize</li>
|
||||||
|
<li>[X11] Added FreeBSD and QNX support</li>
|
||||||
|
<li>[X11] Added support for non-pthread capable systems</li>
|
||||||
|
<li>[X11] Hopefully more robust configuration script (compile.sh)</li>
|
||||||
|
<li>[X11] Bugfix: When mouse cursor is hidden, mouse sensitivity is no
|
||||||
|
longer degraded</li>
|
||||||
|
<li>[X11] Bugfix: Source files EOL was PC style (CR/LF) in 2.4.1 (blame
|
||||||
|
my WinCVS configuration)</li>
|
||||||
|
<li>[X11] Bugfix: When a GLFW window is closed, input focus is properly
|
||||||
|
released</li>
|
||||||
|
<li>[X11] Bugfix: Iconification of fullscreen windows should now work
|
||||||
|
properly</li>
|
||||||
|
<li>[x86 CPUs] Improved RDTSC timing (e.g. RDTSC support on single-CPU
|
||||||
|
Intel Hyper-Threading enabled systems)</li>
|
||||||
|
<li>[AmigaOS] Added joystick support</li>
|
||||||
|
<li>[AmigaOS] Mouse cursor positioning is now implemented</li>
|
||||||
|
<li>[AmigaOS] Added support for Geek Gadgets GCC</li>
|
||||||
|
<li>[AmigaOS] Bugfix: glfwGetWindowParam now returns proper values for
|
||||||
|
all parameters (except for GLFW_ACCELERATED)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>2.4.1</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Added AmigaOS support (preliminary)</li>
|
||||||
|
<li>GLFW for the X Window System now works under Mac OS X</li>
|
||||||
|
<li>[Win32] Bugfix: glfwWaitCond treated the timeout as milliseconds
|
||||||
|
instead of seconds</li>
|
||||||
|
<li>[X11] Bugfix: GLFW should now compile under IRIX v5.3</li>
|
||||||
|
<li>[X11] Bugfix: GLFW should now compile with Kylix</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>2.4</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Major source code rearrangement - much code is now shared between
|
||||||
|
different platforms, and it should be easier to port GLFW to new
|
||||||
|
platforms</li>
|
||||||
|
<li>Added a Unicode keyboard text input interface (CharCallback)</li>
|
||||||
|
<li>Keyboard key input is now slightly more internationalized: GLFW now
|
||||||
|
uses 8-bit ISO-8859-1 encoding for keys representing printable
|
||||||
|
characters (e.g. "Ö", "§", etc.), as
|
||||||
|
opposed to the previous 7-bit US-ASCII encoding</li>
|
||||||
|
<li>Added more key constants (F13-F25, keypad '=')</li>
|
||||||
|
<li>Added an enable/disable switch for automatic event polling from
|
||||||
|
glfwSwapBuffers</li>
|
||||||
|
<li>[X11] Added support for sysctl for querying the number of processors
|
||||||
|
in the system (if POSIX sysconf is not supported)</li>
|
||||||
|
<li>[X11] Bugfix: compile.sh now works with Sun sh (and hopefully others
|
||||||
|
too)</li>
|
||||||
|
<li>[X11] Bugfix: compile.sh now detects the need for -ldl when dlopen is
|
||||||
|
used</li>
|
||||||
|
<li>[Win32] Bugfix: When closing a fullscreen window under Win 9x/NT4,
|
||||||
|
the task bar icon now disappears properly</li>
|
||||||
|
<li>[Win32] Bugfix: GLFW should now compile on a wider range of MSVC
|
||||||
|
compilers (e.g. .NET) - Thanks Tim Little!</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>2.3.2</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Removed the silly limitation of 100 threads (the thread information
|
||||||
|
is now kept in a linked list)</li>
|
||||||
|
<li>General source cleanup (window state is now kept in a single
|
||||||
|
struct, plus some other minor changes)</li>
|
||||||
|
<li>[X11] Added Solaris gethrtime() support (not tested yet), which
|
||||||
|
should give an improved timer for Sun/Solaris stations</li>
|
||||||
|
<li>[X11] Some fixes to the 'compile.sh' script (-O for non-gcc compilers
|
||||||
|
and 'make x11-gcc' should now really force GCC)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>2.3.1</h3>
|
||||||
|
<ul>
|
||||||
|
<li>[X11] A minimalist configuration script was added that solves the
|
||||||
|
issue with glXGetProcAddressARB, and unifies all Unix/X11 Makefiles
|
||||||
|
into one template Makefile (well, one for GLFW, and one for the
|
||||||
|
examples)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>2.3</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Added OpenGL stereo rendering support</li>
|
||||||
|
<li>Added a function for parsing the OpenGL version string
|
||||||
|
(glfwGetGLVersion)</li>
|
||||||
|
<li>[x86] Bugfix: Hopefully the CPU core clock dependent timer RDTSC will
|
||||||
|
never be used on CPUs with variable core frequencies anymore</li>
|
||||||
|
<li>[X11] Bugfix: GLFW could create stereo rendering capable windows,
|
||||||
|
even if it was not requested (GLFW 2.2.x did not support selection
|
||||||
|
of stereo rendering)</li>
|
||||||
|
<li>[X11] Bugfix: glfwGetProcAddress returned NULL on most systems (even
|
||||||
|
on those that supported glXGetProcAddressARB). Now GLFW assumes that
|
||||||
|
glXGetProcAddressARB is supported on all systems, which solves the
|
||||||
|
bug, but may result in compiler errors on some systems (please let me
|
||||||
|
know if you have any related problems).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>2.2.3</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Bugfix: Checking for GL_SGIS_generate_mipmap is more robust</li>
|
||||||
|
<li>Bugfix: glfwLoadTexture2D will now fail if no window is opened</li>
|
||||||
|
<li>[Win32] Bugfix: Right shift was not detected under Win 9x/ME (it is
|
||||||
|
still not as good as under NT/2K/XP, but at least you get right
|
||||||
|
shifts)</li>
|
||||||
|
<li>[X11] Bugfix: Visuals are now selected more accurately. For instance,
|
||||||
|
glfwOpenWindow will no longer fail if you request a 24-bit color
|
||||||
|
buffer if only 16-bit color visuals are available (which means that
|
||||||
|
pong3d should work on 16-bit displays).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>2.2.2</h3>
|
||||||
|
<ul>
|
||||||
|
<li>[Win32] Bugfix: Windows did not always get focus (this was a tough
|
||||||
|
one!)</li>
|
||||||
|
<li>[Win32] Bugfix: glfwGetWindowParam did not work with
|
||||||
|
GLFW_ACCUM_*_BITS or GLFW_AUX_BUFFERS</li>
|
||||||
|
<li>[X11] Bugfix: Linux joystick Y axis positions were reversed</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>2.2.1</h3>
|
||||||
|
<ul>
|
||||||
|
<li>[X11] Added joystick support for Linux</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>2.2</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Added joystick support (only supported under Windows so far)</li>
|
||||||
|
<li>Added joystick controls to pong3d.c (only 3 more lines of code)</li>
|
||||||
|
<li>Added glfwOpenWindowHint() function</li>
|
||||||
|
<li>It is now possible to specify a desired vertical monitor refresh
|
||||||
|
rate (for fullscreen windows)</li>
|
||||||
|
<li>It is now possible to request an accumulator buffer and auxiliary
|
||||||
|
buffers</li>
|
||||||
|
<li>Added glfwSetTime() function</li>
|
||||||
|
<li>Added a GLFW conversion of the MESA/GLUT gears.c demo to the example
|
||||||
|
programs</li>
|
||||||
|
<li>[Win32] gdi32.dll and winmm.dll are now loaded dynamically when
|
||||||
|
glfwInit() is called. This means that there is no need to link with
|
||||||
|
gdi32.lib or winmm.lib when using the static version of GLFW, which
|
||||||
|
should make GLFW usage more convenient.</li>
|
||||||
|
<li>[Win32] Bugfix: Greatly improved keyboard input (detect left/right
|
||||||
|
CTRL etc)</li>
|
||||||
|
<li>[Win32] Bugfix: glfwExtensionSupported now detects all WGL extensions
|
||||||
|
(e.g. WGL_ARB_pbuffer)</li>
|
||||||
|
<li>[Win32] Bugfix: Mouse cursor was not re-hidden when a GLFW window was
|
||||||
|
deselected and then selected again (with ALT+TAB)</li>
|
||||||
|
<li>[X11] Bugfix: Minor bug in the SGI timer - and ugly (unintended) SGI
|
||||||
|
timer debug info removed</li>
|
||||||
|
<li>[X11] Bugfix: glfwGetDesktopMode and glfwGetVideoModes no longer give
|
||||||
|
segmentation faults if no X server is available</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>2.1</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Added image and texture loading capabilities (support for the TGA
|
||||||
|
file format at the moment)</li>
|
||||||
|
<li>Added a new example program (mipmaps.c) for showing off the automatic
|
||||||
|
mipmap generation and texture loading capabilities of GLFW 2.1</li>
|
||||||
|
<li>Removed the separate TGA loader (tga.c in the examples directory)
|
||||||
|
since texture loading is supported natively by GLFW. Also updated the
|
||||||
|
Pong3D demo to use GLFW texture loading instead of tga.c.</li>
|
||||||
|
<li>Improved keyboard handling (e.g. numeric keypad keys can be
|
||||||
|
detected)</li>
|
||||||
|
<li>Added a new example program, keytest.c</li>
|
||||||
|
<li>Changed the GLFWvidmode structure and the corresponding API functions
|
||||||
|
to report pure color bits instead of the confusing (and unportable)
|
||||||
|
"BPP" field</li>
|
||||||
|
<li>Changed glfwSetWindowSize so that it operates in fullscreen mode
|
||||||
|
too</li>
|
||||||
|
<li>Added mouse wheel support under Windows (not Win95) and X11</li>
|
||||||
|
<li>Added window iconification functions (glfwInconifyWindow and
|
||||||
|
glfwRestoreWindow)</li>
|
||||||
|
<li>Improved iconification and deactivation handling under both Windows
|
||||||
|
and X11</li>
|
||||||
|
<li>Made it possible to turn on/off key repeat (the default is now no key
|
||||||
|
repeat)</li>
|
||||||
|
<li>Added SGI hardware timer support (CLOCK_SGI_CYCLE) for improved
|
||||||
|
timer resolution for SGI computers</li>
|
||||||
|
<li>Added support for the free Borland C++ Builder 5.x compiler for
|
||||||
|
Windows</li>
|
||||||
|
<li>Made it possible to compiler GLFW as a Windows DLL using any of the
|
||||||
|
supported compilers</li>
|
||||||
|
<li>Some constants have changed names (e.g. GLFW_REDBITS is now called
|
||||||
|
GLFW_RED_BITS)</li>
|
||||||
|
<li>Updated GLFW documentation (GLFW Users Guide and GLFW Reference
|
||||||
|
Manual) to reflect the changes in the API</li>
|
||||||
|
<li>[Win32] Bugfix: Corrected Cygwin toplevel makefile entry</li>
|
||||||
|
<li>[Win32] Bugfix: Fixed event lag bug</li>
|
||||||
|
<li>[Win32] Bugfix: Fixed Radeon 8500 crash</li>
|
||||||
|
<li>[X11] Bugfix: Fixed the window close bug</li>
|
||||||
|
<li>[X11] Bugfix: Iconification/deactivation is now detected</li>
|
||||||
|
<li>[X11] Bugfix: Non-OpenGL visuals are not listed anymore</li>
|
||||||
|
<li>[XFree86] Bugfix: Undesired video mode changes are now prevented</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>2.0.3</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Added precise CPU cycle based timing support (RDTSC) for x86
|
||||||
|
CPUs (under both Windows and Unix)</li>
|
||||||
|
<li>Added a makefile option for building for Windows with Cygwin</li>
|
||||||
|
<li>Corrected the CC for Unix/X11 makefiles (-Wall is usually not a
|
||||||
|
supported flag for CC, so it was removed from the CFLAGS list)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>2.0.2</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Added a makefile option for building for X11 with 'cc' rather than
|
||||||
|
'gcc' (useful for IRIX users for instance).</li>
|
||||||
|
<li>[Win32] Bugfix: Mouse coordinates are now relative to the window
|
||||||
|
upper left corner, which also means that disabling the mouse cursor
|
||||||
|
in windowed mode should work much better.</li>
|
||||||
|
<li>[X11] Bugfix: Added a bunch of more keys that are recognized by
|
||||||
|
GLFW.</li>
|
||||||
|
<li>[X11] Bugfix: glfwGetNumberOfProcessors now works for IRIX (earlier
|
||||||
|
versions of GLFW would not compile under IRIX).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>2.0.1</h3>
|
||||||
|
<ul>
|
||||||
|
<li>glfwTerminate() will now be called automatically upon normal program
|
||||||
|
termination (using atexit())</li>
|
||||||
|
<li>[Win32] Bugfix: Buffer-swapping did not work if a window lost
|
||||||
|
focus.</li>
|
||||||
|
<li>[Win32] Bugfix: Top level Makefile did not work under Windows
|
||||||
|
9x.</li>
|
||||||
|
<li>[Win32] Bugfix: NULL declaration in glfw.h was not MSVC 7.x
|
||||||
|
compatible.</li>
|
||||||
|
<li>[X11] Bugfix: GLFW would not build with C++ (e.g. g++).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>2.0</h3>
|
||||||
|
<ul>
|
||||||
|
<li>GLFW is no longer a single source file, but an entire link library.</li>
|
||||||
|
<li>Added multi threading support.</li>
|
||||||
|
<li>Added more window control.</li>
|
||||||
|
<li>New distribution layout (both Win32 and X11 version in same archive).</li>
|
||||||
|
<li>Added GLFW Users Manual and GLFW Reference Manual as PDF files.</li>
|
||||||
|
<li>Some bugfixes.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>1.0.2</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Improved fullscreen functionality.</li>
|
||||||
|
<li>Added fullscreen support for X11.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>1.0.1</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Added support for the X Window System.</li>
|
||||||
|
<li>Fixed bugs.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>1.0.0</h3>
|
||||||
|
<ul>
|
||||||
|
<li>First release.</li>
|
||||||
|
<li>Only supported Windows.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
<a name="sec6">
|
||||||
|
<h2>6. Directory structure of the GLFW distribution</h2>
|
||||||
|
|
||||||
|
<p>Here is an overview of the directory structure of the GLFW distribution:
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr class="header">
|
||||||
|
<td>Directory</td>
|
||||||
|
<td>Contents</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>docs</code></td>
|
||||||
|
<td>GLFW manuals in PDF format</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>examples</code></td>
|
||||||
|
<td>Several example programs in C</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>include/GL</code></td>
|
||||||
|
<td>The GLFW C/C++ header file</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>lib</code></td>
|
||||||
|
<td>The source code for GLFW</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>lib/macosx</code>
|
||||||
|
<td>Mac OS X-specific code</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>lib/win32</code>
|
||||||
|
<td>Windows-specific code</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>lib/x11</code></td>
|
||||||
|
<td>Unix/X11-specific code</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
<a name="sec7">
|
||||||
|
<h2>7. Contacting the project</h2>
|
||||||
|
|
||||||
|
<p>The official GLFW web site can be found here: <a
|
||||||
|
href="http://glfw.sourceforge.net/">http://glfw.sourceforge.net/</a>. It
|
||||||
|
contains the latest version of GLFW, news and other information that is useful
|
||||||
|
for OpenGL development.</p>
|
||||||
|
|
||||||
|
<p>If you have questions related to the use of GLFW, we have a <a
|
||||||
|
href="https://sourceforge.net/forum/forum.php?forum_id=247562">user's web
|
||||||
|
forum</a>, and a <a
|
||||||
|
href="https://lists.sourceforge.net/lists/listinfo/glfw-user">user's mailing
|
||||||
|
list</a> on SF.net, and the IRC channel <code>#glfw</code> on <a
|
||||||
|
href="http://freenode.net/">Freenode</a>.</p>
|
||||||
|
|
||||||
|
<p>If you have a bug to report or a feature you'd like to request, please file
|
||||||
|
it in the <a href="http://sourceforge.net/tracker/?group_id=72569">SF.net
|
||||||
|
trackers</a>.</p>
|
||||||
|
|
||||||
|
Finally, if you're interested in helping out with the development of GLFW or
|
||||||
|
porting it to your favorite platform, we have a <a
|
||||||
|
href="https://lists.stacken.kth.se/mailman/listinfo/glfw-dev">developer's
|
||||||
|
mailing list</a>, or you could join us on <code>#glfw</code>.
|
||||||
|
|
||||||
|
|
||||||
|
<a name="sec8">
|
||||||
|
<h2>8. Acknowledgements</h2>
|
||||||
|
|
||||||
|
<p>GLFW would not be what it is today without the help from:
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li>Marcus Geelnard, the original author and long-time maintainer of GLFW,
|
||||||
|
without whose brilliant work none of this would have happened.</li><br>
|
||||||
|
|
||||||
|
<li>Robin Leffmann, for his work on Mac OS X and other platforms, and his
|
||||||
|
invaluable support.</li><br>
|
||||||
|
|
||||||
|
<li>Keith Bauer, for his invaluable help with porting and maintaining GLFW on
|
||||||
|
Mac OS X, and for his many ideas.</li><br>
|
||||||
|
|
||||||
|
<li>Ozzy @ <a href="http://www.orkysquad.org">Orkysquad</a>,
|
||||||
|
for his dedication to GLFW, for debugging my source, and for his
|
||||||
|
valuable experience with game development.</li><br>
|
||||||
|
|
||||||
|
<li>Jeff Molofee, the author of the excellent OpenGL tutorials at <a
|
||||||
|
href="http://nehe.gamedev.net/">NeHe Productions</a>.
|
||||||
|
Much of the Windows code of GLFW was originally based on Jeff's
|
||||||
|
code.</li><br>
|
||||||
|
|
||||||
|
<li>Douglas C. Schmidt and Irfan Pyarali, for their excellent article <a
|
||||||
|
href="http://www.cs.wustl.edu/~schmidt/win32-cv-1.html">Strategies for
|
||||||
|
Implementing POSIX Condition Variables on Win32</a>, which was the basis for
|
||||||
|
the Win32 condition variable implementation in GLFW.</li><br>
|
||||||
|
|
||||||
|
<li>Bobyshev Alexander and Martins Mozeiko, for the original proposal of
|
||||||
|
an FSAA hint and their work on the Win32 implementation of FSAA.</li><br>
|
||||||
|
|
||||||
|
<li>Gerald Franz, who made GLFW compile under IRIX, and supplied patches
|
||||||
|
for the X11 keyboard translation routine.</li><br>
|
||||||
|
|
||||||
|
<li>Bradley Smith, for his updates of the D support and his ports of the
|
||||||
|
remaining examples to the D language.</li><br>
|
||||||
|
|
||||||
|
<li>Olivier Delannoy, for the initial implementation of FSAA support on
|
||||||
|
X11, cross-compiling support for MinGW and general extreme usefulness.</li>
|
||||||
|
|
||||||
|
<li>Glenn Lewis, for helping out with support for the D programming
|
||||||
|
language.</li><br>
|
||||||
|
|
||||||
|
<li>David Medlock, for doing the initial Lua port.</li><br>
|
||||||
|
|
||||||
|
<li>Frank Wille, for helping me with the AmigaOS port and making GLFW
|
||||||
|
compile under IRIX 5.3.</li><br>
|
||||||
|
|
||||||
|
<li>Matt Sealey, for helping me with the MorphOS port.</li><br />
|
||||||
|
|
||||||
|
<li>Paul R. Deppe, who helped me with Cygwin support, and made an
|
||||||
|
adaption of <a href="http://plib.sourceforge.net/">PLIB</a>
|
||||||
|
so that it can use GLFW (instead of GLUT).</li><br />
|
||||||
|
|
||||||
|
<li>Jarrod Davis, for the Delphi port of GLFW.</li><br />
|
||||||
|
|
||||||
|
<li>Toni Jovanoski, for helping me with the MASM32 port of GLFW, and
|
||||||
|
supplying the example program and fixed OpenGL and GLU bindings for
|
||||||
|
MASM32.</li><br />
|
||||||
|
|
||||||
|
<li>Sebastian Schuberth, for the OpenWatcom makefiles.</li><br />
|
||||||
|
|
||||||
|
<li>Dmitri Shuralyov, Samuli Tuomola, Santi Zupancic, Sylvain
|
||||||
|
Hellegouarch, and many others for support, bug reports and
|
||||||
|
testing.</li><br />
|
||||||
|
|
||||||
|
<li>Дмитри Малышев, for the idea of a GLFW_NO_GLU macro.</li><br />
|
||||||
|
|
||||||
|
<li><a href="http://www.opengl.org/">OpenGL.org</a>, and all the people on
|
||||||
|
the discussion forums there that have provided help during the development of
|
||||||
|
GLFW.</li><br />
|
||||||
|
|
||||||
|
<li>The <a href="http://msdn.microsoft.com/library/">MSDN Online Library</a>,
|
||||||
|
which was used extensively for Windows development.</li><br />
|
||||||
|
|
||||||
|
<li>All the feedback from the GLFW community - thank you!</li><br />
|
||||||
|
|
||||||
|
<li>Everyone we forgot to thank - thank you!</li><br />
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
36
tests/CMakeLists.txt
Normal file
36
tests/CMakeLists.txt
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
|
||||||
|
link_libraries(libglfwStatic ${GLFW_LIBRARIES} ${OPENGL_glu_LIBRARY})
|
||||||
|
|
||||||
|
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../include ${OPENGL_INCLUDE_DIR})
|
||||||
|
|
||||||
|
add_executable(defaults defaults.c)
|
||||||
|
add_executable(events events.c)
|
||||||
|
add_executable(joysticks joysticks.c)
|
||||||
|
add_executable(peter peter.c)
|
||||||
|
add_executable(reopen reopen.c)
|
||||||
|
add_executable(version version.c)
|
||||||
|
|
||||||
|
if(APPLE)
|
||||||
|
# Set fancy names for bundles
|
||||||
|
add_executable(Accuracy MACOSX_BUNDLE accuracy.c)
|
||||||
|
add_executable(FSAA MACOSX_BUNDLE fsaa.c)
|
||||||
|
add_executable(Tearing MACOSX_BUNDLE tearing.c)
|
||||||
|
else()
|
||||||
|
# Set boring names for executables
|
||||||
|
add_executable(accuracy WIN32 accuracy.c)
|
||||||
|
add_executable(tearing WIN32 tearing.c)
|
||||||
|
add_executable(fsaa WIN32 fsaa.c)
|
||||||
|
endif(APPLE)
|
||||||
|
|
||||||
|
if(MSVC)
|
||||||
|
# Tell MSVC to use main instead of WinMain for Windows subsystem executables
|
||||||
|
set_target_properties(accuracy defaults events fsaa peter reopen tearing version PROPERTIES LINK_FLAGS "/ENTRY:mainCRTStartup")
|
||||||
|
endif(MSVC)
|
||||||
|
|
||||||
|
if(CYGWIN)
|
||||||
|
# Set cross-compile and subsystem compile and link flags
|
||||||
|
set_target_properties(accuracy defaults events fsaa joysticks peter reopen tearing version PROPERTIES COMPILE_FLAGS "-mno-cygwin")
|
||||||
|
set_target_properties(accuracy fsaa tearing PROPERTIES LINK_FLAGS "-mno-cygwin -mwindows")
|
||||||
|
set_target_properties(events defaults joysticks peter reopen version PROPERTIES LINK_FLAGS "-mno-cygwin -mconsole")
|
||||||
|
endif(CYGWIN)
|
||||||
|
|
103
tests/accuracy.c
Normal file
103
tests/accuracy.c
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
//========================================================================
|
||||||
|
// Mouse cursor accuracy test
|
||||||
|
// Copyright (c) Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
//
|
||||||
|
// This test came about as the result of bug #1867804
|
||||||
|
//
|
||||||
|
// No sign of said bug has so far been detected
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include <GL/glfw.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
static int cursor_x = 0, cursor_y = 0;
|
||||||
|
static int window_width = 640, window_height = 480;
|
||||||
|
|
||||||
|
static void GLFWCALL window_size_callback(int width, int height)
|
||||||
|
{
|
||||||
|
window_width = width;
|
||||||
|
window_height = height;
|
||||||
|
|
||||||
|
glViewport(0, 0, window_width, window_height);
|
||||||
|
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glLoadIdentity();
|
||||||
|
gluOrtho2D(0.f, window_width, 0.f, window_height);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GLFWCALL mouse_position_callback(int x, int y)
|
||||||
|
{
|
||||||
|
cursor_x = x;
|
||||||
|
cursor_y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
if (!glfwInit())
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to initialize GLFW\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!glfwOpenWindow(window_width, window_height, 0, 0, 0, 0, 0, 0, GLFW_WINDOW))
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
fprintf(stderr, "Failed to open GLFW window\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwSetWindowTitle("Cursor Inaccuracy Detector");
|
||||||
|
glfwSetMousePosCallback(mouse_position_callback);
|
||||||
|
glfwSetWindowSizeCallback(window_size_callback);
|
||||||
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
|
glClearColor(0, 0, 0, 0);
|
||||||
|
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
glLoadIdentity();
|
||||||
|
|
||||||
|
while (glfwGetWindowParam(GLFW_OPENED))
|
||||||
|
{
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
glColor3f(1.f, 1.f, 1.f);
|
||||||
|
|
||||||
|
glBegin(GL_LINES);
|
||||||
|
glVertex2f(0.f, (GLfloat) window_height - cursor_y);
|
||||||
|
glVertex2f((GLfloat) window_width, (GLfloat) window_height - cursor_y);
|
||||||
|
glVertex2f((GLfloat) cursor_x, 0.f);
|
||||||
|
glVertex2f((GLfloat) cursor_x, (GLfloat) window_height);
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
glfwSwapBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
98
tests/defaults.c
Normal file
98
tests/defaults.c
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
//========================================================================
|
||||||
|
// Default window/context test
|
||||||
|
// Copyright (c) Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
//
|
||||||
|
// This test creates a windowed mode window with all parameters set to
|
||||||
|
// default values and then reports the actual parameters of the created
|
||||||
|
// window and context
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include <GL/glfw.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int param;
|
||||||
|
char* name;
|
||||||
|
} Param;
|
||||||
|
|
||||||
|
static Param parameters[] =
|
||||||
|
{
|
||||||
|
{ GLFW_ACCELERATED, "accelerated" },
|
||||||
|
{ GLFW_RED_BITS, "red bits" },
|
||||||
|
{ GLFW_GREEN_BITS, "green bits" },
|
||||||
|
{ GLFW_BLUE_BITS, "blue bits" },
|
||||||
|
{ GLFW_ALPHA_BITS, "alpha bits" },
|
||||||
|
{ GLFW_DEPTH_BITS, "depth bits" },
|
||||||
|
{ GLFW_STENCIL_BITS, "stencil bits" },
|
||||||
|
{ GLFW_REFRESH_RATE, "refresh rate" },
|
||||||
|
{ GLFW_ACCUM_RED_BITS, "accum red bits" },
|
||||||
|
{ GLFW_ACCUM_GREEN_BITS, "accum green bits" },
|
||||||
|
{ GLFW_ACCUM_BLUE_BITS, "accum blue bits" },
|
||||||
|
{ GLFW_ACCUM_ALPHA_BITS, "accum alpha bits" },
|
||||||
|
{ GLFW_AUX_BUFFERS, "aux buffers" },
|
||||||
|
{ GLFW_STEREO, "stereo" },
|
||||||
|
{ GLFW_FSAA_SAMPLES, "FSAA samples" },
|
||||||
|
{ GLFW_OPENGL_VERSION_MAJOR, "OpenGL major" },
|
||||||
|
{ GLFW_OPENGL_VERSION_MINOR, "OpenGL minor" },
|
||||||
|
{ GLFW_OPENGL_FORWARD_COMPAT, "OpenGL forward compatible" },
|
||||||
|
{ GLFW_OPENGL_DEBUG_CONTEXT, "OpenGL debug context" },
|
||||||
|
{ GLFW_OPENGL_PROFILE, "OpenGL profile" },
|
||||||
|
};
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
int i, width, height;
|
||||||
|
|
||||||
|
if (!glfwInit())
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to initialize GLFW\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!glfwOpenWindow(0, 0, 0, 0, 0, 0, 0, 0, GLFW_WINDOW))
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
fprintf(stderr, "Failed to open GLFW default window\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwGetWindowSize(&width, &height);
|
||||||
|
|
||||||
|
printf("window size: %ix%i\n", width, height);
|
||||||
|
|
||||||
|
for (i = 0; (size_t) i < sizeof(parameters) / sizeof(parameters[0]); i++)
|
||||||
|
{
|
||||||
|
printf("%s: %i\n", parameters[i].name, glfwGetWindowParam(parameters[i].param));
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwCloseWindow();
|
||||||
|
glfwTerminate();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
309
tests/events.c
Normal file
309
tests/events.c
Normal file
|
@ -0,0 +1,309 @@
|
||||||
|
//========================================================================
|
||||||
|
// Event linter (event spewer)
|
||||||
|
// Copyright (c) Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
//
|
||||||
|
// This test hooks every available callback and outputs their arguments
|
||||||
|
//
|
||||||
|
// Log messages go to stdout, error messages to stderr
|
||||||
|
//
|
||||||
|
// Every event also gets a (sequential) number to aid discussion of logs
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include <GL/glfw.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <locale.h>
|
||||||
|
|
||||||
|
static GLboolean keyrepeat = 0;
|
||||||
|
static GLboolean systemkeys = 1;
|
||||||
|
static unsigned int counter = 0;
|
||||||
|
|
||||||
|
static const char* get_key_name(int key)
|
||||||
|
{
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case GLFW_KEY_UNKNOWN: return "unknown";
|
||||||
|
case GLFW_KEY_SPACE: return "space";
|
||||||
|
case GLFW_KEY_ESC: return "escape";
|
||||||
|
case GLFW_KEY_F1: return "F1";
|
||||||
|
case GLFW_KEY_F2: return "F2";
|
||||||
|
case GLFW_KEY_F3: return "F3";
|
||||||
|
case GLFW_KEY_F4: return "F4";
|
||||||
|
case GLFW_KEY_F5: return "F5";
|
||||||
|
case GLFW_KEY_F6: return "F6";
|
||||||
|
case GLFW_KEY_F7: return "F7";
|
||||||
|
case GLFW_KEY_F8: return "F8";
|
||||||
|
case GLFW_KEY_F9: return "F9";
|
||||||
|
case GLFW_KEY_F10: return "F10";
|
||||||
|
case GLFW_KEY_F11: return "F11";
|
||||||
|
case GLFW_KEY_F12: return "F12";
|
||||||
|
case GLFW_KEY_F13: return "F13";
|
||||||
|
case GLFW_KEY_F14: return "F14";
|
||||||
|
case GLFW_KEY_F15: return "F15";
|
||||||
|
case GLFW_KEY_F16: return "F16";
|
||||||
|
case GLFW_KEY_F17: return "F17";
|
||||||
|
case GLFW_KEY_F18: return "F18";
|
||||||
|
case GLFW_KEY_F19: return "F19";
|
||||||
|
case GLFW_KEY_F20: return "F20";
|
||||||
|
case GLFW_KEY_F21: return "F21";
|
||||||
|
case GLFW_KEY_F22: return "F22";
|
||||||
|
case GLFW_KEY_F23: return "F23";
|
||||||
|
case GLFW_KEY_F24: return "F24";
|
||||||
|
case GLFW_KEY_F25: return "F25";
|
||||||
|
case GLFW_KEY_UP: return "up";
|
||||||
|
case GLFW_KEY_DOWN: return "down";
|
||||||
|
case GLFW_KEY_LEFT: return "left";
|
||||||
|
case GLFW_KEY_RIGHT: return "right";
|
||||||
|
case GLFW_KEY_LSHIFT: return "left shift";
|
||||||
|
case GLFW_KEY_RSHIFT: return "right shift";
|
||||||
|
case GLFW_KEY_LCTRL: return "left control";
|
||||||
|
case GLFW_KEY_RCTRL: return "right control";
|
||||||
|
case GLFW_KEY_LALT: return "left alt";
|
||||||
|
case GLFW_KEY_RALT: return "right alt";
|
||||||
|
case GLFW_KEY_TAB: return "tab";
|
||||||
|
case GLFW_KEY_ENTER: return "enter";
|
||||||
|
case GLFW_KEY_BACKSPACE: return "backspace";
|
||||||
|
case GLFW_KEY_INSERT: return "insert";
|
||||||
|
case GLFW_KEY_DEL: return "delete";
|
||||||
|
case GLFW_KEY_PAGEUP: return "page up";
|
||||||
|
case GLFW_KEY_PAGEDOWN: return "page down";
|
||||||
|
case GLFW_KEY_HOME: return "home";
|
||||||
|
case GLFW_KEY_END: return "end";
|
||||||
|
case GLFW_KEY_KP_0: return "keypad 0";
|
||||||
|
case GLFW_KEY_KP_1: return "keypad 1";
|
||||||
|
case GLFW_KEY_KP_2: return "keypad 2";
|
||||||
|
case GLFW_KEY_KP_3: return "keypad 3";
|
||||||
|
case GLFW_KEY_KP_4: return "keypad 4";
|
||||||
|
case GLFW_KEY_KP_5: return "keypad 5";
|
||||||
|
case GLFW_KEY_KP_6: return "keypad 6";
|
||||||
|
case GLFW_KEY_KP_7: return "keypad 7";
|
||||||
|
case GLFW_KEY_KP_8: return "keypad 8";
|
||||||
|
case GLFW_KEY_KP_9: return "keypad 9";
|
||||||
|
case GLFW_KEY_KP_DIVIDE: return "keypad divide";
|
||||||
|
case GLFW_KEY_KP_MULTIPLY: return "keypad multiply";
|
||||||
|
case GLFW_KEY_KP_SUBTRACT: return "keypad subtract";
|
||||||
|
case GLFW_KEY_KP_ADD: return "keypad add";
|
||||||
|
case GLFW_KEY_KP_DECIMAL: return "keypad decimal";
|
||||||
|
case GLFW_KEY_KP_EQUAL: return "keypad equal";
|
||||||
|
case GLFW_KEY_KP_ENTER: return "keypad enter";
|
||||||
|
case GLFW_KEY_KP_NUM_LOCK: return "keypad num lock";
|
||||||
|
case GLFW_KEY_CAPS_LOCK: return "caps lock";
|
||||||
|
case GLFW_KEY_SCROLL_LOCK: return "scroll lock";
|
||||||
|
case GLFW_KEY_PAUSE: return "pause";
|
||||||
|
case GLFW_KEY_LSUPER: return "left super";
|
||||||
|
case GLFW_KEY_RSUPER: return "right super";
|
||||||
|
case GLFW_KEY_MENU: return "menu";
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char* get_action_name(int action)
|
||||||
|
{
|
||||||
|
switch (action)
|
||||||
|
{
|
||||||
|
case GLFW_PRESS:
|
||||||
|
return "was pressed";
|
||||||
|
case GLFW_RELEASE:
|
||||||
|
return "was released";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "caused unknown action";
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char* get_button_name(int button)
|
||||||
|
{
|
||||||
|
switch (button)
|
||||||
|
{
|
||||||
|
case GLFW_MOUSE_BUTTON_LEFT:
|
||||||
|
return "left";
|
||||||
|
case GLFW_MOUSE_BUTTON_RIGHT:
|
||||||
|
return "right";
|
||||||
|
case GLFW_MOUSE_BUTTON_MIDDLE:
|
||||||
|
return "middle";
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char* get_character_string(int character)
|
||||||
|
{
|
||||||
|
static char result[6 + 1];
|
||||||
|
|
||||||
|
int length = wctomb(result, character);
|
||||||
|
if (length == -1)
|
||||||
|
length = 0;
|
||||||
|
|
||||||
|
result[length] = '\0';
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GLFWCALL window_size_callback(int width, int height)
|
||||||
|
{
|
||||||
|
printf("%08x at %0.3f: Window size: %i %i\n",
|
||||||
|
counter++,
|
||||||
|
glfwGetTime(),
|
||||||
|
width,
|
||||||
|
height);
|
||||||
|
|
||||||
|
glViewport(0, 0, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int GLFWCALL window_close_callback(void)
|
||||||
|
{
|
||||||
|
printf("%08x at %0.3f: Window close\n", counter++, glfwGetTime());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GLFWCALL window_refresh_callback(void)
|
||||||
|
{
|
||||||
|
printf("%08x at %0.3f: Window refresh\n", counter++, glfwGetTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GLFWCALL mouse_button_callback(int button, int action)
|
||||||
|
{
|
||||||
|
const char* name = get_button_name(button);
|
||||||
|
|
||||||
|
printf("%08x at %0.3f: Mouse button %i", counter++, glfwGetTime(), button);
|
||||||
|
|
||||||
|
if (name)
|
||||||
|
printf(" (%s) was %s\n", name, get_action_name(action));
|
||||||
|
else
|
||||||
|
printf(" was %s\n", get_action_name(action));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GLFWCALL mouse_position_callback(int x, int y)
|
||||||
|
{
|
||||||
|
printf("%08x at %0.3f: Mouse position: %i %i\n", counter++, glfwGetTime(), x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GLFWCALL mouse_wheel_callback(int position)
|
||||||
|
{
|
||||||
|
printf("%08x at %0.3f: Mouse wheel: %i\n", counter++, glfwGetTime(), position);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GLFWCALL key_callback(int key, int action)
|
||||||
|
{
|
||||||
|
const char* name = get_key_name(key);
|
||||||
|
|
||||||
|
printf("%08x at %0.3f: Key 0x%04x", counter++, glfwGetTime(), key);
|
||||||
|
|
||||||
|
if (name)
|
||||||
|
printf(" (%s) was %s\n", name, get_action_name(action));
|
||||||
|
else if (isgraph(key))
|
||||||
|
printf(" (%c) was %s\n", key, get_action_name(action));
|
||||||
|
else
|
||||||
|
printf(" was %s\n", get_action_name(action));
|
||||||
|
|
||||||
|
if (action != GLFW_PRESS)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case 'R':
|
||||||
|
{
|
||||||
|
keyrepeat = !keyrepeat;
|
||||||
|
if (keyrepeat)
|
||||||
|
glfwEnable(GLFW_KEY_REPEAT);
|
||||||
|
else
|
||||||
|
glfwDisable(GLFW_KEY_REPEAT);
|
||||||
|
|
||||||
|
printf("(( key repeat %s ))\n", keyrepeat ? "enabled" : "disabled");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'S':
|
||||||
|
{
|
||||||
|
systemkeys = !systemkeys;
|
||||||
|
if( systemkeys )
|
||||||
|
glfwEnable(GLFW_SYSTEM_KEYS);
|
||||||
|
else
|
||||||
|
glfwDisable(GLFW_SYSTEM_KEYS);
|
||||||
|
|
||||||
|
printf("(( system keys %s ))\n", systemkeys ? "enabled" : "disabled");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GLFWCALL char_callback(int character, int action)
|
||||||
|
{
|
||||||
|
printf("%08x at %0.3f: Character 0x%04x", counter++, glfwGetTime(), character);
|
||||||
|
|
||||||
|
printf(" (%s) %s\n", get_character_string(character), get_action_name(action));
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
setlocale(LC_ALL, "");
|
||||||
|
|
||||||
|
if (!glfwInit())
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to initialize GLFW\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Library initialized\n");
|
||||||
|
|
||||||
|
if (!glfwOpenWindow(0, 0, 0, 0, 0, 0, 0, 0, GLFW_WINDOW))
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
fprintf(stderr, "Failed to create GLFW window");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Window opened\n");
|
||||||
|
|
||||||
|
glfwSetWindowTitle("Event Linter");
|
||||||
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
|
glfwSetWindowSizeCallback(window_size_callback);
|
||||||
|
glfwSetWindowCloseCallback(window_close_callback);
|
||||||
|
glfwSetWindowRefreshCallback(window_refresh_callback);
|
||||||
|
glfwSetMouseButtonCallback(mouse_button_callback);
|
||||||
|
glfwSetMousePosCallback(mouse_position_callback);
|
||||||
|
glfwSetMouseWheelCallback(mouse_wheel_callback);
|
||||||
|
glfwSetKeyCallback(key_callback);
|
||||||
|
glfwSetCharCallback(char_callback);
|
||||||
|
|
||||||
|
printf("Key repeat should be %s\n", keyrepeat ? "enabled" : "disabled");
|
||||||
|
printf("System keys should be %s\n", systemkeys ? "enabled" : "disabled");
|
||||||
|
|
||||||
|
printf("Main loop starting\n");
|
||||||
|
|
||||||
|
while (glfwGetWindowParam(GLFW_OPENED) == GL_TRUE)
|
||||||
|
{
|
||||||
|
glfwWaitEvents();
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
glfwSwapBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
105
tests/fsaa.c
Normal file
105
tests/fsaa.c
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
//========================================================================
|
||||||
|
// Fullscreen multisampling anti-aliasing test
|
||||||
|
// Copyright (c) Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
//
|
||||||
|
// This test renders two high contrast, slowly rotating quads, one aliased
|
||||||
|
// and one (hopefully) anti-aliased, thus allowing for visual verification
|
||||||
|
// of whether FSAA is indeed enabled
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include <GL/glfw.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#ifndef GL_ARB_multisample
|
||||||
|
#define GL_MULTISAMPLE_ARB 0x809D
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void GLFWCALL window_size_callback(int width, int height)
|
||||||
|
{
|
||||||
|
glViewport(0, 0, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
if (!glfwInit())
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to initialize GLFW\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 4);
|
||||||
|
|
||||||
|
if (!glfwOpenWindow(400, 400, 0, 0, 0, 0, 0, 0, GLFW_WINDOW))
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
fprintf(stderr, "Failed to open GLFW window\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwSetWindowTitle("Aliasing Detector");
|
||||||
|
glfwSetWindowSizeCallback(window_size_callback);
|
||||||
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
|
int samples = glfwGetWindowParam(GLFW_FSAA_SAMPLES);
|
||||||
|
if (samples)
|
||||||
|
printf("Context reports FSAA is supported with %i samples\n", samples);
|
||||||
|
else
|
||||||
|
printf("Context reports FSAA is unsupported\n");
|
||||||
|
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
gluOrtho2D(0.f, 1.f, 0.f, 1.f);
|
||||||
|
|
||||||
|
while (glfwGetWindowParam(GLFW_OPENED))
|
||||||
|
{
|
||||||
|
GLfloat time = (GLfloat) glfwGetTime();
|
||||||
|
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
glLoadIdentity();
|
||||||
|
glTranslatef(0.5f, 0.f, 0.f);
|
||||||
|
glRotatef(time, 0.f, 0.f, 1.f);
|
||||||
|
|
||||||
|
glEnable(GL_MULTISAMPLE_ARB);
|
||||||
|
glColor3f(1.f, 1.f, 1.f);
|
||||||
|
glRectf(-0.25f, -0.25f, 0.25f, 0.25f);
|
||||||
|
|
||||||
|
glLoadIdentity();
|
||||||
|
glTranslatef(-0.5f, 0.f, 0.f);
|
||||||
|
glRotatef(time, 0.f, 0.f, 1.f);
|
||||||
|
|
||||||
|
glDisable(GL_MULTISAMPLE_ARB);
|
||||||
|
glColor3f(1.f, 1.f, 1.f);
|
||||||
|
glRectf(-0.25f, -0.25f, 0.25f, 0.25f);
|
||||||
|
|
||||||
|
glfwSwapBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
253
tests/getopt.c
Normal file
253
tests/getopt.c
Normal file
|
@ -0,0 +1,253 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* getopt.c - competent and free getopt library.
|
||||||
|
* $Header: /cvsroot/freegetopt/freegetopt/getopt.c,v 1.2 2003/10/26 03:10:20 vindaci Exp $
|
||||||
|
*
|
||||||
|
* Copyright (c)2002-2003 Mark K. Kim
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* * Neither the original author of this software nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||||
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||||
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||||
|
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
||||||
|
* DAMAGE.
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "getopt.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* 2009-10-12 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
*
|
||||||
|
* Removed unused global static variable 'ID'.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
char* optarg = NULL;
|
||||||
|
int optind = 0;
|
||||||
|
int opterr = 1;
|
||||||
|
int optopt = '?';
|
||||||
|
|
||||||
|
|
||||||
|
static char** prev_argv = NULL; /* Keep a copy of argv and argc to */
|
||||||
|
static int prev_argc = 0; /* tell if getopt params change */
|
||||||
|
static int argv_index = 0; /* Option we're checking */
|
||||||
|
static int argv_index2 = 0; /* Option argument we're checking */
|
||||||
|
static int opt_offset = 0; /* Index into compounded "-option" */
|
||||||
|
static int dashdash = 0; /* True if "--" option reached */
|
||||||
|
static int nonopt = 0; /* How many nonopts we've found */
|
||||||
|
|
||||||
|
static void increment_index()
|
||||||
|
{
|
||||||
|
/* Move onto the next option */
|
||||||
|
if(argv_index < argv_index2)
|
||||||
|
{
|
||||||
|
while(prev_argv[++argv_index] && prev_argv[argv_index][0] != '-'
|
||||||
|
&& argv_index < argv_index2+1);
|
||||||
|
}
|
||||||
|
else argv_index++;
|
||||||
|
opt_offset = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Permutes argv[] so that the argument currently being processed is moved
|
||||||
|
* to the end.
|
||||||
|
*/
|
||||||
|
static int permute_argv_once()
|
||||||
|
{
|
||||||
|
/* Movability check */
|
||||||
|
if(argv_index + nonopt >= prev_argc) return 1;
|
||||||
|
/* Move the current option to the end, bring the others to front */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char* tmp = prev_argv[argv_index];
|
||||||
|
|
||||||
|
/* Move the data */
|
||||||
|
memmove(&prev_argv[argv_index], &prev_argv[argv_index+1],
|
||||||
|
sizeof(char**) * (prev_argc - argv_index - 1));
|
||||||
|
prev_argv[prev_argc - 1] = tmp;
|
||||||
|
|
||||||
|
nonopt++;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int getopt(int argc, char** argv, char* optstr)
|
||||||
|
{
|
||||||
|
int c = 0;
|
||||||
|
|
||||||
|
/* If we have new argv, reinitialize */
|
||||||
|
if(prev_argv != argv || prev_argc != argc)
|
||||||
|
{
|
||||||
|
/* Initialize variables */
|
||||||
|
prev_argv = argv;
|
||||||
|
prev_argc = argc;
|
||||||
|
argv_index = 1;
|
||||||
|
argv_index2 = 1;
|
||||||
|
opt_offset = 1;
|
||||||
|
dashdash = 0;
|
||||||
|
nonopt = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Jump point in case we want to ignore the current argv_index */
|
||||||
|
getopt_top:
|
||||||
|
|
||||||
|
/* Misc. initializations */
|
||||||
|
optarg = NULL;
|
||||||
|
|
||||||
|
/* Dash-dash check */
|
||||||
|
if(argv[argv_index] && !strcmp(argv[argv_index], "--"))
|
||||||
|
{
|
||||||
|
dashdash = 1;
|
||||||
|
increment_index();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we're at the end of argv, that's it. */
|
||||||
|
if(argv[argv_index] == NULL)
|
||||||
|
{
|
||||||
|
c = -1;
|
||||||
|
}
|
||||||
|
/* Are we looking at a string? Single dash is also a string */
|
||||||
|
else if(dashdash || argv[argv_index][0] != '-' || !strcmp(argv[argv_index], "-"))
|
||||||
|
{
|
||||||
|
/* If we want a string... */
|
||||||
|
if(optstr[0] == '-')
|
||||||
|
{
|
||||||
|
c = 1;
|
||||||
|
optarg = argv[argv_index];
|
||||||
|
increment_index();
|
||||||
|
}
|
||||||
|
/* If we really don't want it (we're in POSIX mode), we're done */
|
||||||
|
else if(optstr[0] == '+' || getenv("POSIXLY_CORRECT"))
|
||||||
|
{
|
||||||
|
c = -1;
|
||||||
|
|
||||||
|
/* Everything else is a non-opt argument */
|
||||||
|
nonopt = argc - argv_index;
|
||||||
|
}
|
||||||
|
/* If we mildly don't want it, then move it back */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(!permute_argv_once()) goto getopt_top;
|
||||||
|
else c = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Otherwise we're looking at an option */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char* opt_ptr = NULL;
|
||||||
|
|
||||||
|
/* Grab the option */
|
||||||
|
c = argv[argv_index][opt_offset++];
|
||||||
|
|
||||||
|
/* Is the option in the optstr? */
|
||||||
|
if(optstr[0] == '-') opt_ptr = strchr(optstr+1, c);
|
||||||
|
else opt_ptr = strchr(optstr, c);
|
||||||
|
/* Invalid argument */
|
||||||
|
if(!opt_ptr)
|
||||||
|
{
|
||||||
|
if(opterr)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: invalid option -- %c\n", argv[0], c);
|
||||||
|
}
|
||||||
|
|
||||||
|
optopt = c;
|
||||||
|
c = '?';
|
||||||
|
|
||||||
|
/* Move onto the next option */
|
||||||
|
increment_index();
|
||||||
|
}
|
||||||
|
/* Option takes argument */
|
||||||
|
else if(opt_ptr[1] == ':')
|
||||||
|
{
|
||||||
|
/* ie, -oARGUMENT, -xxxoARGUMENT, etc. */
|
||||||
|
if(argv[argv_index][opt_offset] != '\0')
|
||||||
|
{
|
||||||
|
optarg = &argv[argv_index][opt_offset];
|
||||||
|
increment_index();
|
||||||
|
}
|
||||||
|
/* ie, -o ARGUMENT (only if it's a required argument) */
|
||||||
|
else if(opt_ptr[2] != ':')
|
||||||
|
{
|
||||||
|
/* One of those "you're not expected to understand this" moment */
|
||||||
|
if(argv_index2 < argv_index) argv_index2 = argv_index;
|
||||||
|
while(argv[++argv_index2] && argv[argv_index2][0] == '-');
|
||||||
|
optarg = argv[argv_index2];
|
||||||
|
|
||||||
|
/* Don't cross into the non-option argument list */
|
||||||
|
if(argv_index2 + nonopt >= prev_argc) optarg = NULL;
|
||||||
|
|
||||||
|
/* Move onto the next option */
|
||||||
|
increment_index();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Move onto the next option */
|
||||||
|
increment_index();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* In case we got no argument for an option with required argument */
|
||||||
|
if(optarg == NULL && opt_ptr[2] != ':')
|
||||||
|
{
|
||||||
|
optopt = c;
|
||||||
|
c = '?';
|
||||||
|
|
||||||
|
if(opterr)
|
||||||
|
{
|
||||||
|
fprintf(stderr,"%s: option requires an argument -- %c\n",
|
||||||
|
argv[0], optopt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Option does not take argument */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Next argv_index */
|
||||||
|
if(argv[argv_index][opt_offset] == '\0')
|
||||||
|
{
|
||||||
|
increment_index();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Calculate optind */
|
||||||
|
if(c == -1)
|
||||||
|
{
|
||||||
|
optind = argc - nonopt;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
optind = argv_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* vim:ts=3
|
||||||
|
*/
|
63
tests/getopt.h
Normal file
63
tests/getopt.h
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* getopt.h - competent and free getopt library.
|
||||||
|
* $Header: /cvsroot/freegetopt/freegetopt/getopt.h,v 1.2 2003/10/26 03:10:20 vindaci Exp $
|
||||||
|
*
|
||||||
|
* Copyright (c)2002-2003 Mark K. Kim
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* * Neither the original author of this software nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||||
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||||
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||||
|
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
||||||
|
* DAMAGE.
|
||||||
|
*/
|
||||||
|
#ifndef GETOPT_H_
|
||||||
|
#define GETOPT_H_
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
extern char* optarg;
|
||||||
|
extern int optind;
|
||||||
|
extern int opterr;
|
||||||
|
extern int optopt;
|
||||||
|
|
||||||
|
int getopt(int argc, char** argv, char* optstr);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* GETOPT_H_ */
|
||||||
|
|
||||||
|
|
||||||
|
/* vim:ts=3
|
||||||
|
*/
|
158
tests/iconify.c
Normal file
158
tests/iconify.c
Normal file
|
@ -0,0 +1,158 @@
|
||||||
|
//========================================================================
|
||||||
|
// Iconify/restore test program
|
||||||
|
// Copyright (c) Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
//
|
||||||
|
// This program is used to test the iconify/restore functionality for
|
||||||
|
// both fullscreen and windowed mode windows
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include <GL/glfw.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "getopt.h"
|
||||||
|
|
||||||
|
static void usage(void)
|
||||||
|
{
|
||||||
|
printf("iconify [-h] [-f]\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GLFWCALL key_callback(int key, int action)
|
||||||
|
{
|
||||||
|
printf("%0.2f Key %s\n",
|
||||||
|
glfwGetTime(),
|
||||||
|
action == GLFW_PRESS ? "pressed" : "released");
|
||||||
|
|
||||||
|
if (action != GLFW_PRESS)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case GLFW_KEY_SPACE:
|
||||||
|
glfwIconifyWindow();
|
||||||
|
break;
|
||||||
|
case GLFW_KEY_ESC:
|
||||||
|
glfwCloseWindow();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GLFWCALL size_callback(int width, int height)
|
||||||
|
{
|
||||||
|
glViewport(0, 0, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
int width, height, ch;
|
||||||
|
int mode = GLFW_WINDOW;
|
||||||
|
GLboolean active = -1, iconified = -1;
|
||||||
|
|
||||||
|
while ((ch = getopt(argc, argv, "fh")) != -1)
|
||||||
|
{
|
||||||
|
switch (ch)
|
||||||
|
{
|
||||||
|
case 'h':
|
||||||
|
usage();
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
|
||||||
|
case 'f':
|
||||||
|
mode = GLFW_FULLSCREEN;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!glfwInit())
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to initialize GLFW\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode == GLFW_FULLSCREEN)
|
||||||
|
{
|
||||||
|
GLFWvidmode mode;
|
||||||
|
glfwGetDesktopMode(&mode);
|
||||||
|
width = mode.Width;
|
||||||
|
height = mode.Height;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
width = 0;
|
||||||
|
height = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!glfwOpenWindow(width, height, 0, 0, 0, 0, 0, 0, mode))
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
fprintf(stderr, "Failed to open GLFW window\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwSetWindowTitle("Iconify");
|
||||||
|
glfwSwapInterval(1);
|
||||||
|
glfwSetKeyCallback(key_callback);
|
||||||
|
glfwSetWindowSizeCallback(size_callback);
|
||||||
|
|
||||||
|
glEnable(GL_SCISSOR_TEST);
|
||||||
|
|
||||||
|
while (glfwGetWindowParam(GLFW_OPENED))
|
||||||
|
{
|
||||||
|
int width, height;
|
||||||
|
|
||||||
|
if (iconified != glfwGetWindowParam(GLFW_ICONIFIED) ||
|
||||||
|
active != glfwGetWindowParam(GLFW_ACTIVE))
|
||||||
|
{
|
||||||
|
iconified = glfwGetWindowParam(GLFW_ICONIFIED);
|
||||||
|
active = glfwGetWindowParam(GLFW_ACTIVE);
|
||||||
|
|
||||||
|
printf("%0.2f %s %s\n",
|
||||||
|
glfwGetTime(),
|
||||||
|
iconified ? "Iconified" : "Restored",
|
||||||
|
active ? "Active" : "Inactive");
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwGetWindowSize(&width, &height);
|
||||||
|
|
||||||
|
glScissor(0, 0, width, height);
|
||||||
|
glClearColor(0, 0, 0, 0);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
glScissor(0, 0, 640, 480);
|
||||||
|
glClearColor(1, 1, 1, 0);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
glfwSwapBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
136
tests/joysticks.c
Normal file
136
tests/joysticks.c
Normal file
|
@ -0,0 +1,136 @@
|
||||||
|
/*========================================================================
|
||||||
|
* This is a small test application for GLFW.
|
||||||
|
* joystick input test.
|
||||||
|
*========================================================================*/
|
||||||
|
|
||||||
|
#include <GL/glfw.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#define MAX_AXES 10
|
||||||
|
#define MAX_BUTTONS 30
|
||||||
|
|
||||||
|
struct JoystickState
|
||||||
|
{
|
||||||
|
int present;
|
||||||
|
int num_axes;
|
||||||
|
int num_buttons;
|
||||||
|
float axes[MAX_AXES];
|
||||||
|
unsigned char buttons[MAX_BUTTONS];
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct JoystickState states[GLFW_JOYSTICK_LAST + 1];
|
||||||
|
|
||||||
|
int running;
|
||||||
|
int keyrepeat = 0;
|
||||||
|
int systemkeys = 1;
|
||||||
|
|
||||||
|
|
||||||
|
/*========================================================================
|
||||||
|
* Retrieve joystick states
|
||||||
|
*========================================================================*/
|
||||||
|
static void updateJoysticksState(void)
|
||||||
|
{
|
||||||
|
int joy;
|
||||||
|
|
||||||
|
for (joy = GLFW_JOYSTICK_1; joy < GLFW_JOYSTICK_LAST + 1; joy++)
|
||||||
|
{
|
||||||
|
printf("Updating information for joystick %d\n", joy);
|
||||||
|
states[joy].present = glfwGetJoystickParam(joy, GLFW_PRESENT);
|
||||||
|
if (states[joy].present == GL_TRUE)
|
||||||
|
{
|
||||||
|
states[joy].num_axes = glfwGetJoystickPos(joy, states[joy].axes, MAX_AXES);
|
||||||
|
states[joy].num_buttons = glfwGetJoystickButtons(joy, states[joy].buttons, MAX_BUTTONS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*========================================================================
|
||||||
|
* Print out the state of all joysticks on the standard output
|
||||||
|
*========================================================================*/
|
||||||
|
static void displayJoysticksState(void)
|
||||||
|
{
|
||||||
|
int joy;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (joy = GLFW_JOYSTICK_1; joy < GLFW_JOYSTICK_LAST + 1; joy++)
|
||||||
|
{
|
||||||
|
printf("Joystick %d: %s\n", joy, (states[joy].present == GL_TRUE ? "present" : "not connected"));
|
||||||
|
|
||||||
|
if (states[joy].present == GL_TRUE)
|
||||||
|
{
|
||||||
|
if (states[joy].num_axes > 0)
|
||||||
|
{
|
||||||
|
printf(" axes: %.3f", states[joy].axes[0]);
|
||||||
|
for (i = 1; i < states[joy].num_axes; i++)
|
||||||
|
printf(", %.3f", states[joy].axes[i]);
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
printf(" axes: none\n");
|
||||||
|
|
||||||
|
if (states[joy].num_buttons > 0)
|
||||||
|
{
|
||||||
|
printf(" buttons: 00 => %c", ((states[joy].buttons[0] == GLFW_PRESS) ? 'P' : 'R'));
|
||||||
|
|
||||||
|
for (i = 1; i < states[joy].num_buttons; i++)
|
||||||
|
printf(", %02d => %c", i, ((states[joy].buttons[i] == GLFW_PRESS) ? 'P' : 'R'));
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
printf(" buttons: none\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
double start;
|
||||||
|
double t;
|
||||||
|
double update;
|
||||||
|
|
||||||
|
/* Initialise GLFW */
|
||||||
|
glfwInit();
|
||||||
|
printf("The program will work for 20 seconds and display every seconds the state of the joysticks\n");
|
||||||
|
printf("Your computer is going to be very slow as the program is doing an active loop .....\n");
|
||||||
|
|
||||||
|
start = glfwGetTime();
|
||||||
|
update = start;
|
||||||
|
|
||||||
|
/* print the initial state of all joysticks */
|
||||||
|
updateJoysticksState();
|
||||||
|
printf("\n");
|
||||||
|
displayJoysticksState();
|
||||||
|
|
||||||
|
running = GL_TRUE;
|
||||||
|
|
||||||
|
/* Main loop */
|
||||||
|
while (running)
|
||||||
|
{
|
||||||
|
/* Get time */
|
||||||
|
t = glfwGetTime();
|
||||||
|
|
||||||
|
/* Display the state of all connected joysticks every secons */
|
||||||
|
if ((t - update) > 1.0)
|
||||||
|
{
|
||||||
|
update = t;
|
||||||
|
printf("\n");
|
||||||
|
updateJoysticksState();
|
||||||
|
printf("\n");
|
||||||
|
displayJoysticksState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if the window was closed */
|
||||||
|
if ((t - start) > 20.0)
|
||||||
|
running = GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Close OpenGL window and terminate GLFW */
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
137
tests/peter.c
Normal file
137
tests/peter.c
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
//========================================================================
|
||||||
|
// Mouse cursor bug test
|
||||||
|
// Copyright (c) Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
//
|
||||||
|
// This test came about as the result of bugs #1262764, #1726540 and
|
||||||
|
// #1726592, all reported by the user peterpp, hence the name
|
||||||
|
//
|
||||||
|
// The utility of this test outside of these bugs is uncertain
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include <GL/glfw.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
static GLboolean cursor_enabled = GL_TRUE;
|
||||||
|
|
||||||
|
static GLboolean open_window(void);
|
||||||
|
|
||||||
|
static void toggle_mouse_cursor(void)
|
||||||
|
{
|
||||||
|
if (cursor_enabled)
|
||||||
|
glfwDisable(GLFW_MOUSE_CURSOR);
|
||||||
|
else
|
||||||
|
glfwEnable(GLFW_MOUSE_CURSOR);
|
||||||
|
|
||||||
|
cursor_enabled = !cursor_enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GLFWCALL mouse_position_callback(int x, int y)
|
||||||
|
{
|
||||||
|
printf("Mouse moved to: %i %i\n", x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GLFWCALL key_callback(int key, int action)
|
||||||
|
{
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case GLFW_KEY_SPACE:
|
||||||
|
{
|
||||||
|
if (action == GLFW_PRESS)
|
||||||
|
toggle_mouse_cursor();
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'R':
|
||||||
|
{
|
||||||
|
if (action == GLFW_PRESS)
|
||||||
|
{
|
||||||
|
glfwCloseWindow();
|
||||||
|
open_window();
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GLFWCALL window_size_callback(int width, int height)
|
||||||
|
{
|
||||||
|
glViewport(0, 0, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GLboolean open_window(void)
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
if (!glfwOpenWindow(0, 0, 0, 0, 0, 0, 0, 0, GLFW_WINDOW))
|
||||||
|
return GL_FALSE;
|
||||||
|
|
||||||
|
glfwSetWindowTitle("Peter Detector");
|
||||||
|
|
||||||
|
glfwGetMousePos(&x, &y);
|
||||||
|
printf("Mouse position: %i %i\n", x, y);
|
||||||
|
|
||||||
|
glfwDisable(GLFW_AUTO_POLL_EVENTS);
|
||||||
|
glfwSetWindowSizeCallback(window_size_callback);
|
||||||
|
glfwSetMousePosCallback(mouse_position_callback);
|
||||||
|
glfwSetKeyCallback(key_callback);
|
||||||
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
if (!glfwInit())
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to initialize GLFW\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!open_window())
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
fprintf(stderr, "Failed to open GLFW window\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
glClearColor(0.f, 0.f, 0.f, 0.f);
|
||||||
|
|
||||||
|
while (glfwGetWindowParam(GLFW_OPENED))
|
||||||
|
{
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
glfwSwapBuffers();
|
||||||
|
glfwWaitEvents();
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
170
tests/reopen.c
Normal file
170
tests/reopen.c
Normal file
|
@ -0,0 +1,170 @@
|
||||||
|
//========================================================================
|
||||||
|
// Window re-opener (open/close stress test)
|
||||||
|
// Copyright (c) Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
//
|
||||||
|
// This test came about as the result of bug #1262773
|
||||||
|
//
|
||||||
|
// It closes and re-opens the GLFW window every five seconds, alternating
|
||||||
|
// between windowed and fullscreen mode
|
||||||
|
//
|
||||||
|
// It also times and logs opening and closing actions and attempts to separate
|
||||||
|
// user initiated window closing from its own
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include <GL/glfw.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
static GLboolean closed = GL_FALSE;
|
||||||
|
|
||||||
|
static const char* get_mode_name(int mode)
|
||||||
|
{
|
||||||
|
switch (mode)
|
||||||
|
{
|
||||||
|
case GLFW_WINDOW:
|
||||||
|
return "windowed";
|
||||||
|
case GLFW_FULLSCREEN:
|
||||||
|
return "fullscreen";
|
||||||
|
default:
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GLFWCALL window_size_callback(int width, int height)
|
||||||
|
{
|
||||||
|
glViewport(0, 0, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int GLFWCALL window_close_callback(void)
|
||||||
|
{
|
||||||
|
printf("Close callback triggered\n");
|
||||||
|
closed = GL_TRUE;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GLFWCALL key_callback(int key, int action)
|
||||||
|
{
|
||||||
|
if (action != GLFW_PRESS)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case 'Q':
|
||||||
|
case GLFW_KEY_ESC:
|
||||||
|
closed = GL_TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int open_window(int width, int height, int mode)
|
||||||
|
{
|
||||||
|
double base = glfwGetTime();
|
||||||
|
|
||||||
|
if (!glfwOpenWindow(width, height, 0, 0, 0, 0, 16, 0, mode))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to create %s mode GLFW window\n", get_mode_name(mode));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwSetWindowTitle("Window Re-opener");
|
||||||
|
glfwSetWindowSizeCallback(window_size_callback);
|
||||||
|
glfwSetWindowCloseCallback(window_close_callback);
|
||||||
|
glfwSetKeyCallback(key_callback);
|
||||||
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
|
printf("Opening %s mode window took %0.3f seconds\n",
|
||||||
|
get_mode_name(mode),
|
||||||
|
glfwGetTime() - base);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void close_window(void)
|
||||||
|
{
|
||||||
|
double base = glfwGetTime();
|
||||||
|
|
||||||
|
glfwCloseWindow();
|
||||||
|
|
||||||
|
printf("Closing window took %0.3f seconds\n", glfwGetTime() - base);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
if (!glfwInit())
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to initialize GLFW\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if (!open_window(640, 480, (count & 1) ? GLFW_FULLSCREEN : GLFW_WINDOW))
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glOrtho(-1.f, 1.f, -1.f, 1.f, 1.f, -1.f);
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
|
||||||
|
glClearColor(0.f, 0.f, 0.f, 0.f);
|
||||||
|
glColor3f(1.f, 1.f, 1.f);
|
||||||
|
|
||||||
|
glfwSetTime(0.0);
|
||||||
|
|
||||||
|
while (glfwGetTime() < 5.0)
|
||||||
|
{
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
glPushMatrix();
|
||||||
|
glRotatef((GLfloat) glfwGetTime() * 100.f, 0.f, 0.f, 1.f);
|
||||||
|
glRectf(-0.5f, -0.5f, 1.f, 1.f);
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
glfwSwapBuffers();
|
||||||
|
|
||||||
|
if (closed)
|
||||||
|
close_window();
|
||||||
|
|
||||||
|
if (!glfwGetWindowParam(GLFW_OPENED))
|
||||||
|
{
|
||||||
|
printf("User closed window\n");
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Closing window\n");
|
||||||
|
close_window();
|
||||||
|
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
84
tests/tearing.c
Normal file
84
tests/tearing.c
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
//========================================================================
|
||||||
|
// Vsync enabling test
|
||||||
|
// Copyright (c) Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
//
|
||||||
|
// This test renders a high contrast, horizontally moving bar, allowing for
|
||||||
|
// visual verification of whether the set swap interval is indeed obeyed
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include <GL/glfw.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
static void GLFWCALL window_size_callback(int width, int height)
|
||||||
|
{
|
||||||
|
glViewport(0, 0, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
float position;
|
||||||
|
|
||||||
|
if (!glfwInit())
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to initialize GLFW\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!glfwOpenWindow(0, 0, 0, 0, 0, 0, 0, 0, GLFW_WINDOW))
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
fprintf(stderr, "Failed to open GLFW window\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwSetWindowTitle("Tearing Detector");
|
||||||
|
glfwSetWindowSizeCallback(window_size_callback);
|
||||||
|
glfwSwapInterval(1);
|
||||||
|
|
||||||
|
glClearColor(0.f, 0.f, 0.f, 0.f);
|
||||||
|
glColor3f(1.f, 1.f, 1.f);
|
||||||
|
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glOrtho(-1.f, 1.f, -1.f, 1.f, 1.f, -1.f);
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
|
||||||
|
while (glfwGetWindowParam(GLFW_OPENED) == GL_TRUE)
|
||||||
|
{
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
position = cosf(glfwGetTime() * 4.f) * 0.75f;
|
||||||
|
glRectf(position - 0.25f, -1.f, position + 0.25f, 1.f);
|
||||||
|
|
||||||
|
glfwSwapBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
253
tests/version.c
Normal file
253
tests/version.c
Normal file
|
@ -0,0 +1,253 @@
|
||||||
|
//========================================================================
|
||||||
|
// Version information dumper
|
||||||
|
// Copyright (c) Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would
|
||||||
|
// be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
// be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
//
|
||||||
|
// This test is a pale imitation of glxinfo(1), except not really
|
||||||
|
//
|
||||||
|
// It dumps GLFW and OpenGL version information
|
||||||
|
//
|
||||||
|
//========================================================================
|
||||||
|
|
||||||
|
#include <GL/glfw.h>
|
||||||
|
|
||||||
|
#ifndef GL_VERSION_3_2
|
||||||
|
#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001
|
||||||
|
#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002
|
||||||
|
#define GL_CONTEXT_PROFILE_MASK 0x9126
|
||||||
|
#define GL_NUM_EXTENSIONS 0x821D
|
||||||
|
#define GL_CONTEXT_FLAGS 0x821E
|
||||||
|
#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef const GLubyte * (APIENTRY *PFNGLGETSTRINGI) (GLenum, GLuint);
|
||||||
|
|
||||||
|
#ifndef GL_VERSION_2_0
|
||||||
|
#define GL_SHADING_LANGUAGE_VERSION 0x8B8C
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#define strcasecmp(x, y) _stricmp(x, y)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "getopt.h"
|
||||||
|
|
||||||
|
static void usage(void)
|
||||||
|
{
|
||||||
|
printf("version [-h] [-m MAJOR] [-n MINOR] [-d] [-l] [-f] [-p PROFILE]\n");
|
||||||
|
printf("available profiles: core compat\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char* get_profile_name(GLint mask)
|
||||||
|
{
|
||||||
|
if (mask & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT)
|
||||||
|
return "compatibility";
|
||||||
|
if (mask & GL_CONTEXT_CORE_PROFILE_BIT)
|
||||||
|
return "core";
|
||||||
|
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
static void list_extensions(int major, int minor)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
GLint count;
|
||||||
|
const GLubyte* extensions;
|
||||||
|
|
||||||
|
printf("OpenGL context supported extensions:\n");
|
||||||
|
|
||||||
|
if (major > 2)
|
||||||
|
{
|
||||||
|
PFNGLGETSTRINGI glGetStringi = (PFNGLGETSTRINGI) glfwGetProcAddress("glGetStringi");
|
||||||
|
if (!glGetStringi)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to retrieve glGetStringi entry point");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
glGetIntegerv(GL_NUM_EXTENSIONS, &count);
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
puts((const char*) glGetStringi(GL_EXTENSIONS, i));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
extensions = glGetString(GL_EXTENSIONS);
|
||||||
|
while (*extensions != '\0')
|
||||||
|
{
|
||||||
|
if (*extensions == ' ')
|
||||||
|
putchar('\n');
|
||||||
|
else
|
||||||
|
putchar(*extensions);
|
||||||
|
|
||||||
|
extensions++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
int ch, profile = 0, major = 1, minor = 1, revision;
|
||||||
|
GLboolean debug = GL_FALSE, forward = GL_FALSE, list = GL_FALSE;
|
||||||
|
GLint flags, mask;
|
||||||
|
|
||||||
|
while ((ch = getopt(argc, argv, "dfhlm:n:p:")) != -1)
|
||||||
|
{
|
||||||
|
switch (ch)
|
||||||
|
{
|
||||||
|
case 'd':
|
||||||
|
debug = GL_TRUE;
|
||||||
|
break;
|
||||||
|
case 'f':
|
||||||
|
forward = GL_TRUE;
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
usage();
|
||||||
|
exit(0);
|
||||||
|
case 'l':
|
||||||
|
list = GL_TRUE;
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
major = atoi(optarg);
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
minor = atoi(optarg);
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
if (strcasecmp(optarg, "core") == 0)
|
||||||
|
profile = GLFW_OPENGL_CORE_PROFILE;
|
||||||
|
else if (strcasecmp(optarg, "compat") == 0)
|
||||||
|
profile = GLFW_OPENGL_COMPAT_PROFILE;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
usage();
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
argc -= optind;
|
||||||
|
argv += optind;
|
||||||
|
|
||||||
|
if (!glfwInit())
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to initialize GLFW\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (major != 1 || minor != 1)
|
||||||
|
{
|
||||||
|
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, major);
|
||||||
|
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, minor);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
glfwOpenWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);
|
||||||
|
|
||||||
|
if (forward)
|
||||||
|
glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
|
||||||
|
|
||||||
|
if (profile != 0)
|
||||||
|
glfwOpenWindowHint(GLFW_OPENGL_PROFILE, profile);
|
||||||
|
|
||||||
|
// We assume here that we stand a better chance of success by leaving all
|
||||||
|
// possible details of pixel format selection to GLFW
|
||||||
|
|
||||||
|
if (!glfwOpenWindow(0, 0, 0, 0, 0, 0, 0, 0, GLFW_WINDOW))
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
fprintf(stderr, "Failed to open GLFW window\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Report GLFW version
|
||||||
|
|
||||||
|
glfwGetVersion(&major, &minor, &revision);
|
||||||
|
|
||||||
|
printf("GLFW header version: %u.%u.%u\n",
|
||||||
|
GLFW_VERSION_MAJOR,
|
||||||
|
GLFW_VERSION_MINOR,
|
||||||
|
GLFW_VERSION_REVISION);
|
||||||
|
|
||||||
|
printf("GLFW library version: %u.%u.%u\n", major, minor, revision);
|
||||||
|
|
||||||
|
if (major != GLFW_VERSION_MAJOR ||
|
||||||
|
minor != GLFW_VERSION_MINOR ||
|
||||||
|
revision != GLFW_VERSION_REVISION)
|
||||||
|
printf("*** WARNING: GLFW version mismatch! ***\n");
|
||||||
|
|
||||||
|
// Report OpenGL version
|
||||||
|
|
||||||
|
printf("OpenGL context version string: \"%s\"\n", glGetString(GL_VERSION));
|
||||||
|
|
||||||
|
glfwGetGLVersion(&major, &minor, &revision);
|
||||||
|
|
||||||
|
printf("OpenGL context version parsed by GLFW: %u.%u.%u\n", major, minor, revision);
|
||||||
|
|
||||||
|
// Report OpenGL context properties
|
||||||
|
|
||||||
|
if (major >= 3)
|
||||||
|
{
|
||||||
|
glGetIntegerv(GL_CONTEXT_FLAGS, &flags);
|
||||||
|
printf("OpenGL context flags:");
|
||||||
|
|
||||||
|
if (flags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT)
|
||||||
|
puts(" forward-compatible");
|
||||||
|
else
|
||||||
|
puts(" none");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (major > 3 || (major == 3 && minor >= 2))
|
||||||
|
{
|
||||||
|
glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &mask);
|
||||||
|
printf("OpenGL profile mask: 0x%08x (%s)\n", mask, get_profile_name(mask));
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("OpenGL context renderer string: \"%s\"\n", glGetString(GL_RENDERER));
|
||||||
|
printf("OpenGL context vendor string: \"%s\"\n", glGetString(GL_VENDOR));
|
||||||
|
|
||||||
|
if (major > 1)
|
||||||
|
{
|
||||||
|
printf("OpenGL context shading language version: \"%s\"\n",
|
||||||
|
glGetString(GL_SHADING_LANGUAGE_VERSION));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Report OpenGL extensions
|
||||||
|
if (list)
|
||||||
|
list_extensions(major, minor);
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user