This commit is contained in:
stojce 2014-01-16 18:39:21 +01:00
parent 50ad5a4ec8
commit a401d822a3
183 changed files with 30552 additions and 2593 deletions
CMakeLists.txt
assignment-client
cmake
domain-server
externals/winsdk
interface

View file

@ -2,7 +2,14 @@ cmake_minimum_required(VERSION 2.8)
project(hifi)
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} $ENV{QT_CMAKE_PREFIX_PATH})
IF (WIN32)
include_directories(SYSTEM "externals/winsdk")
add_definitions( -DNOMINMAX -D_CRT_SECURE_NO_WARNINGS )
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1 ")
ENDIF(WIN32)
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} $ENV{QT_CMAKE_PREFIX_PATH} )
# set our Base SDK to 10.8
set(CMAKE_OSX_SYSROOT /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk)
@ -21,7 +28,12 @@ IF (APPLE)
ENDIF (DARWIN_VERSION GREATER 12)
ENDIF(APPLE)
# targets not supported on windows
if (NOT WIN32)
add_subdirectory(animation-server)
endif (NOT WIN32)
# targets on all platforms
add_subdirectory(assignment-client)
add_subdirectory(domain-server)
add_subdirectory(interface)

View file

@ -41,3 +41,7 @@ include_directories(${ROOT_DIR}/externals/civetweb/include)
if (UNIX)
target_link_libraries(${TARGET_NAME} ${CMAKE_DL_LIBS})
endif (UNIX)
IF (WIN32)
target_link_libraries(${TARGET_NAME} Winmm)
ENDIF(WIN32)

View file

@ -64,7 +64,7 @@ void attachNewBufferToNode(Node *newNode) {
AudioMixer::AudioMixer(const unsigned char* dataBuffer, int numBytes) :
ThreadedAssignment(dataBuffer, numBytes)
{
}
void AudioMixer::addBufferToMixForListeningNodeWithBuffer(PositionalAudioRingBuffer* bufferToAdd,
@ -73,79 +73,79 @@ void AudioMixer::addBufferToMixForListeningNodeWithBuffer(PositionalAudioRingBuf
float attenuationCoefficient = 1.0f;
int numSamplesDelay = 0;
float weakChannelAmplitudeRatio = 1.0f;
const int PHASE_DELAY_AT_90 = 20;
if (bufferToAdd != listeningNodeBuffer) {
// if the two buffer pointers do not match then these are different buffers
glm::vec3 listenerPosition = listeningNodeBuffer->getPosition();
glm::vec3 relativePosition = bufferToAdd->getPosition() - listeningNodeBuffer->getPosition();
glm::quat inverseOrientation = glm::inverse(listeningNodeBuffer->getOrientation());
float distanceSquareToSource = glm::dot(relativePosition, relativePosition);
float radius = 0.0f;
if (bufferToAdd->getType() == PositionalAudioRingBuffer::Injector) {
InjectedAudioRingBuffer* injectedBuffer = (InjectedAudioRingBuffer*) bufferToAdd;
radius = injectedBuffer->getRadius();
attenuationCoefficient *= injectedBuffer->getAttenuationRatio();
}
if (radius == 0 || (distanceSquareToSource > radius * radius)) {
// this is either not a spherical source, or the listener is outside the sphere
if (radius > 0) {
// this is a spherical source - the distance used for the coefficient
// needs to be the closest point on the boundary to the source
// ovveride the distance to the node with the distance to the point on the
// boundary of the sphere
distanceSquareToSource -= (radius * radius);
} else {
// calculate the angle delivery for off-axis attenuation
glm::vec3 rotatedListenerPosition = glm::inverse(bufferToAdd->getOrientation()) * relativePosition;
float angleOfDelivery = glm::angle(glm::vec3(0.0f, 0.0f, -1.0f),
glm::normalize(rotatedListenerPosition));
const float MAX_OFF_AXIS_ATTENUATION = 0.2f;
const float OFF_AXIS_ATTENUATION_FORMULA_STEP = (1 - MAX_OFF_AXIS_ATTENUATION) / 2.0f;
float offAxisCoefficient = MAX_OFF_AXIS_ATTENUATION +
(OFF_AXIS_ATTENUATION_FORMULA_STEP * (angleOfDelivery / 90.0f));
// multiply the current attenuation coefficient by the calculated off axis coefficient
attenuationCoefficient *= offAxisCoefficient;
}
glm::vec3 rotatedSourcePosition = inverseOrientation * relativePosition;
const float DISTANCE_SCALE = 2.5f;
const float GEOMETRIC_AMPLITUDE_SCALAR = 0.3f;
const float DISTANCE_LOG_BASE = 2.5f;
const float DISTANCE_SCALE_LOG = logf(DISTANCE_SCALE) / logf(DISTANCE_LOG_BASE);
// calculate the distance coefficient using the distance to this node
float distanceCoefficient = powf(GEOMETRIC_AMPLITUDE_SCALAR,
DISTANCE_SCALE_LOG +
(0.5f * logf(distanceSquareToSource) / logf(DISTANCE_LOG_BASE)) - 1);
distanceCoefficient = std::min(1.0f, distanceCoefficient);
// multiply the current attenuation coefficient by the distance coefficient
attenuationCoefficient *= distanceCoefficient;
// project the rotated source position vector onto the XZ plane
rotatedSourcePosition.y = 0.0f;
// produce an oriented angle about the y-axis
bearingRelativeAngleToSource = glm::orientedAngle(glm::vec3(0.0f, 0.0f, -1.0f),
glm::normalize(rotatedSourcePosition),
glm::vec3(0.0f, 1.0f, 0.0f));
const float PHASE_AMPLITUDE_RATIO_AT_90 = 0.5;
// figure out the number of samples of delay and the ratio of the amplitude
// in the weak channel for audio spatialization
float sinRatio = fabsf(sinf(glm::radians(bearingRelativeAngleToSource)));
@ -153,11 +153,11 @@ void AudioMixer::addBufferToMixForListeningNodeWithBuffer(PositionalAudioRingBuf
weakChannelAmplitudeRatio = 1 - (PHASE_AMPLITUDE_RATIO_AT_90 * sinRatio);
}
}
// if the bearing relative angle to source is > 0 then the delayed channel is the right one
int delayedChannelOffset = (bearingRelativeAngleToSource > 0.0f) ? 1 : 0;
int goodChannelOffset = delayedChannelOffset == 0 ? 1 : 0;
for (int s = 0; s < NETWORK_BUFFER_LENGTH_SAMPLES_STEREO; s += 2) {
if ((s / 2) < numSamplesDelay) {
// pull the earlier sample for the delayed channel
@ -165,12 +165,12 @@ void AudioMixer::addBufferToMixForListeningNodeWithBuffer(PositionalAudioRingBuf
_clientSamples[s + delayedChannelOffset] = glm::clamp(_clientSamples[s + delayedChannelOffset] + earlierSample,
MIN_SAMPLE_VALUE, MAX_SAMPLE_VALUE);
}
// pull the current sample for the good channel
int16_t currentSample = (*bufferToAdd)[s / 2] * attenuationCoefficient;
_clientSamples[s + goodChannelOffset] = glm::clamp(_clientSamples[s + goodChannelOffset] + currentSample,
MIN_SAMPLE_VALUE, MAX_SAMPLE_VALUE);
if ((s / 2) + numSamplesDelay < NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL) {
// place the current sample at the right spot in the delayed channel
int16_t clampedSample = glm::clamp((int) (_clientSamples[s + (numSamplesDelay * 2) + delayedChannelOffset]
@ -183,20 +183,20 @@ void AudioMixer::addBufferToMixForListeningNodeWithBuffer(PositionalAudioRingBuf
void AudioMixer::prepareMixForListeningNode(Node* node) {
AvatarAudioRingBuffer* nodeRingBuffer = ((AudioMixerClientData*) node->getLinkedData())->getAvatarAudioRingBuffer();
// zero out the client mix for this node
memset(_clientSamples, 0, sizeof(_clientSamples));
// loop through all other nodes that have sufficient audio to mix
foreach (const SharedNodePointer& otherNode, NodeList::getInstance()->getNodeHash()) {
if (otherNode->getLinkedData()) {
AudioMixerClientData* otherNodeClientData = (AudioMixerClientData*) otherNode->getLinkedData();
// enumerate the ARBs attached to the otherNode and add all that should be added to mix
for (int i = 0; i < otherNodeClientData->getRingBuffers().size(); i++) {
for (unsigned int i = 0; i < otherNodeClientData->getRingBuffers().size(); i++) {
PositionalAudioRingBuffer* otherNodeBuffer = otherNodeClientData->getRingBuffers()[i];
if ((*otherNode != *node
|| otherNodeBuffer->shouldLoopbackForNode())
&& otherNodeBuffer->willBeAddedToMix()) {
@ -215,14 +215,14 @@ void AudioMixer::processDatagram(const QByteArray& dataByteArray, const HifiSock
|| dataByteArray[0] == PACKET_TYPE_INJECT_AUDIO) {
QUuid nodeUUID = QUuid::fromRfc4122(dataByteArray.mid(numBytesForPacketHeader((unsigned char*) dataByteArray.data()),
NUM_BYTES_RFC4122_UUID));
NodeList* nodeList = NodeList::getInstance();
SharedNodePointer matchingNode = nodeList->nodeWithUUID(nodeUUID);
if (matchingNode) {
nodeList->updateNodeWithData(matchingNode.data(), senderSockAddr, (unsigned char*) dataByteArray.data(), dataByteArray.size());
if (!matchingNode->getActiveSocket()) {
// we don't have an active socket for this node, but they're talking to us
// this means they've heard from us and can reply, let's assume public is active
@ -236,33 +236,38 @@ void AudioMixer::processDatagram(const QByteArray& dataByteArray, const HifiSock
}
void AudioMixer::run() {
commonInit(AUDIO_MIXER_LOGGING_TARGET_NAME, NODE_TYPE_AUDIO_MIXER);
NodeList* nodeList = NodeList::getInstance();
const char AUDIO_MIXER_NODE_TYPES_OF_INTEREST[2] = { NODE_TYPE_AGENT, NODE_TYPE_AUDIO_INJECTOR };
nodeList->setNodeTypesOfInterest(AUDIO_MIXER_NODE_TYPES_OF_INTEREST, sizeof(AUDIO_MIXER_NODE_TYPES_OF_INTEREST));
nodeList->linkedDataCreateCallback = attachNewBufferToNode;
int nextFrame = 0;
timeval startTime;
gettimeofday(&startTime, NULL);
int numBytesPacketHeader = numBytesForPacketHeader((unsigned char*) &PACKET_TYPE_MIXED_AUDIO);
// note: Visual Studio 2010 doesn't support variable sized local arrays
#ifdef _WIN32
unsigned char clientPacket[MAX_PACKET_SIZE];
#else
unsigned char clientPacket[NETWORK_BUFFER_LENGTH_BYTES_STEREO + numBytesPacketHeader];
#endif
populateTypeAndVersion(clientPacket, PACKET_TYPE_MIXED_AUDIO);
while (!_isFinished) {
QCoreApplication::processEvents();
if (_isFinished) {
break;
}
foreach (const SharedNodePointer& node, nodeList->getNodeHash()) {
if (node->getLinkedData()) {
((AudioMixerClientData*) node->getLinkedData())->checkBuffersBeforeFrameSend(JITTER_BUFFER_SAMPLES);
@ -273,29 +278,28 @@ void AudioMixer::run() {
if (node->getType() == NODE_TYPE_AGENT && node->getActiveSocket() && node->getLinkedData()
&& ((AudioMixerClientData*) node->getLinkedData())->getAvatarAudioRingBuffer()) {
prepareMixForListeningNode(node.data());
memcpy(clientPacket + numBytesPacketHeader, _clientSamples, sizeof(_clientSamples));
nodeList->getNodeSocket().writeDatagram((char*) clientPacket, sizeof(clientPacket),
node->getActiveSocket()->getAddress(),
node->getActiveSocket()->getPort());
}
}
// push forward the next output pointers for any audio buffers we used
foreach (const SharedNodePointer& node, nodeList->getNodeHash()) {
if (node->getLinkedData()) {
((AudioMixerClientData*) node->getLinkedData())->pushBuffersAfterFrameSend();
}
}
int usecToSleep = usecTimestamp(&startTime) + (++nextFrame * BUFFER_SEND_INTERVAL_USECS) - usecTimestampNow();
if (usecToSleep > 0) {
usleep(usecToSleep);
} else {
qDebug() << "AudioMixer loop took" << -usecToSleep << "of extra time. Not sleeping.";
}
}
}

View file

@ -14,19 +14,19 @@
#include "AudioMixerClientData.h"
AudioMixerClientData::~AudioMixerClientData() {
for (int i = 0; i < _ringBuffers.size(); i++) {
for (unsigned int i = 0; i < _ringBuffers.size(); i++) {
// delete this attached PositionalAudioRingBuffer
delete _ringBuffers[i];
}
}
AvatarAudioRingBuffer* AudioMixerClientData::getAvatarAudioRingBuffer() const {
for (int i = 0; i < _ringBuffers.size(); i++) {
for (unsigned int i = 0; i < _ringBuffers.size(); i++) {
if (_ringBuffers[i]->getType() == PositionalAudioRingBuffer::Microphone) {
return (AvatarAudioRingBuffer*) _ringBuffers[i];
}
}
// no AvatarAudioRingBuffer found - return NULL
return NULL;
}
@ -34,49 +34,49 @@ AvatarAudioRingBuffer* AudioMixerClientData::getAvatarAudioRingBuffer() const {
int AudioMixerClientData::parseData(unsigned char* packetData, int numBytes) {
if (packetData[0] == PACKET_TYPE_MICROPHONE_AUDIO_WITH_ECHO
|| packetData[0] == PACKET_TYPE_MICROPHONE_AUDIO_NO_ECHO) {
// grab the AvatarAudioRingBuffer from the vector (or create it if it doesn't exist)
AvatarAudioRingBuffer* avatarRingBuffer = getAvatarAudioRingBuffer();
if (!avatarRingBuffer) {
// we don't have an AvatarAudioRingBuffer yet, so add it
avatarRingBuffer = new AvatarAudioRingBuffer();
_ringBuffers.push_back(avatarRingBuffer);
}
// ask the AvatarAudioRingBuffer instance to parse the data
avatarRingBuffer->parseData(packetData, numBytes);
} else {
// this is injected audio
// grab the stream identifier for this injected audio
QByteArray rfcUUID = QByteArray((char*) packetData + numBytesForPacketHeader(packetData) + NUM_BYTES_RFC4122_UUID,
NUM_BYTES_RFC4122_UUID);
QUuid streamIdentifier = QUuid::fromRfc4122(rfcUUID);
InjectedAudioRingBuffer* matchingInjectedRingBuffer = NULL;
for (int i = 0; i < _ringBuffers.size(); i++) {
for (unsigned int i = 0; i < _ringBuffers.size(); i++) {
if (_ringBuffers[i]->getType() == PositionalAudioRingBuffer::Injector
&& ((InjectedAudioRingBuffer*) _ringBuffers[i])->getStreamIdentifier() == streamIdentifier) {
matchingInjectedRingBuffer = (InjectedAudioRingBuffer*) _ringBuffers[i];
}
}
if (!matchingInjectedRingBuffer) {
// we don't have a matching injected audio ring buffer, so add it
matchingInjectedRingBuffer = new InjectedAudioRingBuffer(streamIdentifier);
_ringBuffers.push_back(matchingInjectedRingBuffer);
}
matchingInjectedRingBuffer->parseData(packetData, numBytes);
}
return 0;
}
void AudioMixerClientData::checkBuffersBeforeFrameSend(int jitterBufferLengthSamples) {
for (int i = 0; i < _ringBuffers.size(); i++) {
for (unsigned int i = 0; i < _ringBuffers.size(); i++) {
if (_ringBuffers[i]->shouldBeAddedToMix(jitterBufferLengthSamples)) {
// this is a ring buffer that is ready to go
// set its flag so we know to push its buffer when all is said and done
@ -86,13 +86,13 @@ void AudioMixerClientData::checkBuffersBeforeFrameSend(int jitterBufferLengthSam
}
void AudioMixerClientData::pushBuffersAfterFrameSend() {
for (int i = 0; i < _ringBuffers.size(); i++) {
for (unsigned int i = 0; i < _ringBuffers.size(); i++) {
// this was a used buffer, push the output pointer forwards
PositionalAudioRingBuffer* audioBuffer = _ringBuffers[i];
if (audioBuffer->willBeAddedToMix()) {
audioBuffer->shiftReadPosition(NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL);
audioBuffer->setWillBeAddedToMix(false);
} else if (audioBuffer->getType() == PositionalAudioRingBuffer::Injector
&& audioBuffer->hasStarted() && audioBuffer->isStarved()) {

View file

@ -2,5 +2,7 @@ MACRO(INCLUDE_GLM TARGET ROOT_DIR)
set(GLM_ROOT_DIR ${ROOT_DIR}/externals)
find_package(GLM REQUIRED)
include_directories(${GLM_INCLUDE_DIRS})
IF(APPLE OR UNIX)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${GLM_INCLUDE_DIRS}")
ENDIF(APPLE OR UNIX)
ENDMACRO(INCLUDE_GLM _target _root_dir)

View file

@ -22,15 +22,29 @@ else (FACESHIFT_LIBRARIES AND FACESHIFT_INCLUDE_DIRS)
find_library(FACESHIFT_LIBRARIES libfaceshift.a ${FACESHIFT_ROOT_DIR}/lib/MacOS/)
elseif (UNIX)
find_library(FACESHIFT_LIBRARIES libfaceshift.a ${FACESHIFT_ROOT_DIR}/lib/UNIX/)
elseif (WIN32)
# For windows, we're going to build the faceshift sources directly into the interface build
# and not link to a prebuilt library. This is because the VS2010 linker doesn't like cross-linking
# between release and debug libraries. If we change that in the future we can make win32 more
# like the other platforms
#find_library(FACESHIFT_LIBRARIES faceshift.lib ${FACESHIFT_ROOT_DIR}/lib/WIN32/)
endif ()
if (FACESHIFT_INCLUDE_DIRS AND FACESHIFT_LIBRARIES)
set(FACESHIFT_FOUND TRUE)
endif (FACESHIFT_INCLUDE_DIRS AND FACESHIFT_LIBRARIES)
if (WIN32)
# Windows only cares about the headers
if (FACESHIFT_INCLUDE_DIRS)
set(FACESHIFT_FOUND TRUE)
endif (FACESHIFT_INCLUDE_DIRS AND FACESHIFT_LIBRARIES)
else (WIN32)
# Mac and Unix requires libraries
if (FACESHIFT_INCLUDE_DIRS AND FACESHIFT_LIBRARIES)
set(FACESHIFT_FOUND TRUE)
endif (FACESHIFT_INCLUDE_DIRS AND FACESHIFT_LIBRARIES)
endif (WIN32)
if (FACESHIFT_FOUND)
if (NOT FACESHIFT_FIND_QUIETLY)
message(STATUS "Found Faceshift: ${FACESHIFT_LIBRARIES}")
message(STATUS "Found Faceshift... ${FACESHIFT_LIBRARIES}")
endif (NOT FACESHIFT_FIND_QUIETLY)
else (FACESHIFT_FOUND)
if (FACESHIFT_FIND_REQUIRED)

View file

@ -23,6 +23,8 @@ else (OPENCV_LIBRARIES AND OPENCV_INCLUDE_DIRS)
find_library(OPENCV_LIBRARY_${MODULE} libopencv_${MODULE}.a ${OPENCV_ROOT_DIR}/lib/MacOS/)
elseif (UNIX)
find_library(OPENCV_LIBRARY_${MODULE} libopencv_${MODULE}.a ${OPENCV_ROOT_DIR}/lib/UNIX/)
elseif (WIN32)
find_library(OPENCV_LIBRARY_${MODULE} opencv_${MODULE}.lib ${OPENCV_ROOT_DIR}/lib/Win32/)
endif ()
set(MODULE_LIBRARIES ${OPENCV_LIBRARY_${MODULE}} ${MODULE_LIBRARIES})
endforeach (MODULE)

View file

@ -14,12 +14,12 @@ include_glm(${TARGET_NAME} ${ROOT_DIR})
include(${MACRO_DIR}/SetupHifiProject.cmake)
# grab cJSON and civetweb sources to pass as OPTIONAL_SRCS
# grab cJSON and civetweb sources to pass as OPTIONAL_SRCS
FILE(GLOB OPTIONAL_SRCS ${ROOT_DIR}/externals/civetweb/src/*)
setup_hifi_project(${TARGET_NAME} TRUE ${OPTIONAL_SRCS})
include_directories(${ROOT_DIR}/externals/civetweb/include)
include_directories(SYSTEM ${ROOT_DIR}/externals/civetweb/include)
# remove and then copy the files for the webserver
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
@ -37,4 +37,8 @@ link_hifi_library(shared ${TARGET_NAME} ${ROOT_DIR})
# link dl library on UNIX for civetweb
if (UNIX AND NOT APPLE)
target_link_libraries(${TARGET_NAME} ${CMAKE_DL_LIBS})
endif (UNIX AND NOT APPLE)
endif (UNIX AND NOT APPLE)
IF (WIN32)
target_link_libraries(${TARGET_NAME} Winmm)
ENDIF(WIN32)

View file

@ -6,7 +6,6 @@
// Copyright (c) 2013 HighFidelity, Inc. All rights reserved.
//
#include <arpa/inet.h>
#include <signal.h>
#include <QtCore/QJsonDocument>
@ -41,86 +40,88 @@ DomainServer::DomainServer(int argc, char* argv[]) :
_hasCompletedRestartHold(false)
{
DomainServer::setDomainServerInstance(this);
signal(SIGINT, signalhandler);
const char CUSTOM_PORT_OPTION[] = "-p";
const char* customPortString = getCmdOption(argc, (const char**) argv, CUSTOM_PORT_OPTION);
unsigned short domainServerPort = customPortString ? atoi(customPortString) : DEFAULT_DOMAIN_SERVER_PORT;
NodeList* nodeList = NodeList::createInstance(NODE_TYPE_DOMAIN, domainServerPort);
const char VOXEL_CONFIG_OPTION[] = "--voxelServerConfig";
_voxelServerConfig = getCmdOption(argc, (const char**) argv, VOXEL_CONFIG_OPTION);
const char PARTICLE_CONFIG_OPTION[] = "--particleServerConfig";
_particleServerConfig = getCmdOption(argc, (const char**) argv, PARTICLE_CONFIG_OPTION);
const char METAVOXEL_CONFIG_OPTION[] = "--metavoxelServerConfig";
_metavoxelServerConfig = getCmdOption(argc, (const char**)argv, METAVOXEL_CONFIG_OPTION);
// setup the mongoose web server
struct mg_callbacks callbacks = {};
QString documentRootString = QString("%1/resources/web").arg(QCoreApplication::applicationDirPath());
char documentRoot[documentRootString.size() + 1];
char* documentRoot = new char[documentRootString.size() + 1];
strcpy(documentRoot, documentRootString.toLocal8Bit().constData());
// list of options. Last element must be NULL.
const char* options[] = {"listening_ports", "8080",
"document_root", documentRoot, NULL};
callbacks.begin_request = civetwebRequestHandler;
callbacks.upload = civetwebUploadHandler;
// Start the web server.
mg_start(&callbacks, NULL, options);
connect(nodeList, SIGNAL(nodeKilled(SharedNodePointer)), this, SLOT(nodeKilled(SharedNodePointer)));
if (!_staticAssignmentFile.exists() || _voxelServerConfig) {
if (_voxelServerConfig) {
// we have a new VS config, clear the existing file to start fresh
_staticAssignmentFile.remove();
}
prepopulateStaticAssignmentFile();
}
_staticAssignmentFile.open(QIODevice::ReadWrite);
_staticAssignmentFileData = _staticAssignmentFile.map(0, _staticAssignmentFile.size());
_staticAssignments = (Assignment*) _staticAssignmentFileData;
QTimer* silentNodeTimer = new QTimer(this);
connect(silentNodeTimer, SIGNAL(timeout()), nodeList, SLOT(removeSilentNodes()));
silentNodeTimer->start(NODE_SILENCE_THRESHOLD_USECS / 1000);
connect(&nodeList->getNodeSocket(), SIGNAL(readyRead()), SLOT(readAvailableDatagrams()));
// fire a single shot timer to add static assignments back into the queue after a restart
QTimer::singleShot(RESTART_HOLD_TIME_MSECS, this, SLOT(addStaticAssignmentsBackToQueueAfterRestart()));
connect(this, SIGNAL(aboutToQuit()), SLOT(cleanup()));
delete[] documentRoot;
}
void DomainServer::readAvailableDatagrams() {
NodeList* nodeList = NodeList::getInstance();
HifiSockAddr senderSockAddr, nodePublicAddress, nodeLocalAddress;
static unsigned char packetData[MAX_PACKET_SIZE];
static unsigned char broadcastPacket[MAX_PACKET_SIZE];
static unsigned char* currentBufferPos;
static unsigned char* startPointer;
int receivedBytes = 0;
while (nodeList->getNodeSocket().hasPendingDatagrams()) {
if ((receivedBytes = nodeList->getNodeSocket().readDatagram((char*) packetData, MAX_PACKET_SIZE,
senderSockAddr.getAddressPointer(),
@ -128,22 +129,22 @@ void DomainServer::readAvailableDatagrams() {
&& packetVersionMatch((unsigned char*) packetData)) {
if (packetData[0] == PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY || packetData[0] == PACKET_TYPE_DOMAIN_LIST_REQUEST) {
// this is an RFD or domain list request packet, and there is a version match
int numBytesSenderHeader = numBytesForPacketHeader((unsigned char*) packetData);
NODE_TYPE nodeType = *(packetData + numBytesSenderHeader);
int packetIndex = numBytesSenderHeader + sizeof(NODE_TYPE);
QUuid nodeUUID = QUuid::fromRfc4122(QByteArray(((char*) packetData + packetIndex), NUM_BYTES_RFC4122_UUID));
packetIndex += NUM_BYTES_RFC4122_UUID;
int numBytesPrivateSocket = HifiSockAddr::unpackSockAddr(packetData + packetIndex, nodePublicAddress);
packetIndex += numBytesPrivateSocket;
if (nodePublicAddress.getAddress().isNull()) {
// this node wants to use us its STUN server
// so set the node public address to whatever we perceive the public address to be
// if the sender is on our box then leave its public address to 0 so that
// other users attempt to reach it on the same address they have for the domain-server
if (senderSockAddr.getAddress().isLoopback()) {
@ -152,19 +153,19 @@ void DomainServer::readAvailableDatagrams() {
nodePublicAddress.setAddress(senderSockAddr.getAddress());
}
}
int numBytesPublicSocket = HifiSockAddr::unpackSockAddr(packetData + packetIndex, nodeLocalAddress);
packetIndex += numBytesPublicSocket;
const char STATICALLY_ASSIGNED_NODES[] = {
NODE_TYPE_AUDIO_MIXER,
NODE_TYPE_AVATAR_MIXER,
NODE_TYPE_VOXEL_SERVER,
NODE_TYPE_METAVOXEL_SERVER
};
Assignment* matchingStaticAssignment = NULL;
if (memchr(STATICALLY_ASSIGNED_NODES, nodeType, sizeof(STATICALLY_ASSIGNED_NODES)) == NULL
|| ((matchingStaticAssignment = matchingStaticAssignmentForCheckIn(nodeUUID, nodeType))
|| checkInWithUUIDMatchesExistingNode(nodePublicAddress,
@ -175,80 +176,80 @@ void DomainServer::readAvailableDatagrams() {
nodeType,
nodePublicAddress,
nodeLocalAddress);
if (matchingStaticAssignment) {
// this was a newly added node with a matching static assignment
if (_hasCompletedRestartHold) {
// remove the matching assignment from the assignment queue so we don't take the next check in
removeAssignmentFromQueue(matchingStaticAssignment);
}
// set the linked data for this node to a copy of the matching assignment
// so we can re-queue it should the node die
Assignment* nodeCopyOfMatchingAssignment = new Assignment(*matchingStaticAssignment);
checkInNode->setLinkedData(nodeCopyOfMatchingAssignment);
}
int numHeaderBytes = populateTypeAndVersion(broadcastPacket, PACKET_TYPE_DOMAIN);
currentBufferPos = broadcastPacket + numHeaderBytes;
startPointer = currentBufferPos;
unsigned char* nodeTypesOfInterest = packetData + packetIndex + sizeof(unsigned char);
int numInterestTypes = *(nodeTypesOfInterest - 1);
if (numInterestTypes > 0) {
// if the node has sent no types of interest, assume they want nothing but their own ID back
foreach (const SharedNodePointer& node, nodeList->getNodeHash()) {
if (node->getUUID() != nodeUUID &&
memchr(nodeTypesOfInterest, node->getType(), numInterestTypes)) {
// don't send avatar nodes to other avatars, that will come from avatar mixer
if (nodeType != NODE_TYPE_AGENT || node->getType() != NODE_TYPE_AGENT) {
currentBufferPos = addNodeToBroadcastPacket(currentBufferPos, node.data());
}
}
}
}
// update last receive to now
uint64_t timeNow = usecTimestampNow();
checkInNode->setLastHeardMicrostamp(timeNow);
// send the constructed list back to this node
nodeList->getNodeSocket().writeDatagram((char*) broadcastPacket,
(currentBufferPos - startPointer) + numHeaderBytes,
senderSockAddr.getAddress(), senderSockAddr.getPort());
}
} else if (packetData[0] == PACKET_TYPE_REQUEST_ASSIGNMENT) {
if (_assignmentQueue.size() > 0) {
// construct the requested assignment from the packet data
Assignment requestAssignment(packetData, receivedBytes);
qDebug("Received a request for assignment type %i from %s.",
requestAssignment.getType(), qPrintable(senderSockAddr.getAddress().toString()));
Assignment* assignmentToDeploy = deployableAssignmentForRequest(requestAssignment);
if (assignmentToDeploy) {
// give this assignment out, either the type matches or the requestor said they will take any
int numHeaderBytes = populateTypeAndVersion(broadcastPacket, PACKET_TYPE_CREATE_ASSIGNMENT);
int numAssignmentBytes = assignmentToDeploy->packToBuffer(broadcastPacket + numHeaderBytes);
nodeList->getNodeSocket().writeDatagram((char*) broadcastPacket, numHeaderBytes + numAssignmentBytes,
senderSockAddr.getAddress(), senderSockAddr.getPort());
if (assignmentToDeploy->getNumberOfInstances() == 0) {
// there are no more instances of this script to send out, delete it
delete assignmentToDeploy;
}
}
} else {
qDebug() << "Received an invalid assignment request from" << senderSockAddr.getAddress();
}
@ -263,10 +264,10 @@ void DomainServer::setDomainServerInstance(DomainServer* domainServer) {
QJsonObject jsonForSocket(const HifiSockAddr& socket) {
QJsonObject socketJSON;
socketJSON["ip"] = socket.getAddress().toString();
socketJSON["port"] = ntohs(socket.getPort());
return socketJSON;
}
@ -282,14 +283,14 @@ QJsonObject jsonObjectForNode(Node* node) {
QString nodeTypeName(node->getTypeName());
nodeTypeName = nodeTypeName.toLower();
nodeTypeName.replace(' ', '-');
// add the node type
nodeJson[JSON_KEY_TYPE] = nodeTypeName;
// add the node socket information
nodeJson[JSON_KEY_PUBLIC_SOCKET] = jsonForSocket(node->getPublicSocket());
nodeJson[JSON_KEY_LOCAL_SOCKET] = jsonForSocket(node->getLocalSocket());
// if the node has pool information, add it
if (node->getLinkedData() && ((Assignment*) node->getLinkedData())->hasPool()) {
nodeJson[JSON_KEY_POOL] = QString(((Assignment*) node->getLinkedData())->getPool());
@ -300,24 +301,24 @@ QJsonObject jsonObjectForNode(Node* node) {
int DomainServer::civetwebRequestHandler(struct mg_connection *connection) {
const struct mg_request_info* ri = mg_get_request_info(connection);
const char RESPONSE_200[] = "HTTP/1.0 200 OK\r\n\r\n";
const char RESPONSE_400[] = "HTTP/1.0 400 Bad Request\r\n\r\n";
const char URI_ASSIGNMENT[] = "/assignment";
const char URI_NODE[] = "/node";
if (strcmp(ri->request_method, "GET") == 0) {
if (strcmp(ri->uri, "/assignments.json") == 0) {
// user is asking for json list of assignments
// start with a 200 response
mg_printf(connection, "%s", RESPONSE_200);
// setup the JSON
QJsonObject assignmentJSON;
QJsonObject assignedNodesJSON;
// enumerate the NodeList to find the assigned nodes
foreach (const SharedNodePointer& node, NodeList::getInstance()->getNodeHash()) {
if (node->getLinkedData()) {
@ -326,67 +327,67 @@ int DomainServer::civetwebRequestHandler(struct mg_connection *connection) {
assignedNodesJSON[uuidString] = jsonObjectForNode(node.data());
}
}
assignmentJSON["fulfilled"] = assignedNodesJSON;
QJsonObject queuedAssignmentsJSON;
// add the queued but unfilled assignments to the json
std::deque<Assignment*>::iterator assignment = domainServerInstance->_assignmentQueue.begin();
while (assignment != domainServerInstance->_assignmentQueue.end()) {
QJsonObject queuedAssignmentJSON;
QString uuidString = uuidStringWithoutCurlyBraces((*assignment)->getUUID());
queuedAssignmentJSON[JSON_KEY_TYPE] = QString((*assignment)->getTypeName());
// if the assignment has a pool, add it
if ((*assignment)->hasPool()) {
queuedAssignmentJSON[JSON_KEY_POOL] = QString((*assignment)->getPool());
}
// add this queued assignment to the JSON
queuedAssignmentsJSON[uuidString] = queuedAssignmentJSON;
// push forward the iterator to check the next assignment
assignment++;
}
assignmentJSON["queued"] = queuedAssignmentsJSON;
// print out the created JSON
QJsonDocument assignmentDocument(assignmentJSON);
mg_printf(connection, "%s", assignmentDocument.toJson().constData());
// we've processed this request
return 1;
} else if (strcmp(ri->uri, "/nodes.json") == 0) {
// start with a 200 response
mg_printf(connection, "%s", RESPONSE_200);
// setup the JSON
QJsonObject rootJSON;
QJsonObject nodesJSON;
// enumerate the NodeList to find the assigned nodes
NodeList* nodeList = NodeList::getInstance();
foreach (const SharedNodePointer& node, nodeList->getNodeHash()) {
// add the node using the UUID as the key
QString uuidString = uuidStringWithoutCurlyBraces(node->getUUID());
nodesJSON[uuidString] = jsonObjectForNode(node.data());
}
rootJSON["nodes"] = nodesJSON;
// print out the created JSON
QJsonDocument nodesDocument(rootJSON);
mg_printf(connection, "%s", nodesDocument.toJson().constData());
// we've processed this request
return 1;
}
// not processed, pass to document root
return 0;
} else if (strcmp(ri->request_method, "POST") == 0) {
@ -395,38 +396,38 @@ int DomainServer::civetwebRequestHandler(struct mg_connection *connection) {
mg_printf(connection, "%s", RESPONSE_200);
// upload the file
mg_upload(connection, "/tmp");
return 1;
}
return 0;
} else if (strcmp(ri->request_method, "DELETE") == 0) {
// this is a DELETE request
// check if it is for an assignment
if (memcmp(ri->uri, URI_NODE, strlen(URI_NODE)) == 0) {
// pull the UUID from the url
QUuid deleteUUID = QUuid(QString(ri->uri + strlen(URI_NODE) + sizeof('/')));
if (!deleteUUID.isNull()) {
SharedNodePointer nodeToKill = NodeList::getInstance()->nodeWithUUID(deleteUUID);
if (nodeToKill) {
// start with a 200 response
mg_printf(connection, "%s", RESPONSE_200);
// we have a valid UUID and node - kill the node that has this assignment
NodeList::getInstance()->killNodeWithUUID(deleteUUID);
QMetaObject::invokeMethod(NodeList::getInstance(), "killNodeWithUUID", Q_ARG(const QUuid&, deleteUUID));
// successfully processed request
return 1;
}
}
}
// request not processed - bad request
mg_printf(connection, "%s", RESPONSE_400);
// this was processed by civetweb
return 1;
} else {
@ -438,33 +439,33 @@ int DomainServer::civetwebRequestHandler(struct mg_connection *connection) {
const char ASSIGNMENT_SCRIPT_HOST_LOCATION[] = "resources/web/assignment";
void DomainServer::civetwebUploadHandler(struct mg_connection *connection, const char *path) {
// create an assignment for this saved script, for now make it local only
Assignment* scriptAssignment = new Assignment(Assignment::CreateCommand,
Assignment::AgentType,
NULL,
Assignment::LocalLocation);
// check how many instances of this assignment the user wants by checking the ASSIGNMENT-INSTANCES header
const char ASSIGNMENT_INSTANCES_HTTP_HEADER[] = "ASSIGNMENT-INSTANCES";
const char* requestInstancesHeader = mg_get_header(connection, ASSIGNMENT_INSTANCES_HTTP_HEADER);
if (requestInstancesHeader) {
// the user has requested a number of instances greater than 1
// so set that on the created assignment
scriptAssignment->setNumberOfInstances(atoi(requestInstancesHeader));
}
QString newPath(ASSIGNMENT_SCRIPT_HOST_LOCATION);
newPath += "/";
// append the UUID for this script as the new filename, remove the curly braces
newPath += uuidStringWithoutCurlyBraces(scriptAssignment->getUUID());
// rename the saved script to the GUID of the assignment and move it to the script host locaiton
rename(path, newPath.toLocal8Bit().constData());
qDebug("Saved a script for assignment at %s", newPath.toLocal8Bit().constData());
// add the script assigment to the assignment queue
// lock the assignment queue mutex since we're operating on a different thread than DS main
domainServerInstance->_assignmentQueueMutex.lock();
@ -474,18 +475,18 @@ void DomainServer::civetwebUploadHandler(struct mg_connection *connection, const
void DomainServer::addReleasedAssignmentBackToQueue(Assignment* releasedAssignment) {
qDebug() << "Adding assignment" << *releasedAssignment << " back to queue.";
// find this assignment in the static file
for (int i = 0; i < MAX_STATIC_ASSIGNMENT_FILE_ASSIGNMENTS; i++) {
if (_staticAssignments[i].getUUID() == releasedAssignment->getUUID()) {
// reset the UUID on the static assignment
_staticAssignments[i].resetUUID();
// put this assignment back in the queue so it goes out
_assignmentQueueMutex.lock();
_assignmentQueue.push_back(&_staticAssignments[i]);
_assignmentQueueMutex.unlock();
} else if (_staticAssignments[i].getUUID().isNull()) {
// we are at the blank part of the static assignments - break out
break;
@ -497,72 +498,72 @@ void DomainServer::nodeKilled(SharedNodePointer node) {
// if this node has linked data it was from an assignment
if (node->getLinkedData()) {
Assignment* nodeAssignment = (Assignment*) node->getLinkedData();
addReleasedAssignmentBackToQueue(nodeAssignment);
}
}
unsigned char* DomainServer::addNodeToBroadcastPacket(unsigned char* currentPosition, Node* nodeToAdd) {
*currentPosition++ = nodeToAdd->getType();
QByteArray rfcUUID = nodeToAdd->getUUID().toRfc4122();
memcpy(currentPosition, rfcUUID.constData(), rfcUUID.size());
currentPosition += rfcUUID.size();
currentPosition += HifiSockAddr::packSockAddr(currentPosition, nodeToAdd->getPublicSocket());
currentPosition += HifiSockAddr::packSockAddr(currentPosition, nodeToAdd->getLocalSocket());
// return the new unsigned char * for broadcast packet
return currentPosition;
}
void DomainServer::prepopulateStaticAssignmentFile() {
int numFreshStaticAssignments = 0;
// write a fresh static assignment array to file
Assignment freshStaticAssignments[MAX_STATIC_ASSIGNMENT_FILE_ASSIGNMENTS];
// pre-populate the first static assignment list with assignments for root AuM, AvM, VS
freshStaticAssignments[numFreshStaticAssignments++] = Assignment(Assignment::CreateCommand, Assignment::AudioMixerType);
freshStaticAssignments[numFreshStaticAssignments++] = Assignment(Assignment::CreateCommand, Assignment::AvatarMixerType);
// Handle Domain/Voxel Server configuration command line arguments
if (_voxelServerConfig) {
qDebug("Reading Voxel Server Configuration.");
qDebug() << "config: " << _voxelServerConfig;
QString multiConfig((const char*) _voxelServerConfig);
QStringList multiConfigList = multiConfig.split(";");
// read each config to a payload for a VS assignment
for (int i = 0; i < multiConfigList.size(); i++) {
QString config = multiConfigList.at(i);
qDebug("config[%d]=%s", i, config.toLocal8Bit().constData());
// Now, parse the config to check for a pool
const char ASSIGNMENT_CONFIG_POOL_OPTION[] = "--pool";
QString assignmentPool;
int poolIndex = config.indexOf(ASSIGNMENT_CONFIG_POOL_OPTION);
if (poolIndex >= 0) {
int spaceBeforePoolIndex = config.indexOf(' ', poolIndex);
int spaceAfterPoolIndex = config.indexOf(' ', spaceBeforePoolIndex);
assignmentPool = config.mid(spaceBeforePoolIndex + 1, spaceAfterPoolIndex);
qDebug() << "The pool for this voxel-assignment is" << assignmentPool;
}
Assignment voxelServerAssignment(Assignment::CreateCommand,
Assignment::VoxelServerType,
(assignmentPool.isEmpty() ? NULL : assignmentPool.toLocal8Bit().constData()));
int payloadLength = config.length() + sizeof(char);
voxelServerAssignment.setPayload((uchar*)config.toLocal8Bit().constData(), payloadLength);
freshStaticAssignments[numFreshStaticAssignments++] = voxelServerAssignment;
}
} else {
@ -574,53 +575,53 @@ void DomainServer::prepopulateStaticAssignmentFile() {
if (_particleServerConfig) {
qDebug("Reading Particle Server Configuration.");
qDebug() << "config: " << _particleServerConfig;
QString multiConfig((const char*) _particleServerConfig);
QStringList multiConfigList = multiConfig.split(";");
// read each config to a payload for a VS assignment
for (int i = 0; i < multiConfigList.size(); i++) {
QString config = multiConfigList.at(i);
qDebug("config[%d]=%s", i, config.toLocal8Bit().constData());
// Now, parse the config to check for a pool
const char ASSIGNMENT_CONFIG_POOL_OPTION[] = "--pool";
QString assignmentPool;
int poolIndex = config.indexOf(ASSIGNMENT_CONFIG_POOL_OPTION);
if (poolIndex >= 0) {
int spaceBeforePoolIndex = config.indexOf(' ', poolIndex);
int spaceAfterPoolIndex = config.indexOf(' ', spaceBeforePoolIndex);
assignmentPool = config.mid(spaceBeforePoolIndex + 1, spaceAfterPoolIndex);
qDebug() << "The pool for this particle-assignment is" << assignmentPool;
}
Assignment particleServerAssignment(Assignment::CreateCommand,
Assignment::ParticleServerType,
(assignmentPool.isEmpty() ? NULL : assignmentPool.toLocal8Bit().constData()));
int payloadLength = config.length() + sizeof(char);
particleServerAssignment.setPayload((uchar*)config.toLocal8Bit().constData(), payloadLength);
freshStaticAssignments[numFreshStaticAssignments++] = particleServerAssignment;
}
} else {
Assignment rootParticleServerAssignment(Assignment::CreateCommand, Assignment::ParticleServerType);
freshStaticAssignments[numFreshStaticAssignments++] = rootParticleServerAssignment;
}
// handle metavoxel configuration command line argument
Assignment& metavoxelAssignment = (freshStaticAssignments[numFreshStaticAssignments++] =
Assignment(Assignment::CreateCommand, Assignment::MetavoxelServerType));
if (_metavoxelServerConfig) {
metavoxelAssignment.setPayload((const unsigned char*)_metavoxelServerConfig, strlen(_metavoxelServerConfig));
}
qDebug() << "Adding" << numFreshStaticAssignments << "static assignments to fresh file.";
_staticAssignmentFile.open(QIODevice::WriteOnly);
_staticAssignmentFile.write((char*) &freshStaticAssignments, sizeof(freshStaticAssignments));
_staticAssignmentFile.resize(MAX_STATIC_ASSIGNMENT_FILE_ASSIGNMENTS * sizeof(Assignment));
@ -629,10 +630,10 @@ void DomainServer::prepopulateStaticAssignmentFile() {
Assignment* DomainServer::matchingStaticAssignmentForCheckIn(const QUuid& checkInUUID, NODE_TYPE nodeType) {
// pull the UUID passed with the check in
if (_hasCompletedRestartHold) {
_assignmentQueueMutex.lock();
// iterate the assignment queue to check for a match
std::deque<Assignment*>::iterator assignment = _assignmentQueue.begin();
while (assignment != _assignmentQueue.end()) {
@ -645,7 +646,7 @@ Assignment* DomainServer::matchingStaticAssignmentForCheckIn(const QUuid& checkI
assignment++;
}
}
_assignmentQueueMutex.unlock();
} else {
for (int i = 0; i < MAX_STATIC_ASSIGNMENT_FILE_ASSIGNMENTS; i++) {
@ -658,17 +659,17 @@ Assignment* DomainServer::matchingStaticAssignmentForCheckIn(const QUuid& checkI
}
}
}
return NULL;
}
Assignment* DomainServer::deployableAssignmentForRequest(Assignment& requestAssignment) {
_assignmentQueueMutex.lock();
// this is an unassigned client talking to us directly for an assignment
// go through our queue and see if there are any assignments to give out
std::deque<Assignment*>::iterator assignment = _assignmentQueue.begin();
while (assignment != _assignmentQueue.end()) {
bool requestIsAllTypes = requestAssignment.getType() == Assignment::AllTypes;
bool assignmentTypesMatch = (*assignment)->getType() == requestAssignment.getType();
@ -676,29 +677,29 @@ Assignment* DomainServer::deployableAssignmentForRequest(Assignment& requestAssi
bool assignmentPoolsMatch = memcmp((*assignment)->getPool(),
requestAssignment.getPool(),
MAX_ASSIGNMENT_POOL_BYTES) == 0;
if ((requestIsAllTypes || assignmentTypesMatch) && (nietherHasPool || assignmentPoolsMatch)) {
Assignment* deployableAssignment = *assignment;
if ((*assignment)->getType() == Assignment::AgentType) {
// if there is more than one instance to send out, simply decrease the number of instances
if ((*assignment)->getNumberOfInstances() == 1) {
_assignmentQueue.erase(assignment);
}
deployableAssignment->decrementNumberOfInstances();
} else {
// remove the assignment from the queue
_assignmentQueue.erase(assignment);
// until we get a check-in from that GUID
// put assignment back in queue but stick it at the back so the others have a chance to go out
_assignmentQueue.push_back(deployableAssignment);
}
// stop looping, we've handed out an assignment
_assignmentQueueMutex.unlock();
return deployableAssignment;
@ -707,17 +708,17 @@ Assignment* DomainServer::deployableAssignmentForRequest(Assignment& requestAssi
assignment++;
}
}
_assignmentQueueMutex.unlock();
return NULL;
}
void DomainServer::removeAssignmentFromQueue(Assignment* removableAssignment) {
_assignmentQueueMutex.lock();
std::deque<Assignment*>::iterator assignment = _assignmentQueue.begin();
while (assignment != _assignmentQueue.end()) {
if ((*assignment)->getUUID() == removableAssignment->getUUID()) {
_assignmentQueue.erase(assignment);
@ -727,7 +728,7 @@ void DomainServer::removeAssignmentFromQueue(Assignment* removableAssignment) {
assignment++;
}
}
_assignmentQueueMutex.unlock();
}
@ -735,7 +736,7 @@ bool DomainServer::checkInWithUUIDMatchesExistingNode(const HifiSockAddr& nodePu
const HifiSockAddr& nodeLocalSocket,
const QUuid& checkInUUID) {
NodeList* nodeList = NodeList::getInstance();
foreach (const SharedNodePointer& node, nodeList->getNodeHash()) {
if (node->getLinkedData()
&& nodePublicSocket == node->getPublicSocket()
@ -745,28 +746,28 @@ bool DomainServer::checkInWithUUIDMatchesExistingNode(const HifiSockAddr& nodePu
return true;
}
}
return false;
}
void DomainServer::addStaticAssignmentsBackToQueueAfterRestart() {
_hasCompletedRestartHold = true;
// if the domain-server has just restarted,
// check if there are static assignments in the file that we need to
// throw into the assignment queue
// pull anything in the static assignment file that isn't spoken for and add to the assignment queue
for (int i = 0; i < MAX_STATIC_ASSIGNMENT_FILE_ASSIGNMENTS; i++) {
if (_staticAssignments[i].getUUID().isNull()) {
// reached the end of static assignments, bail
break;
}
bool foundMatchingAssignment = false;
NodeList* nodeList = NodeList::getInstance();
// enumerate the nodes and check if there is one with an attached assignment with matching UUID
foreach (const SharedNodePointer& node, nodeList->getNodeHash()) {
if (node->getLinkedData()) {
@ -777,13 +778,13 @@ void DomainServer::addStaticAssignmentsBackToQueueAfterRestart() {
}
}
}
if (!foundMatchingAssignment) {
// this assignment has not been fulfilled - reset the UUID and add it to the assignment queue
_staticAssignments[i].resetUUID();
qDebug() << "Adding static assignment to queue -" << _staticAssignments[i];
_assignmentQueueMutex.lock();
_assignmentQueue.push_back(&_staticAssignments[i]);
_assignmentQueueMutex.unlock();

7
externals/winsdk/ammintrin.h vendored Normal file
View file

@ -0,0 +1,7 @@
// fake/empty ammintrin.h
//
// NOTE: Windows build will reference this file, but it's not available in the WindowsSDK
// it's also apparently not needed. So we've included this empty version here to get the
// windows build to compile cleanly.
//
// nothing to see here... move along.

View file

@ -22,18 +22,37 @@ else ()
set(BUILD_SEQ "0")
endif ()
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} $ENV{QT_CMAKE_PREFIX_PATH})
if (APPLE)
set(GL_HEADERS "#include <GLUT/glut.h>\n#include <OpenGL/glext.h>")
else (APPLE)
# include the right GL headers for UNIX
set(GL_HEADERS "#include <GL/gl.h>\n#include <GL/glut.h>\n#include <GL/glext.h>")
endif (APPLE)
if (UNIX AND NOT APPLE)
# include the right GL headers for UNIX
set(GL_HEADERS "#include <GL/gl.h>\n#include <GL/glut.h>\n#include <GL/glext.h>")
endif (UNIX AND NOT APPLE)
if (WIN32)
set(GLUT_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/external/glut)
set(GL_HEADERS "#define GLEW_STATIC\n#define FREEGLUT_STATIC\n#define FREEGLUT_LIB_PRAGMAS 0\n#include <GL/glew.h>\n#include <GL/wglew.h>\n#include <GL/freeglut_std.h>\n#include <GL/freeglut_ext.h>")
add_definitions( -D_USE_MATH_DEFINES ) # apparently needed to get M_PI and other defines from cmath/math.h
add_definitions( -DWINDOWS_LEAN_AND_MEAN ) # needed to make sure windows doesn't go to crazy with its defines
# windows build needs an external glut, we're using freeglut
set(GLUT_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/external/freeglut)
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${GLUT_ROOT_PATH})
# windows build needs glew (opengl extention wrangler) this will handle providing access to OpenGL methods after 1.1
# which are not accessible on windows without glew or some other dynamic linking mechanism
set(GLEW_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/external/glew)
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${GLEW_ROOT_PATH})
include_directories(SYSTEM ${GLEW_ROOT_PATH}/include)
# windows still using pthreads, TODO: switch to QThreads
set(PTHREADS_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/external/pthreads)
#set(GL_HEADERS "#define GLEW_STATIC\n#define FREEGLUT_STATIC\n#define FREEGLUT_LIB_PRAGMAS 0\n#include <GL/glew.h>\n#include <GL/wglew.h>\n#include <GL/freeglut_std.h>\n#include <GL/freeglut_ext.h>")
set(GL_HEADERS "#define GLEW_STATIC\n#include <windowshacks.h>\n#include <GL/glew.h>\n#include <GL/glut.h>")
include_directories(SYSTEM ${PTHREADS_ROOT_PATH}/include)
endif (WIN32)
# set up the external glm library
@ -51,6 +70,16 @@ foreach(SUBDIR avatar devices renderer ui starfield)
set(INTERFACE_SRCS ${INTERFACE_SRCS} ${SUBDIR_SRCS})
endforeach(SUBDIR)
#windows also includes the faceshift externals, because using a lib doesn't work due to debug/release mismatch
if (WIN32)
set(EXTERNAL_SOURCE_SUBDIRS "faceshift")
endif (WIN32)
foreach(EXTERNAL_SOURCE_SUBDIR ${EXTERNAL_SOURCE_SUBDIRS})
file(GLOB_RECURSE SUBDIR_SRCS external/${EXTERNAL_SOURCE_SUBDIR}/src/*.cpp external/${EXTERNAL_SOURCE_SUBDIR}/src/*.c external/${EXTERNAL_SOURCE_SUBDIR}/src/*.h)
set(INTERFACE_SRCS ${INTERFACE_SRCS} ${SUBDIR_SRCS})
endforeach(EXTERNAL_SOURCE_SUBDIR)
find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5Multimedia REQUIRED)
@ -63,23 +92,23 @@ find_package(Qt5WebKitWidgets REQUIRED)
if (APPLE)
set(MACOSX_BUNDLE_BUNDLE_NAME Interface)
# set how the icon shows up in the Info.plist file
SET(MACOSX_BUNDLE_ICON_FILE interface.icns)
SET(MACOSX_BUNDLE_ICON_FILE interface.icns)
# set where in the bundle to put the resources file
SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/interface.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
SET(INTERFACE_SRCS ${INTERFACE_SRCS} ${CMAKE_CURRENT_SOURCE_DIR}/interface.icns)
# grab the directories in resources and put them in the right spot in Resources
file(GLOB RESOURCE_SUBDIRS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/resources ${CMAKE_CURRENT_SOURCE_DIR}/resources/*)
foreach(DIR ${RESOURCE_SUBDIRS})
if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/resources/${DIR})
FILE(GLOB DIR_CONTENTS resources/${DIR}/*)
SET_SOURCE_FILES_PROPERTIES(${DIR_CONTENTS} PROPERTIES MACOSX_PACKAGE_LOCATION Resources/${DIR})
SET(INTERFACE_SRCS ${INTERFACE_SRCS} ${DIR_CONTENTS})
endif()
endforeach()
endif()
endforeach()
endif (APPLE)
# create the executable, make it a bundle on OS X
@ -114,7 +143,9 @@ find_package(ZLIB)
if (OPENNI_FOUND AND NOT DISABLE_OPENNI)
add_definitions(-DHAVE_OPENNI)
include_directories(SYSTEM ${OPENNI_INCLUDE_DIRS})
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${OPENNI_INCLUDE_DIRS}")
if (APPLE OR UNIX)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${OPENNI_INCLUDE_DIRS}")
endif (APPLE OR UNIX)
target_link_libraries(${TARGET_NAME} ${OPENNI_LIBRARIES})
endif (OPENNI_FOUND AND NOT DISABLE_OPENNI)
@ -122,7 +153,9 @@ endif (OPENNI_FOUND AND NOT DISABLE_OPENNI)
if (SIXENSE_FOUND AND NOT DISABLE_SIXENSE)
add_definitions(-DHAVE_SIXENSE)
include_directories(SYSTEM ${SIXENSE_INCLUDE_DIRS})
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${SIXENSE_INCLUDE_DIRS}")
if (APPLE OR UNIX)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${SIXENSE_INCLUDE_DIRS}")
endif (APPLE OR UNIX)
target_link_libraries(${TARGET_NAME} ${SIXENSE_LIBRARIES})
endif (SIXENSE_FOUND AND NOT DISABLE_SIXENSE)
@ -130,10 +163,23 @@ endif (SIXENSE_FOUND AND NOT DISABLE_SIXENSE)
if (LIBOVR_FOUND AND NOT DISABLE_LIBOVR)
add_definitions(-DHAVE_LIBOVR)
include_directories(SYSTEM ${LIBOVR_INCLUDE_DIRS})
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${LIBOVR_INCLUDE_DIRS}")
if (APPLE OR UNIX)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${LIBOVR_INCLUDE_DIRS}")
endif (APPLE OR UNIX)
target_link_libraries(${TARGET_NAME} ${LIBOVR_LIBRARIES})
endif (LIBOVR_FOUND AND NOT DISABLE_LIBOVR)
# let the source know that we have LibVPX
if (LIBVPX_FOUND AND NOT DISABLE_LIBVPX)
add_definitions(-DHAVE_LIBVPX)
include_directories(SYSTEM ${LIBVPX_INCLUDE_DIRS})
if (APPLE OR UNIX)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${LIBVPX_INCLUDE_DIRS}")
endif (APPLE OR UNIX)
target_link_libraries(${TARGET_NAME} ${LIBVPX_LIBRARIES})
endif (LIBVPX_FOUND AND NOT DISABLE_LIBVPX)
qt5_use_modules(${TARGET_NAME} Core Gui Multimedia Network OpenGL Script Svg WebKit WebKitWidgets)
# include headers for interface and InterfaceConfig.
@ -146,21 +192,24 @@ include_directories(
# use system flag so warnings are supressed
include_directories(
SYSTEM
${FACESHIFT_INCLUDE_DIRS}
${GLM_INCLUDE_DIRS}
${LIBVPX_INCLUDE_DIRS}
${FACESHIFT_INCLUDE_DIRS}
${GLM_INCLUDE_DIRS}
${LEAP_INCLUDE_DIRS}
${MOTIONDRIVER_INCLUDE_DIRS}
${OPENCV_INCLUDE_DIRS}
)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${OPENCV_INCLUDE_DIRS}")
MESSAGE("here..." ${FACESHIFT_LIBRARIES} )
if (APPLE OR UNIX)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${OPENCV_INCLUDE_DIRS}")
endif (APPLE OR UNIX)
target_link_libraries(
${TARGET_NAME}
${FACESHIFT_LIBRARIES}
${LIBVPX_LIBRARIES}
${MOTIONDRIVER_LIBRARIES}
${OPENCV_LIBRARIES}
${OPENCV_LIBRARIES}
${ZLIB_LIBRARIES}
)
@ -176,17 +225,17 @@ if (APPLE)
find_library(IOKit IOKit)
find_library(QTKit QTKit)
find_library(QuartzCore QuartzCore)
include_directories(SYSTEM ${UVCCAMERACONTROL_INCLUDE_DIRS})
target_link_libraries(
${TARGET_NAME}
${AppKit}
${CoreAudio}
${CoreServices}
${CoreServices}
${Carbon}
${Foundation}
${GLUT}
${Foundation}
${GLUT}
${OpenGL}
${IOKit}
${QTKit}
@ -203,15 +252,22 @@ endif (APPLE)
# link target to external libraries
if (WIN32)
target_link_libraries(
${TARGET_NAME}
${CMAKE_CURRENT_SOURCE_DIR}/external/glut/Release/glew32.lib
${CMAKE_CURRENT_SOURCE_DIR}/external/glut/Release/freeglut.lib
${CMAKE_CURRENT_SOURCE_DIR}/external/glut/Release/pthread_lib.lib
wsock32.lib
${TARGET_NAME}
${OPENCV_LIBRARIES}
#${FACESHIFT_LIBRARIES}
${CMAKE_CURRENT_SOURCE_DIR}/external/glew/lib/Release/Win32/glew32s.lib
${GLUT_ROOT_PATH}/lib/freeglut.lib
# note: the pthreads stuff was in the /external/glut before, that's not right, I moved it to it's own location
# but really we need to switch over to QThreads
${PTHREADS_ROOT_PATH}/WIN32/pthread_lib.lib
wsock32.lib
opengl32.lib
)
else (WIN32)
# link required libraries on UNIX
if (UNIX AND NOT APPLE)
if (UNIX AND NOT APPLE)
find_package(Threads REQUIRED)
target_link_libraries(
@ -223,7 +279,7 @@ else (WIN32)
endif (WIN32)
# install command for OS X bundle
INSTALL(TARGETS ${TARGET_NAME}
INSTALL(TARGETS ${TARGET_NAME}
BUNDLE DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/install COMPONENT Runtime
RUNTIME DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/install COMPONENT Runtime
)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

27
interface/external/freeglut/Copying.txt vendored Normal file
View file

@ -0,0 +1,27 @@
Freeglut Copyright
------------------
Freeglut code without an explicit copyright is covered by the following
copyright:
Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies or substantial portions of the Software.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of Pawel W. Olszta shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from Pawel W. Olszta.

101
interface/external/freeglut/Readme.txt vendored Normal file
View file

@ -0,0 +1,101 @@
freeglut 2.8.1-1.mp for MSVC
This package contains freeglut import libraries, headers, and Windows DLLs.
These allow 32 and 64 bit GLUT applications to be compiled on Windows using
Microsoft Visual C++.
For more information on freeglut, visit http://freeglut.sourceforge.net/.
Installation
Create a folder on your PC which is readable by all users, for example
“C:\Program Files\Common Files\MSVC\freeglut\” on a typical Windows system. Copy
the “lib\” and “include\” folders from this zip archive to that location.
The appropriate freeglut DLL can either be placed in the same folder as your
application, or can be installed in a system-wide folder which appears in your
%PATH% environment variable. Be careful not to mix the 32 bit DLL up with the 64
bit DLL, as they are not interchangeable.
Compiling 32 bit Applications
To create a 32 bit freeglut application, create a new Win32 C++ project in MSVC.
From the “Win32 Application Wizard”, choose a “Windows application”, check the
“Empty project” box, and submit.
Youll now need to configure the compiler and linker settings. Open up the
project properties, and select “All Configurations” (this is necessary to ensure
our changes are applied for both debug and release builds). Open up the
“general” section under “C/C++”, and configure the “include\” folder you created
above as an “Additional Include Directory”. If you have more than one GLUT
package which contains a “glut.h” file, its important to ensure that the
freeglut include folder appears above all other GLUT include folders.
Now open up the “general” section under “Linker”, and configure the “lib\”
folder you created above as an “Additional Library Directory”. A freeglut
application depends on the import libraries “freeglut.lib” and “opengl32.lib”,
which can be configured under the “Input” section. However, it shouldnt be
necessary to explicitly state these dependencies, since the freeglut headers
handle this for you. Now open the “Advanced” section, and enter “mainCRTStartup”
as the “Entry Point” for your application. This is necessary because GLUT
applications use “main” as the application entry point, not “WinMain”—without it
youll get an undefined reference when you try to link your application.
Thats all of your project properties configured, so you can now add source
files to your project and build the application. If you want your application to
be compatible with GLUT, you should “#include <GL/glut.h>”. If you want to use
freeglut specific extensions, you should “#include <GL/freeglut.h>” instead.
Dont forget to either include the freeglut DLL when distributing applications,
or provide your users with some method of obtaining it if they dont already
have it!
Compiling 64 bit Applications
Building 64 bit applications is almost identical to building 32 bit applications.
When you use the configuration manager to add the x64 platform, its easiest to
copy the settings from the Win32 platform. If you do so, its then only necessary
to change the “Additional Library Directories” configuration so that it
references the directory containing the 64 bit import library rather
than the 32 bit one.
Problems?
If you have problems using this package (compiler / linker errors etc.), please
check that you have followed all of the steps in this readme file correctly.
Almost all of the problems which are reported with these packages are due to
missing a step or not doing it correctly, for example trying to build a 32 bit
app against the 64 bit import library. If you have followed all of the steps
correctly but your application still fails to build, try building a very simple
but functional program (the example at
http://www.transmissionzero.co.uk/computing/using-glut-with-mingw/ works fine
with MSVC). A lot of people try to build very complex applications after
installing these packages, and often the error is with the application code or
other library dependencies rather than freeglut.
If you still cant get it working after trying to compile a simple application,
then please get in touch via http://www.transmissionzero.co.uk/contact/,
providing as much detail as you can. Please dont complain to the freeglut guys
unless youre sure its a freeglut bug, and have reproduced the issue after
compiling freeglut from the latest SVN version—if thats still the case, Im sure
they would appreciate a bug report or a patch.
Changelog
20130511: Release 2.8.1-1.mp
• First 2.8.1 MSVC release. Ive built the package using Visual Studio 2012,
and the only change Ive made is to the DLL version resource—Ive changed
the description so that my MinGW and MSVC builds are distinguishable from
each other (and other builds) using Windows Explorer.
Martin Payne
20130511
http://www.transmissionzero.co.uk/

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,22 @@
#ifndef __FREEGLUT_H__
#define __FREEGLUT_H__
/*
* freeglut.h
*
* The freeglut library include file
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include "freeglut_std.h"
#include "freeglut_ext.h"
/*** END OF FILE ***/
#endif /* __FREEGLUT_H__ */

View file

@ -0,0 +1,239 @@
#ifndef __FREEGLUT_EXT_H__
#define __FREEGLUT_EXT_H__
/*
* freeglut_ext.h
*
* The non-GLUT-compatible extensions to the freeglut library include file
*
* Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
* Written by Pawel W. Olszta, <olszta@sourceforge.net>
* Creation date: Thu Dec 2 1999
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifdef __cplusplus
extern "C" {
#endif
/*
* Additional GLUT Key definitions for the Special key function
*/
#define GLUT_KEY_NUM_LOCK 0x006D
#define GLUT_KEY_BEGIN 0x006E
#define GLUT_KEY_DELETE 0x006F
#define GLUT_KEY_SHIFT_L 0x0070
#define GLUT_KEY_SHIFT_R 0x0071
#define GLUT_KEY_CTRL_L 0x0072
#define GLUT_KEY_CTRL_R 0x0073
#define GLUT_KEY_ALT_L 0x0074
#define GLUT_KEY_ALT_R 0x0075
/*
* GLUT API Extension macro definitions -- behaviour when the user clicks on an "x" to close a window
*/
#define GLUT_ACTION_EXIT 0
#define GLUT_ACTION_GLUTMAINLOOP_RETURNS 1
#define GLUT_ACTION_CONTINUE_EXECUTION 2
/*
* Create a new rendering context when the user opens a new window?
*/
#define GLUT_CREATE_NEW_CONTEXT 0
#define GLUT_USE_CURRENT_CONTEXT 1
/*
* Direct/Indirect rendering context options (has meaning only in Unix/X11)
*/
#define GLUT_FORCE_INDIRECT_CONTEXT 0
#define GLUT_ALLOW_DIRECT_CONTEXT 1
#define GLUT_TRY_DIRECT_CONTEXT 2
#define GLUT_FORCE_DIRECT_CONTEXT 3
/*
* GLUT API Extension macro definitions -- the glutGet parameters
*/
#define GLUT_INIT_STATE 0x007C
#define GLUT_ACTION_ON_WINDOW_CLOSE 0x01F9
#define GLUT_WINDOW_BORDER_WIDTH 0x01FA
#define GLUT_WINDOW_BORDER_HEIGHT 0x01FB
#define GLUT_WINDOW_HEADER_HEIGHT 0x01FB /* Docs say it should always have been GLUT_WINDOW_BORDER_HEIGHT, keep this for backward compatibility */
#define GLUT_VERSION 0x01FC
#define GLUT_RENDERING_CONTEXT 0x01FD
#define GLUT_DIRECT_RENDERING 0x01FE
#define GLUT_FULL_SCREEN 0x01FF
#define GLUT_SKIP_STALE_MOTION_EVENTS 0x0204
/*
* New tokens for glutInitDisplayMode.
* Only one GLUT_AUXn bit may be used at a time.
* Value 0x0400 is defined in OpenGLUT.
*/
#define GLUT_AUX 0x1000
#define GLUT_AUX1 0x1000
#define GLUT_AUX2 0x2000
#define GLUT_AUX3 0x4000
#define GLUT_AUX4 0x8000
/*
* Context-related flags, see freeglut_state.c
*/
#define GLUT_INIT_MAJOR_VERSION 0x0200
#define GLUT_INIT_MINOR_VERSION 0x0201
#define GLUT_INIT_FLAGS 0x0202
#define GLUT_INIT_PROFILE 0x0203
/*
* Flags for glutInitContextFlags, see freeglut_init.c
*/
#define GLUT_DEBUG 0x0001
#define GLUT_FORWARD_COMPATIBLE 0x0002
/*
* Flags for glutInitContextProfile, see freeglut_init.c
*/
#define GLUT_CORE_PROFILE 0x0001
#define GLUT_COMPATIBILITY_PROFILE 0x0002
/*
* Process loop function, see freeglut_main.c
*/
FGAPI void FGAPIENTRY glutMainLoopEvent( void );
FGAPI void FGAPIENTRY glutLeaveMainLoop( void );
FGAPI void FGAPIENTRY glutExit ( void );
/*
* Window management functions, see freeglut_window.c
*/
FGAPI void FGAPIENTRY glutFullScreenToggle( void );
FGAPI void FGAPIENTRY glutLeaveFullScreen( void );
/*
* Window-specific callback functions, see freeglut_callbacks.c
*/
FGAPI void FGAPIENTRY glutMouseWheelFunc( void (* callback)( int, int, int, int ) );
FGAPI void FGAPIENTRY glutCloseFunc( void (* callback)( void ) );
FGAPI void FGAPIENTRY glutWMCloseFunc( void (* callback)( void ) );
/* A. Donev: Also a destruction callback for menus */
FGAPI void FGAPIENTRY glutMenuDestroyFunc( void (* callback)( void ) );
/*
* State setting and retrieval functions, see freeglut_state.c
*/
FGAPI void FGAPIENTRY glutSetOption ( GLenum option_flag, int value );
FGAPI int * FGAPIENTRY glutGetModeValues(GLenum mode, int * size);
/* A.Donev: User-data manipulation */
FGAPI void* FGAPIENTRY glutGetWindowData( void );
FGAPI void FGAPIENTRY glutSetWindowData(void* data);
FGAPI void* FGAPIENTRY glutGetMenuData( void );
FGAPI void FGAPIENTRY glutSetMenuData(void* data);
/*
* Font stuff, see freeglut_font.c
*/
FGAPI int FGAPIENTRY glutBitmapHeight( void* font );
FGAPI GLfloat FGAPIENTRY glutStrokeHeight( void* font );
FGAPI void FGAPIENTRY glutBitmapString( void* font, const unsigned char *string );
FGAPI void FGAPIENTRY glutStrokeString( void* font, const unsigned char *string );
/*
* Geometry functions, see freeglut_geometry.c
*/
FGAPI void FGAPIENTRY glutWireRhombicDodecahedron( void );
FGAPI void FGAPIENTRY glutSolidRhombicDodecahedron( void );
FGAPI void FGAPIENTRY glutWireSierpinskiSponge ( int num_levels, GLdouble offset[3], GLdouble scale );
FGAPI void FGAPIENTRY glutSolidSierpinskiSponge ( int num_levels, GLdouble offset[3], GLdouble scale );
FGAPI void FGAPIENTRY glutWireCylinder( GLdouble radius, GLdouble height, GLint slices, GLint stacks);
FGAPI void FGAPIENTRY glutSolidCylinder( GLdouble radius, GLdouble height, GLint slices, GLint stacks);
/*
* Extension functions, see freeglut_ext.c
*/
typedef void (*GLUTproc)();
FGAPI GLUTproc FGAPIENTRY glutGetProcAddress( const char *procName );
/*
* Multi-touch/multi-pointer extensions
*/
#define GLUT_HAS_MULTI 1
FGAPI void FGAPIENTRY glutMultiEntryFunc( void (* callback)( int, int ) );
FGAPI void FGAPIENTRY glutMultiButtonFunc( void (* callback)( int, int, int, int, int ) );
FGAPI void FGAPIENTRY glutMultiMotionFunc( void (* callback)( int, int, int ) );
FGAPI void FGAPIENTRY glutMultiPassiveFunc( void (* callback)( int, int, int ) );
/*
* Joystick functions, see freeglut_joystick.c
*/
/* USE OF THESE FUNCTIONS IS DEPRECATED !!!!! */
/* If you have a serious need for these functions in your application, please either
* contact the "freeglut" developer community at freeglut-developer@lists.sourceforge.net,
* switch to the OpenGLUT library, or else port your joystick functionality over to PLIB's
* "js" library.
*/
int glutJoystickGetNumAxes( int ident );
int glutJoystickGetNumButtons( int ident );
int glutJoystickNotWorking( int ident );
float glutJoystickGetDeadBand( int ident, int axis );
void glutJoystickSetDeadBand( int ident, int axis, float db );
float glutJoystickGetSaturation( int ident, int axis );
void glutJoystickSetSaturation( int ident, int axis, float st );
void glutJoystickSetMinRange( int ident, float *axes );
void glutJoystickSetMaxRange( int ident, float *axes );
void glutJoystickSetCenter( int ident, float *axes );
void glutJoystickGetMinRange( int ident, float *axes );
void glutJoystickGetMaxRange( int ident, float *axes );
void glutJoystickGetCenter( int ident, float *axes );
/*
* Initialization functions, see freeglut_init.c
*/
FGAPI void FGAPIENTRY glutInitContextVersion( int majorVersion, int minorVersion );
FGAPI void FGAPIENTRY glutInitContextFlags( int flags );
FGAPI void FGAPIENTRY glutInitContextProfile( int profile );
/* to get the typedef for va_list */
#include <stdarg.h>
FGAPI void FGAPIENTRY glutInitErrorFunc( void (* vError)( const char *fmt, va_list ap ) );
FGAPI void FGAPIENTRY glutInitWarningFunc( void (* vWarning)( const char *fmt, va_list ap ) );
/*
* GLUT API macro definitions -- the display mode definitions
*/
#define GLUT_CAPTIONLESS 0x0400
#define GLUT_BORDERLESS 0x0800
#define GLUT_SRGB 0x1000
#ifdef __cplusplus
}
#endif
/*** END OF FILE ***/
#endif /* __FREEGLUT_EXT_H__ */

View file

@ -0,0 +1,630 @@
#ifndef __FREEGLUT_STD_H__
#define __FREEGLUT_STD_H__
/*
* freeglut_std.h
*
* The GLUT-compatible part of the freeglut library include file
*
* Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
* Written by Pawel W. Olszta, <olszta@sourceforge.net>
* Creation date: Thu Dec 2 1999
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifdef __cplusplus
extern "C" {
#endif
/*
* Under windows, we have to differentiate between static and dynamic libraries
*/
#ifdef _WIN32
/* #pragma may not be supported by some compilers.
* Discussion by FreeGLUT developers suggests that
* Visual C++ specific code involving pragmas may
* need to move to a separate header. 24th Dec 2003
*/
/* Define FREEGLUT_LIB_PRAGMAS to 1 to include library
* pragmas or to 0 to exclude library pragmas.
* The default behavior depends on the compiler/platform.
*/
# ifndef FREEGLUT_LIB_PRAGMAS
# if ( defined(_MSC_VER) || defined(__WATCOMC__) ) && !defined(_WIN32_WCE)
# define FREEGLUT_LIB_PRAGMAS 1
# else
# define FREEGLUT_LIB_PRAGMAS 0
# endif
# endif
# ifndef WIN32_LEAN_AND_MEAN
# define WIN32_LEAN_AND_MEAN 1
# endif
# ifndef NOMINMAX
# define NOMINMAX
# endif
# include <windows.h>
/* Windows static library */
# ifdef FREEGLUT_STATIC
#error Static linking is not supported with this build. Please remove the FREEGLUT_STATIC preprocessor directive, or download the source code from http://freeglut.sf.net/ and build against that.
/* Windows shared library (DLL) */
# else
# define FGAPIENTRY __stdcall
# if defined(FREEGLUT_EXPORTS)
# define FGAPI __declspec(dllexport)
# else
# define FGAPI __declspec(dllimport)
/* Link with Win32 shared freeglut lib */
# if FREEGLUT_LIB_PRAGMAS
# pragma comment (lib, "freeglut.lib")
# endif
# endif
# endif
/* Drag in other Windows libraries as required by FreeGLUT */
# if FREEGLUT_LIB_PRAGMAS
# pragma comment (lib, "glu32.lib") /* link OpenGL Utility lib */
# pragma comment (lib, "opengl32.lib") /* link Microsoft OpenGL lib */
# pragma comment (lib, "gdi32.lib") /* link Windows GDI lib */
# pragma comment (lib, "winmm.lib") /* link Windows MultiMedia lib */
# pragma comment (lib, "user32.lib") /* link Windows user lib */
# endif
#else
/* Non-Windows definition of FGAPI and FGAPIENTRY */
# define FGAPI
# define FGAPIENTRY
#endif
/*
* The freeglut and GLUT API versions
*/
#define FREEGLUT 1
#define GLUT_API_VERSION 4
#define GLUT_XLIB_IMPLEMENTATION 13
/* Deprecated:
cf. http://sourceforge.net/mailarchive/forum.php?thread_name=CABcAi1hw7cr4xtigckaGXB5X8wddLfMcbA_rZ3NAuwMrX_zmsw%40mail.gmail.com&forum_name=freeglut-developer */
#define FREEGLUT_VERSION_2_0 1
/*
* Always include OpenGL and GLU headers
*/
#if __APPLE__
# include <OpenGL/gl.h>
# include <OpenGL/glu.h>
#else
# include <GL/gl.h>
# include <GL/glu.h>
#endif
/*
* GLUT API macro definitions -- the special key codes:
*/
#define GLUT_KEY_F1 0x0001
#define GLUT_KEY_F2 0x0002
#define GLUT_KEY_F3 0x0003
#define GLUT_KEY_F4 0x0004
#define GLUT_KEY_F5 0x0005
#define GLUT_KEY_F6 0x0006
#define GLUT_KEY_F7 0x0007
#define GLUT_KEY_F8 0x0008
#define GLUT_KEY_F9 0x0009
#define GLUT_KEY_F10 0x000A
#define GLUT_KEY_F11 0x000B
#define GLUT_KEY_F12 0x000C
#define GLUT_KEY_LEFT 0x0064
#define GLUT_KEY_UP 0x0065
#define GLUT_KEY_RIGHT 0x0066
#define GLUT_KEY_DOWN 0x0067
#define GLUT_KEY_PAGE_UP 0x0068
#define GLUT_KEY_PAGE_DOWN 0x0069
#define GLUT_KEY_HOME 0x006A
#define GLUT_KEY_END 0x006B
#define GLUT_KEY_INSERT 0x006C
/*
* GLUT API macro definitions -- mouse state definitions
*/
#define GLUT_LEFT_BUTTON 0x0000
#define GLUT_MIDDLE_BUTTON 0x0001
#define GLUT_RIGHT_BUTTON 0x0002
#define GLUT_DOWN 0x0000
#define GLUT_UP 0x0001
#define GLUT_LEFT 0x0000
#define GLUT_ENTERED 0x0001
/*
* GLUT API macro definitions -- the display mode definitions
*/
#define GLUT_RGB 0x0000
#define GLUT_RGBA 0x0000
#define GLUT_INDEX 0x0001
#define GLUT_SINGLE 0x0000
#define GLUT_DOUBLE 0x0002
#define GLUT_ACCUM 0x0004
#define GLUT_ALPHA 0x0008
#define GLUT_DEPTH 0x0010
#define GLUT_STENCIL 0x0020
#define GLUT_MULTISAMPLE 0x0080
#define GLUT_STEREO 0x0100
#define GLUT_LUMINANCE 0x0200
/*
* GLUT API macro definitions -- windows and menu related definitions
*/
#define GLUT_MENU_NOT_IN_USE 0x0000
#define GLUT_MENU_IN_USE 0x0001
#define GLUT_NOT_VISIBLE 0x0000
#define GLUT_VISIBLE 0x0001
#define GLUT_HIDDEN 0x0000
#define GLUT_FULLY_RETAINED 0x0001
#define GLUT_PARTIALLY_RETAINED 0x0002
#define GLUT_FULLY_COVERED 0x0003
/*
* GLUT API macro definitions -- fonts definitions
*
* Steve Baker suggested to make it binary compatible with GLUT:
*/
#if defined(_MSC_VER) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__WATCOMC__)
# define GLUT_STROKE_ROMAN ((void *)0x0000)
# define GLUT_STROKE_MONO_ROMAN ((void *)0x0001)
# define GLUT_BITMAP_9_BY_15 ((void *)0x0002)
# define GLUT_BITMAP_8_BY_13 ((void *)0x0003)
# define GLUT_BITMAP_TIMES_ROMAN_10 ((void *)0x0004)
# define GLUT_BITMAP_TIMES_ROMAN_24 ((void *)0x0005)
# define GLUT_BITMAP_HELVETICA_10 ((void *)0x0006)
# define GLUT_BITMAP_HELVETICA_12 ((void *)0x0007)
# define GLUT_BITMAP_HELVETICA_18 ((void *)0x0008)
#else
/*
* I don't really know if it's a good idea... But here it goes:
*/
extern void* glutStrokeRoman;
extern void* glutStrokeMonoRoman;
extern void* glutBitmap9By15;
extern void* glutBitmap8By13;
extern void* glutBitmapTimesRoman10;
extern void* glutBitmapTimesRoman24;
extern void* glutBitmapHelvetica10;
extern void* glutBitmapHelvetica12;
extern void* glutBitmapHelvetica18;
/*
* Those pointers will be used by following definitions:
*/
# define GLUT_STROKE_ROMAN ((void *) &glutStrokeRoman)
# define GLUT_STROKE_MONO_ROMAN ((void *) &glutStrokeMonoRoman)
# define GLUT_BITMAP_9_BY_15 ((void *) &glutBitmap9By15)
# define GLUT_BITMAP_8_BY_13 ((void *) &glutBitmap8By13)
# define GLUT_BITMAP_TIMES_ROMAN_10 ((void *) &glutBitmapTimesRoman10)
# define GLUT_BITMAP_TIMES_ROMAN_24 ((void *) &glutBitmapTimesRoman24)
# define GLUT_BITMAP_HELVETICA_10 ((void *) &glutBitmapHelvetica10)
# define GLUT_BITMAP_HELVETICA_12 ((void *) &glutBitmapHelvetica12)
# define GLUT_BITMAP_HELVETICA_18 ((void *) &glutBitmapHelvetica18)
#endif
/*
* GLUT API macro definitions -- the glutGet parameters
*/
#define GLUT_WINDOW_X 0x0064
#define GLUT_WINDOW_Y 0x0065
#define GLUT_WINDOW_WIDTH 0x0066
#define GLUT_WINDOW_HEIGHT 0x0067
#define GLUT_WINDOW_BUFFER_SIZE 0x0068
#define GLUT_WINDOW_STENCIL_SIZE 0x0069
#define GLUT_WINDOW_DEPTH_SIZE 0x006A
#define GLUT_WINDOW_RED_SIZE 0x006B
#define GLUT_WINDOW_GREEN_SIZE 0x006C
#define GLUT_WINDOW_BLUE_SIZE 0x006D
#define GLUT_WINDOW_ALPHA_SIZE 0x006E
#define GLUT_WINDOW_ACCUM_RED_SIZE 0x006F
#define GLUT_WINDOW_ACCUM_GREEN_SIZE 0x0070
#define GLUT_WINDOW_ACCUM_BLUE_SIZE 0x0071
#define GLUT_WINDOW_ACCUM_ALPHA_SIZE 0x0072
#define GLUT_WINDOW_DOUBLEBUFFER 0x0073
#define GLUT_WINDOW_RGBA 0x0074
#define GLUT_WINDOW_PARENT 0x0075
#define GLUT_WINDOW_NUM_CHILDREN 0x0076
#define GLUT_WINDOW_COLORMAP_SIZE 0x0077
#define GLUT_WINDOW_NUM_SAMPLES 0x0078
#define GLUT_WINDOW_STEREO 0x0079
#define GLUT_WINDOW_CURSOR 0x007A
#define GLUT_SCREEN_WIDTH 0x00C8
#define GLUT_SCREEN_HEIGHT 0x00C9
#define GLUT_SCREEN_WIDTH_MM 0x00CA
#define GLUT_SCREEN_HEIGHT_MM 0x00CB
#define GLUT_MENU_NUM_ITEMS 0x012C
#define GLUT_DISPLAY_MODE_POSSIBLE 0x0190
#define GLUT_INIT_WINDOW_X 0x01F4
#define GLUT_INIT_WINDOW_Y 0x01F5
#define GLUT_INIT_WINDOW_WIDTH 0x01F6
#define GLUT_INIT_WINDOW_HEIGHT 0x01F7
#define GLUT_INIT_DISPLAY_MODE 0x01F8
#define GLUT_ELAPSED_TIME 0x02BC
#define GLUT_WINDOW_FORMAT_ID 0x007B
/*
* GLUT API macro definitions -- the glutDeviceGet parameters
*/
#define GLUT_HAS_KEYBOARD 0x0258
#define GLUT_HAS_MOUSE 0x0259
#define GLUT_HAS_SPACEBALL 0x025A
#define GLUT_HAS_DIAL_AND_BUTTON_BOX 0x025B
#define GLUT_HAS_TABLET 0x025C
#define GLUT_NUM_MOUSE_BUTTONS 0x025D
#define GLUT_NUM_SPACEBALL_BUTTONS 0x025E
#define GLUT_NUM_BUTTON_BOX_BUTTONS 0x025F
#define GLUT_NUM_DIALS 0x0260
#define GLUT_NUM_TABLET_BUTTONS 0x0261
#define GLUT_DEVICE_IGNORE_KEY_REPEAT 0x0262
#define GLUT_DEVICE_KEY_REPEAT 0x0263
#define GLUT_HAS_JOYSTICK 0x0264
#define GLUT_OWNS_JOYSTICK 0x0265
#define GLUT_JOYSTICK_BUTTONS 0x0266
#define GLUT_JOYSTICK_AXES 0x0267
#define GLUT_JOYSTICK_POLL_RATE 0x0268
/*
* GLUT API macro definitions -- the glutLayerGet parameters
*/
#define GLUT_OVERLAY_POSSIBLE 0x0320
#define GLUT_LAYER_IN_USE 0x0321
#define GLUT_HAS_OVERLAY 0x0322
#define GLUT_TRANSPARENT_INDEX 0x0323
#define GLUT_NORMAL_DAMAGED 0x0324
#define GLUT_OVERLAY_DAMAGED 0x0325
/*
* GLUT API macro definitions -- the glutVideoResizeGet parameters
*/
#define GLUT_VIDEO_RESIZE_POSSIBLE 0x0384
#define GLUT_VIDEO_RESIZE_IN_USE 0x0385
#define GLUT_VIDEO_RESIZE_X_DELTA 0x0386
#define GLUT_VIDEO_RESIZE_Y_DELTA 0x0387
#define GLUT_VIDEO_RESIZE_WIDTH_DELTA 0x0388
#define GLUT_VIDEO_RESIZE_HEIGHT_DELTA 0x0389
#define GLUT_VIDEO_RESIZE_X 0x038A
#define GLUT_VIDEO_RESIZE_Y 0x038B
#define GLUT_VIDEO_RESIZE_WIDTH 0x038C
#define GLUT_VIDEO_RESIZE_HEIGHT 0x038D
/*
* GLUT API macro definitions -- the glutUseLayer parameters
*/
#define GLUT_NORMAL 0x0000
#define GLUT_OVERLAY 0x0001
/*
* GLUT API macro definitions -- the glutGetModifiers parameters
*/
#define GLUT_ACTIVE_SHIFT 0x0001
#define GLUT_ACTIVE_CTRL 0x0002
#define GLUT_ACTIVE_ALT 0x0004
/*
* GLUT API macro definitions -- the glutSetCursor parameters
*/
#define GLUT_CURSOR_RIGHT_ARROW 0x0000
#define GLUT_CURSOR_LEFT_ARROW 0x0001
#define GLUT_CURSOR_INFO 0x0002
#define GLUT_CURSOR_DESTROY 0x0003
#define GLUT_CURSOR_HELP 0x0004
#define GLUT_CURSOR_CYCLE 0x0005
#define GLUT_CURSOR_SPRAY 0x0006
#define GLUT_CURSOR_WAIT 0x0007
#define GLUT_CURSOR_TEXT 0x0008
#define GLUT_CURSOR_CROSSHAIR 0x0009
#define GLUT_CURSOR_UP_DOWN 0x000A
#define GLUT_CURSOR_LEFT_RIGHT 0x000B
#define GLUT_CURSOR_TOP_SIDE 0x000C
#define GLUT_CURSOR_BOTTOM_SIDE 0x000D
#define GLUT_CURSOR_LEFT_SIDE 0x000E
#define GLUT_CURSOR_RIGHT_SIDE 0x000F
#define GLUT_CURSOR_TOP_LEFT_CORNER 0x0010
#define GLUT_CURSOR_TOP_RIGHT_CORNER 0x0011
#define GLUT_CURSOR_BOTTOM_RIGHT_CORNER 0x0012
#define GLUT_CURSOR_BOTTOM_LEFT_CORNER 0x0013
#define GLUT_CURSOR_INHERIT 0x0064
#define GLUT_CURSOR_NONE 0x0065
#define GLUT_CURSOR_FULL_CROSSHAIR 0x0066
/*
* GLUT API macro definitions -- RGB color component specification definitions
*/
#define GLUT_RED 0x0000
#define GLUT_GREEN 0x0001
#define GLUT_BLUE 0x0002
/*
* GLUT API macro definitions -- additional keyboard and joystick definitions
*/
#define GLUT_KEY_REPEAT_OFF 0x0000
#define GLUT_KEY_REPEAT_ON 0x0001
#define GLUT_KEY_REPEAT_DEFAULT 0x0002
#define GLUT_JOYSTICK_BUTTON_A 0x0001
#define GLUT_JOYSTICK_BUTTON_B 0x0002
#define GLUT_JOYSTICK_BUTTON_C 0x0004
#define GLUT_JOYSTICK_BUTTON_D 0x0008
/*
* GLUT API macro definitions -- game mode definitions
*/
#define GLUT_GAME_MODE_ACTIVE 0x0000
#define GLUT_GAME_MODE_POSSIBLE 0x0001
#define GLUT_GAME_MODE_WIDTH 0x0002
#define GLUT_GAME_MODE_HEIGHT 0x0003
#define GLUT_GAME_MODE_PIXEL_DEPTH 0x0004
#define GLUT_GAME_MODE_REFRESH_RATE 0x0005
#define GLUT_GAME_MODE_DISPLAY_CHANGED 0x0006
/*
* Initialization functions, see fglut_init.c
*/
FGAPI void FGAPIENTRY glutInit( int* pargc, char** argv );
FGAPI void FGAPIENTRY glutInitWindowPosition( int x, int y );
FGAPI void FGAPIENTRY glutInitWindowSize( int width, int height );
FGAPI void FGAPIENTRY glutInitDisplayMode( unsigned int displayMode );
FGAPI void FGAPIENTRY glutInitDisplayString( const char* displayMode );
/*
* Process loop function, see freeglut_main.c
*/
FGAPI void FGAPIENTRY glutMainLoop( void );
/*
* Window management functions, see freeglut_window.c
*/
FGAPI int FGAPIENTRY glutCreateWindow( const char* title );
FGAPI int FGAPIENTRY glutCreateSubWindow( int window, int x, int y, int width, int height );
FGAPI void FGAPIENTRY glutDestroyWindow( int window );
FGAPI void FGAPIENTRY glutSetWindow( int window );
FGAPI int FGAPIENTRY glutGetWindow( void );
FGAPI void FGAPIENTRY glutSetWindowTitle( const char* title );
FGAPI void FGAPIENTRY glutSetIconTitle( const char* title );
FGAPI void FGAPIENTRY glutReshapeWindow( int width, int height );
FGAPI void FGAPIENTRY glutPositionWindow( int x, int y );
FGAPI void FGAPIENTRY glutShowWindow( void );
FGAPI void FGAPIENTRY glutHideWindow( void );
FGAPI void FGAPIENTRY glutIconifyWindow( void );
FGAPI void FGAPIENTRY glutPushWindow( void );
FGAPI void FGAPIENTRY glutPopWindow( void );
FGAPI void FGAPIENTRY glutFullScreen( void );
/*
* Display-connected functions, see freeglut_display.c
*/
FGAPI void FGAPIENTRY glutPostWindowRedisplay( int window );
FGAPI void FGAPIENTRY glutPostRedisplay( void );
FGAPI void FGAPIENTRY glutSwapBuffers( void );
/*
* Mouse cursor functions, see freeglut_cursor.c
*/
FGAPI void FGAPIENTRY glutWarpPointer( int x, int y );
FGAPI void FGAPIENTRY glutSetCursor( int cursor );
/*
* Overlay stuff, see freeglut_overlay.c
*/
FGAPI void FGAPIENTRY glutEstablishOverlay( void );
FGAPI void FGAPIENTRY glutRemoveOverlay( void );
FGAPI void FGAPIENTRY glutUseLayer( GLenum layer );
FGAPI void FGAPIENTRY glutPostOverlayRedisplay( void );
FGAPI void FGAPIENTRY glutPostWindowOverlayRedisplay( int window );
FGAPI void FGAPIENTRY glutShowOverlay( void );
FGAPI void FGAPIENTRY glutHideOverlay( void );
/*
* Menu stuff, see freeglut_menu.c
*/
FGAPI int FGAPIENTRY glutCreateMenu( void (* callback)( int menu ) );
FGAPI void FGAPIENTRY glutDestroyMenu( int menu );
FGAPI int FGAPIENTRY glutGetMenu( void );
FGAPI void FGAPIENTRY glutSetMenu( int menu );
FGAPI void FGAPIENTRY glutAddMenuEntry( const char* label, int value );
FGAPI void FGAPIENTRY glutAddSubMenu( const char* label, int subMenu );
FGAPI void FGAPIENTRY glutChangeToMenuEntry( int item, const char* label, int value );
FGAPI void FGAPIENTRY glutChangeToSubMenu( int item, const char* label, int value );
FGAPI void FGAPIENTRY glutRemoveMenuItem( int item );
FGAPI void FGAPIENTRY glutAttachMenu( int button );
FGAPI void FGAPIENTRY glutDetachMenu( int button );
/*
* Global callback functions, see freeglut_callbacks.c
*/
FGAPI void FGAPIENTRY glutTimerFunc( unsigned int time, void (* callback)( int ), int value );
FGAPI void FGAPIENTRY glutIdleFunc( void (* callback)( void ) );
/*
* Window-specific callback functions, see freeglut_callbacks.c
*/
FGAPI void FGAPIENTRY glutKeyboardFunc( void (* callback)( unsigned char, int, int ) );
FGAPI void FGAPIENTRY glutSpecialFunc( void (* callback)( int, int, int ) );
FGAPI void FGAPIENTRY glutReshapeFunc( void (* callback)( int, int ) );
FGAPI void FGAPIENTRY glutVisibilityFunc( void (* callback)( int ) );
FGAPI void FGAPIENTRY glutDisplayFunc( void (* callback)( void ) );
FGAPI void FGAPIENTRY glutMouseFunc( void (* callback)( int, int, int, int ) );
FGAPI void FGAPIENTRY glutMotionFunc( void (* callback)( int, int ) );
FGAPI void FGAPIENTRY glutPassiveMotionFunc( void (* callback)( int, int ) );
FGAPI void FGAPIENTRY glutEntryFunc( void (* callback)( int ) );
FGAPI void FGAPIENTRY glutKeyboardUpFunc( void (* callback)( unsigned char, int, int ) );
FGAPI void FGAPIENTRY glutSpecialUpFunc( void (* callback)( int, int, int ) );
FGAPI void FGAPIENTRY glutJoystickFunc( void (* callback)( unsigned int, int, int, int ), int pollInterval );
FGAPI void FGAPIENTRY glutMenuStateFunc( void (* callback)( int ) );
FGAPI void FGAPIENTRY glutMenuStatusFunc( void (* callback)( int, int, int ) );
FGAPI void FGAPIENTRY glutOverlayDisplayFunc( void (* callback)( void ) );
FGAPI void FGAPIENTRY glutWindowStatusFunc( void (* callback)( int ) );
FGAPI void FGAPIENTRY glutSpaceballMotionFunc( void (* callback)( int, int, int ) );
FGAPI void FGAPIENTRY glutSpaceballRotateFunc( void (* callback)( int, int, int ) );
FGAPI void FGAPIENTRY glutSpaceballButtonFunc( void (* callback)( int, int ) );
FGAPI void FGAPIENTRY glutButtonBoxFunc( void (* callback)( int, int ) );
FGAPI void FGAPIENTRY glutDialsFunc( void (* callback)( int, int ) );
FGAPI void FGAPIENTRY glutTabletMotionFunc( void (* callback)( int, int ) );
FGAPI void FGAPIENTRY glutTabletButtonFunc( void (* callback)( int, int, int, int ) );
/*
* State setting and retrieval functions, see freeglut_state.c
*/
FGAPI int FGAPIENTRY glutGet( GLenum query );
FGAPI int FGAPIENTRY glutDeviceGet( GLenum query );
FGAPI int FGAPIENTRY glutGetModifiers( void );
FGAPI int FGAPIENTRY glutLayerGet( GLenum query );
/*
* Font stuff, see freeglut_font.c
*/
FGAPI void FGAPIENTRY glutBitmapCharacter( void* font, int character );
FGAPI int FGAPIENTRY glutBitmapWidth( void* font, int character );
FGAPI void FGAPIENTRY glutStrokeCharacter( void* font, int character );
FGAPI int FGAPIENTRY glutStrokeWidth( void* font, int character );
FGAPI int FGAPIENTRY glutBitmapLength( void* font, const unsigned char* string );
FGAPI int FGAPIENTRY glutStrokeLength( void* font, const unsigned char* string );
/*
* Geometry functions, see freeglut_geometry.c
*/
FGAPI void FGAPIENTRY glutWireCube( GLdouble size );
FGAPI void FGAPIENTRY glutSolidCube( GLdouble size );
FGAPI void FGAPIENTRY glutWireSphere( GLdouble radius, GLint slices, GLint stacks );
FGAPI void FGAPIENTRY glutSolidSphere( GLdouble radius, GLint slices, GLint stacks );
FGAPI void FGAPIENTRY glutWireCone( GLdouble base, GLdouble height, GLint slices, GLint stacks );
FGAPI void FGAPIENTRY glutSolidCone( GLdouble base, GLdouble height, GLint slices, GLint stacks );
FGAPI void FGAPIENTRY glutWireTorus( GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings );
FGAPI void FGAPIENTRY glutSolidTorus( GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings );
FGAPI void FGAPIENTRY glutWireDodecahedron( void );
FGAPI void FGAPIENTRY glutSolidDodecahedron( void );
FGAPI void FGAPIENTRY glutWireOctahedron( void );
FGAPI void FGAPIENTRY glutSolidOctahedron( void );
FGAPI void FGAPIENTRY glutWireTetrahedron( void );
FGAPI void FGAPIENTRY glutSolidTetrahedron( void );
FGAPI void FGAPIENTRY glutWireIcosahedron( void );
FGAPI void FGAPIENTRY glutSolidIcosahedron( void );
/*
* Teapot rendering functions, found in freeglut_teapot.c
* NB: front facing polygons have clockwise winding, not counter clockwise
*/
FGAPI void FGAPIENTRY glutWireTeapot( GLdouble size );
FGAPI void FGAPIENTRY glutSolidTeapot( GLdouble size );
/*
* Game mode functions, see freeglut_gamemode.c
*/
FGAPI void FGAPIENTRY glutGameModeString( const char* string );
FGAPI int FGAPIENTRY glutEnterGameMode( void );
FGAPI void FGAPIENTRY glutLeaveGameMode( void );
FGAPI int FGAPIENTRY glutGameModeGet( GLenum query );
/*
* Video resize functions, see freeglut_videoresize.c
*/
FGAPI int FGAPIENTRY glutVideoResizeGet( GLenum query );
FGAPI void FGAPIENTRY glutSetupVideoResizing( void );
FGAPI void FGAPIENTRY glutStopVideoResizing( void );
FGAPI void FGAPIENTRY glutVideoResize( int x, int y, int width, int height );
FGAPI void FGAPIENTRY glutVideoPan( int x, int y, int width, int height );
/*
* Colormap functions, see freeglut_misc.c
*/
FGAPI void FGAPIENTRY glutSetColor( int color, GLfloat red, GLfloat green, GLfloat blue );
FGAPI GLfloat FGAPIENTRY glutGetColor( int color, int component );
FGAPI void FGAPIENTRY glutCopyColormap( int window );
/*
* Misc keyboard and joystick functions, see freeglut_misc.c
*/
FGAPI void FGAPIENTRY glutIgnoreKeyRepeat( int ignore );
FGAPI void FGAPIENTRY glutSetKeyRepeat( int repeatMode );
FGAPI void FGAPIENTRY glutForceJoystickFunc( void );
/*
* Misc functions, see freeglut_misc.c
*/
FGAPI int FGAPIENTRY glutExtensionSupported( const char* extension );
FGAPI void FGAPIENTRY glutReportErrors( void );
/* Comment from glut.h of classic GLUT:
Win32 has an annoying issue where there are multiple C run-time
libraries (CRTs). If the executable is linked with a different CRT
from the GLUT DLL, the GLUT DLL will not share the same CRT static
data seen by the executable. In particular, atexit callbacks registered
in the executable will not be called if GLUT calls its (different)
exit routine). GLUT is typically built with the
"/MD" option (the CRT with multithreading DLL support), but the Visual
C++ linker default is "/ML" (the single threaded CRT).
One workaround to this issue is requiring users to always link with
the same CRT as GLUT is compiled with. That requires users supply a
non-standard option. GLUT 3.7 has its own built-in workaround where
the executable's "exit" function pointer is covertly passed to GLUT.
GLUT then calls the executable's exit function pointer to ensure that
any "atexit" calls registered by the application are called if GLUT
needs to exit.
Note that the __glut*WithExit routines should NEVER be called directly.
To avoid the atexit workaround, #define GLUT_DISABLE_ATEXIT_HACK. */
/* to get the prototype for exit() */
#include <stdlib.h>
#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) && !defined(__WATCOMC__)
FGAPI void FGAPIENTRY __glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int));
FGAPI int FGAPIENTRY __glutCreateWindowWithExit(const char *title, void (__cdecl *exitfunc)(int));
FGAPI int FGAPIENTRY __glutCreateMenuWithExit(void (* func)(int), void (__cdecl *exitfunc)(int));
#ifndef FREEGLUT_BUILDING_LIB
#if defined(__GNUC__)
#define FGUNUSED __attribute__((unused))
#else
#define FGUNUSED
#endif
static void FGAPIENTRY FGUNUSED glutInit_ATEXIT_HACK(int *argcp, char **argv) { __glutInitWithExit(argcp, argv, exit); }
#define glutInit glutInit_ATEXIT_HACK
static int FGAPIENTRY FGUNUSED glutCreateWindow_ATEXIT_HACK(const char *title) { return __glutCreateWindowWithExit(title, exit); }
#define glutCreateWindow glutCreateWindow_ATEXIT_HACK
static int FGAPIENTRY FGUNUSED glutCreateMenu_ATEXIT_HACK(void (* func)(int)) { return __glutCreateMenuWithExit(func, exit); }
#define glutCreateMenu glutCreateMenu_ATEXIT_HACK
#endif
#endif
#ifdef __cplusplus
}
#endif
/*** END OF FILE ***/
#endif /* __FREEGLUT_STD_H__ */

View file

@ -0,0 +1,21 @@
#ifndef __GLUT_H__
#define __GLUT_H__
/*
* glut.h
*
* The freeglut library include file
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include "freeglut_std.h"
/*** END OF FILE ***/
#endif /* __GLUT_H__ */

Binary file not shown.

Binary file not shown.

73
interface/external/glew/LICENSE.txt vendored Normal file
View file

@ -0,0 +1,73 @@
The OpenGL Extension Wrangler Library
Copyright (C) 2002-2007, Milan Ikits <milan ikits[]ieee org>
Copyright (C) 2002-2007, Marcelo E. Magallon <mmagallo[]debian org>
Copyright (C) 2002, Lev Povalahev
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.
* The name of the author 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.
Mesa 3-D graphics library
Version: 7.0
Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Copyright (c) 2007 The Khronos Group Inc.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and/or associated documentation files (the
"Materials"), to deal in the Materials without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Materials, and to
permit persons to whom the Materials are furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Materials.
THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.

18
interface/external/glew/README.txt vendored Normal file
View file

@ -0,0 +1,18 @@
See doc/index.html for more information.
If you downloaded the tarball from the GLEW website, you just need to:
Unix:
make
Windows:
use the project file in build/vc6/
If you wish to build GLEW from scratch (update the extension data from
the net or add your own extension information), you need a Unix
environment (including wget, perl, and GNU make). The extension data
is regenerated from the top level source directory with:
make extensions

12
interface/external/glew/TODO.txt vendored Normal file
View file

@ -0,0 +1,12 @@
Major:
- add support for windows mini-client drivers
- add windows installer (msi)
- separate build of static and shared object files (for mingw and
cygwin)
- start designing GLEW 2.0
Minor:
- make auto scripts work with text mode cygwin mounts
- add support for all SUN, MTX, and OML extensions
- make auto/Makefile more robust against auto/core/*~ mistakes
- web poll on separating glew, glxew and wglew

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,272 @@
<!-- begin header.html -->
<!--
The OpenGL Extension Wrangler Library
Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>
Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>
Copyright (C) 2002, Lev Povalahev
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.
* The name of the author 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.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html/4/loose.dtd">
<!-- &nbsp;<img src="new.png" height="12" alt="NEW!"> -->
<html>
<head>
<title>GLEW: The OpenGL Extension Wrangler Library</title>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<link href="glew.css" type="text/css" rel="stylesheet">
</head>
<body bgcolor="#fff0d0">
<table border="0" width="100%" cellpadding="12" cellspacing="8" style="height:100%">
<tr>
<td bgcolor="#ffffff" align="left" valign="top" width="200">
<table border="0" width="100%" cellpadding="0" cellspacing="0" align="left">
<tr>
<td valign="top">
<table border="0" width="100%" cellpadding="0" cellspacing="0" align="left">
<tr><td align="center"><i>Latest Release: <a href="https://sourceforge.net/projects/glew/files/glew/1.10.0/">1.10.0</a></i></td></tr>
<tr><td align="center"><br></td></tr>
<tr><td align="center"><img src="./glew.png" alt="GLEW Logo" width="97" height="75"></td></tr>
<tr><td align="center"><br></td></tr>
<tr><td align="center">
<table border="0" cellpadding="0" cellspacing="0" align="center">
<tr><td align="center"><a href="index.html">Download</a></td></tr>
<tr><td align="center"><a href="basic.html">Usage</a></td></tr>
<tr><td align="center"><a href="build.html">Building</a></td></tr>
<tr><td align="center"><a href="install.html">Installation</a></td></tr>
<tr><td align="center">Source Generation</td></tr>
<tr><td align="center"><a href="credits.html">Credits & Copyright</a></td></tr>
<tr><td align="center"><a href="log.html">Change Log</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/projects/glew">Project Page</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/p/glew/mailman">Mailing Lists</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/p/glew/_list/tickets">Bug Tracker</a></td></tr>
</table>
<tr><td align="center"><br></tr>
</table>
</td>
</tr>
<tr>
<td valign="bottom">
<table border="0" width="100%" cellpadding="5" cellspacing="0" align="left">
<tr><td align="center"><i>Last Update: 07-22-13</i></td></tr>
<tr><td align="center">
<a href="http://www.opengl.org"> <img src="./ogl_sm.jpg" width="68"
height="35" border="0" alt="OpenGL Logo"></a>
<a href="http://sourceforge.net"> <img
src="http://sourceforge.net/sflogo.php?group_id=67586&amp;type=1"
width="88" height="31" border="0" alt="SourceForge Logo"></a>
</td>
</tr>
<!--- <tr><td align="center"><a
href="http://sourceforge.net/donate/index.php?group_id=67586"><img
src="http://images.sourceforge.net/images/project-support.jpg"
width="88" height="32" border="0" alt="Support This Project"></a></td></tr> -->
</table>
</td>
</tr>
</table>
</td>
<td bgcolor="#ffffff" align="left" valign="top">
<h1>The OpenGL Extension Wrangler Library</h1>
<!-- end header.html -->
<h2>Automatic Code Generation</h2>
<p>
Starting from release 1.1.0, the source code and parts of the
documentation are automatically generated from the extension
specifications in a two-step process. In the first step,
specification files from the OpenGL registry are downloaded and
parsed. Skeleton descriptors are created for each extension. These
descriptors contain all necessary information for creating the source
code and documentation in a simple and compact format, including the
name of the extension, url link to the specification, tokens, function
declarations, typedefs and struct definitions. In the second step,
the header files as well as the library and glewinfo source are
generated from the descriptor files. The code generation scripts are
located in the <tt>auto</tt> subdirectory.
</p>
<p>
The code generation scripts require GNU make, wget, and perl. On
Windows, the simplest way to get access to these tools is to install
<a href="http://www.cygwin.com/">Cygwin</a>, but make sure that the
root directory is mounted in binary mode. The makefile in the
<tt>auto</tt> directory provides the following build targets:
</p>
<table border=0 cellpadding=0 cellspacing=5>
<tr><td align="left" valign="top"><tt>make</tt></td>
<td align=left>Create the source files from the descriptors.<br/> If the
descriptors do not exist, create them from the spec files.<br/> If the spec
files do not exist, download them from the OpenGL repository.</td></tr>
<tr><td align="left" valign="top"><tt>make&nbsp;clean</tt></td>
<td align=left>Delete the source files.</td></tr>
<tr><td align="left" valign="top"><tt>make&nbsp;clobber</tt></td>
<td align=left>Delete the source files and the descriptors.</td></tr>
<tr><td align="left" valign="top"><tt>make&nbsp;destroy</tt></td>
<td align=left>Delete the source files, the descriptors, and the spec files.</td></tr>
<tr><td align="left" valign="top"><tt>make&nbsp;custom</tt></td>
<td align=left>Create the source files for the extensions
listed in <tt>auto/custom.txt</tt>.<br/> See "Custom Code
Generation" below for more details.</td></tr>
</table>
<h3>Adding a New Extension</h3>
<p>
To add a new extension, create a descriptor file for the extension in
<tt>auto/core</tt> and rerun the code generation scripts by typing
<tt>make clean; make</tt> in the <tt>auto</tt> directory.
</p>
<p>
The format of the descriptor file is given below. Items in
brackets are optional.
</p>
<p class="pre">
&lt;Extension Name&gt;<br>
[&lt;URL of Specification File&gt;]<br>
&nbsp;&nbsp;&nbsp;&nbsp;[&lt;Token Name&gt; &lt;Token Value&gt;]<br>
&nbsp;&nbsp;&nbsp;&nbsp;[&lt;Token Name&gt; &lt;Token Value&gt;]<br>
&nbsp;&nbsp;&nbsp;&nbsp;...<br>
&nbsp;&nbsp;&nbsp;&nbsp;[&lt;Typedef&gt;]<br>
&nbsp;&nbsp;&nbsp;&nbsp;[&lt;Typedef&gt;]<br>
&nbsp;&nbsp;&nbsp;&nbsp;...<br>
&nbsp;&nbsp;&nbsp;&nbsp;[&lt;Function Signature&gt;]<br>
&nbsp;&nbsp;&nbsp;&nbsp;[&lt;Function Signature&gt;]<br>
&nbsp;&nbsp;&nbsp;&nbsp;...<br>
<!-- &nbsp;&nbsp;&nbsp;&nbsp;[&lt;Function Definition&gt;]<br>
&nbsp;&nbsp;&nbsp;&nbsp;[&lt;Function Definition&gt;]<br>
&nbsp;&nbsp;&nbsp;&nbsp;...<br> -->
</p>
<!--
<p>
Note that <tt>Function Definitions</tt> are copied to the header files
without changes and have to be terminated with a semicolon. In
contrast, <tt>Tokens</tt>, <tt>Function signatures</tt>, and
<tt>Typedefs</tt> should not be terminated with a semicolon.
</p>
-->
<p>
Take a look at one of the files in <tt>auto/core</tt> for an
example. Note that typedefs and function signatures should not be
terminated with a semicolon.
</p>
<h3>Custom Code Generation</h3>
<p>
Starting from GLEW 1.3.0, it is possible to control which extensions
to include in the libarary by specifying a list in
<tt>auto/custom.txt</tt>. This is useful when you do not need all the
extensions and would like to reduce the size of the source files.
Type <tt>make clean; make custom</tt> in the <tt>auto</tt> directory
to rerun the scripts with the custom list of extensions.
</p>
<p>
For example, the following is the list of extensions needed to get GLEW and the
utilities to compile.
</p>
<p class="pre">
WGL_ARB_extensions_string<br>
WGL_ARB_multisample<br>
WGL_ARB_pixel_format<br>
WGL_ARB_pbuffer<br>
WGL_EXT_extensions_string<br>
WGL_ATI_pixel_format_float<br>
WGL_NV_float_buffer<br>
</p>
<h2>Multiple Rendering Contexts (GLEW MX)</h2>
<p>Starting with release 1.2.0, thread-safe support for multiple
rendering contexts, possibly with different capabilities, is
available. Since this is not required by most users, it is not added
to the binary releases to maintain compatibility between different
versions. To include multi-context support, you have to do the
following:</p>
<ol>
<li>Compile and use GLEW with the <tt>GLEW_MX</tt> preprocessor token
defined.</li>
<li>For each rendering context, create a <tt>GLEWContext</tt> object
that will be available as long as the rendering context exists.</li>
<li>Define a macro or function called <tt>glewGetContext()</tt> that
returns a pointer to the <tt>GLEWContext</tt> object associated with
the rendering context from which OpenGL/WGL/GLX calls are issued. This
dispatch mechanism is primitive, but generic.
<li>Make sure that you call <tt>glewInit()</tt> after creating the
<tt>GLEWContext</tt> object in each rendering context. Note, that the
<tt>GLEWContext</tt> pointer returned by <tt>glewGetContext()</tt> has
to reside in global or thread-local memory.
</ol>
<p>Note that according to the <a
href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/ntopnglr_6yer.asp">MSDN
WGL documentation</a>, you have to initialize the entry points for
every rendering context that use pixel formats with different
capabilities For example, the pixel formats provided by the generic
software OpenGL implementation by Microsoft vs. the hardware
accelerated pixel formats have different capabilities. <b>GLEW by
default ignores this requirement, and does not define per-context
entry points (you can however do this using the steps described
above).</b> Assuming a global namespace for the entry points works in
most situations, because typically all hardware accelerated pixel
formats provide the same entry points and capabilities. This means
that unless you use the multi-context version of GLEW, you need to
call <tt>glewInit()</tt> only once in your program, or more precisely,
once per process.</p>
<h2>Separate Namespace</h2>
<p>
To avoid name clashes when linking with libraries that include the
same symbols, extension entry points are declared in a separate
namespace (release 1.1.0 and up). This is achieved by aliasing OpenGL
function names to their GLEW equivalents. For instance,
<tt>glFancyFunction</tt> is simply an alias to
<tt>glewFancyFunction</tt>. The separate namespace does not effect
token and function pointer definitions.
</p>
<h2>Known Issues</h2>
<p>
GLEW requires GLX 1.2 for compatibility with GLUT.
</p>
<!-- begin footer.html -->
</td></tr></table></body>
<!-- end footer.html -->

283
interface/external/glew/doc/basic.html vendored Normal file
View file

@ -0,0 +1,283 @@
<!-- begin header.html -->
<!--
The OpenGL Extension Wrangler Library
Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>
Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>
Copyright (C) 2002, Lev Povalahev
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.
* The name of the author 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.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html/4/loose.dtd">
<!-- &nbsp;<img src="new.png" height="12" alt="NEW!"> -->
<html>
<head>
<title>GLEW: The OpenGL Extension Wrangler Library</title>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<link href="glew.css" type="text/css" rel="stylesheet">
</head>
<body bgcolor="#fff0d0">
<table border="0" width="100%" cellpadding="12" cellspacing="8" style="height:100%">
<tr>
<td bgcolor="#ffffff" align="left" valign="top" width="200">
<table border="0" width="100%" cellpadding="0" cellspacing="0" align="left">
<tr>
<td valign="top">
<table border="0" width="100%" cellpadding="0" cellspacing="0" align="left">
<tr><td align="center"><i>Latest Release: <a href="https://sourceforge.net/projects/glew/files/glew/1.10.0/">1.10.0</a></i></td></tr>
<tr><td align="center"><br></td></tr>
<tr><td align="center"><img src="./glew.png" alt="GLEW Logo" width="97" height="75"></td></tr>
<tr><td align="center"><br></td></tr>
<tr><td align="center">
<table border="0" cellpadding="0" cellspacing="0" align="center">
<tr><td align="center"><a href="index.html">Download</a></td></tr>
<tr><td align="center">Usage</td></tr>
<tr><td align="center"><a href="build.html">Building</a></td></tr>
<tr><td align="center"><a href="install.html">Installation</a></td></tr>
<tr><td align="center"><a href="advanced.html">Source Generation</a></td></tr>
<tr><td align="center"><a href="credits.html">Credits & Copyright</a></td></tr>
<tr><td align="center"><a href="log.html">Change Log</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/projects/glew">Project Page</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/p/glew/mailman">Mailing Lists</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/p/glew/_list/tickets">Bug Tracker</a></td></tr>
</table>
<tr><td align="center"><br></tr>
</table>
</td>
</tr>
<tr>
<td valign="bottom">
<table border="0" width="100%" cellpadding="5" cellspacing="0" align="left">
<tr><td align="center"><i>Last Update: 07-22-13</i></td></tr>
<tr><td align="center">
<a href="http://www.opengl.org"> <img src="./ogl_sm.jpg" width="68"
height="35" border="0" alt="OpenGL Logo"></a>
<a href="http://sourceforge.net"> <img
src="http://sourceforge.net/sflogo.php?group_id=67586&amp;type=1"
width="88" height="31" border="0" alt="SourceForge Logo"></a>
</td>
</tr>
<!--- <tr><td align="center"><a
href="http://sourceforge.net/donate/index.php?group_id=67586"><img
src="http://images.sourceforge.net/images/project-support.jpg"
width="88" height="32" border="0" alt="Support This Project"></a></td></tr> -->
</table>
</td>
</tr>
</table>
</td>
<td bgcolor="#ffffff" align="left" valign="top">
<h1>The OpenGL Extension Wrangler Library</h1>
<!-- end header.html -->
<h2>Initializing GLEW</h2>
<p>
First you need to create a valid OpenGL rendering context and call
<tt>glewInit()</tt> to initialize the extension entry points. If
<tt>glewInit()</tt> returns <tt>GLEW_OK</tt>, the initialization
succeeded and you can use the available extensions as well as core
OpenGL functionality. For example:
</p>
<p class="pre">
#include &lt;GL/glew.h&gt;<br>
#include &lt;GL/glut.h&gt;<br>
...<br>
glutInit(&amp;argc, argv);<br>
glutCreateWindow("GLEW Test");<br>
GLenum err = glewInit();<br>
if (GLEW_OK != err)<br>
{<br>
&nbsp;&nbsp;/* Problem: glewInit failed, something is seriously wrong. */<br>
&nbsp;&nbsp;fprintf(stderr, "Error: %s\n", glewGetErrorString(err));<br>
&nbsp;&nbsp;...<br>
}<br>
fprintf(stdout, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION));<br>
</p>
<h2>Checking for Extensions</h2>
<p>
Starting from GLEW 1.1.0, you can find out if a particular extension
is available on your platform by querying globally defined variables
of the form <tt>GLEW_{extension_name}</tt>:
</p>
<p class="pre">
if (GLEW_ARB_vertex_program)<br>
{<br>
&nbsp;&nbsp;/* It is safe to use the ARB_vertex_program extension here. */<br>
&nbsp;&nbsp;glGenProgramsARB(...);<br>
}<br>
</p>
<p>
<b>In GLEW 1.0.x, a global structure was used for this task. To ensure
binary compatibility between releases, the struct was replaced with a
set of variables.</b>
</p>
<p>
You can also check for core OpenGL functionality. For example, to
see if OpenGL 1.3 is supported, do the following:
</p>
<p class="pre">
if (GLEW_VERSION_1_3)<br>
{<br>
&nbsp;&nbsp;/* Yay! OpenGL 1.3 is supported! */<br>
}<br>
</p>
<p>
In general, you can check if <tt>GLEW_{extension_name}</tt> or
<tt>GLEW_VERSION_{version}</tt> is true or false.
</p>
<p>
It is also possible to perform extension checks from string
input. Starting from the 1.3.0 release, use <tt>glewIsSupported</tt>
to check if the required core or extension functionality is
available:
</p>
<p class="pre">
if (glewIsSupported("GL_VERSION_1_4&nbsp;&nbsp;GL_ARB_point_sprite"))<br>
{<br>
&nbsp;&nbsp;/* Great, we have OpenGL 1.4 + point sprites. */<br>
}<br>
</p>
<p>
For extensions only, <tt>glewGetExtension</tt> provides a slower alternative
(GLEW 1.0.x-1.2.x). <b>Note that in the 1.3.0 release </b>
<tt>glewGetExtension</tt> <b>was replaced with </b>
<tt>glewIsSupported</tt>.
</p>
<p class="pre">
if (glewGetExtension("GL_ARB_fragment_program"))<br>
{<br>
&nbsp;&nbsp;/* Looks like ARB_fragment_program is supported. */<br>
}<br>
</p>
<h2>Experimental Drivers</h2>
<p>
GLEW obtains information on the supported extensions from the graphics
driver. Experimental or pre-release drivers, however, might not
report every available extension through the standard mechanism, in
which case GLEW will report it unsupported. To circumvent this
situation, the <tt>glewExperimental</tt> global switch can be turned
on by setting it to <tt>GL_TRUE</tt> before calling
<tt>glewInit()</tt>, which ensures that all extensions with valid
entry points will be exposed.
</p>
<h2>Platform Specific Extensions</h2>
<p>
Platform specific extensions are separated into two header files:
<tt>wglew.h</tt> and <tt>glxew.h</tt>, which define the available
<tt>WGL</tt> and <tt>GLX</tt> extensions. To determine if a certain
extension is supported, query <tt>WGLEW_{extension name}</tt> or
<tt>GLXEW_{extension_name}</tt>. For example:
</p>
<p class="pre">
#include &lt;GL/wglew.h&gt;<br>
<br>
if (WGLEW_ARB_pbuffer)<br>
{<br>
&nbsp;&nbsp;/* OK, we can use pbuffers. */<br>
}<br>
else<br>
{<br>
&nbsp;&nbsp;/* Sorry, pbuffers will not work on this platform. */<br>
}<br>
</p>
<p>
Alternatively, use <tt>wglewIsSupported</tt> or
<tt>glxewIsSupported</tt> to check for extensions from a string:
</p>
<p class="pre">
if (wglewIsSupported("WGL_ARB_pbuffer"))<br>
{<br>
&nbsp;&nbsp;/* OK, we can use pbuffers. */<br>
}<br>
</p>
<h2>Utilities</h2>
<p>
GLEW provides two command-line utilities: one for creating a list of
available extensions and visuals; and another for verifying extension
entry points.
</p>
<h3>visualinfo: extensions and visuals</h3>
<p>
<tt>visualinfo</tt> is an extended version of <tt>glxinfo</tt>. The
Windows version creates a file called <tt>visualinfo.txt</tt>, which
contains a list of available OpenGL, WGL, and GLU extensions as well
as a table of visuals aka. pixel formats. Pbuffer and MRT capable
visuals are also included. For additional usage information, type
<tt>visualinfo -h</tt>.
</p>
<h3>glewinfo: extension verification utility</h3>
<p>
<tt>glewinfo</tt> allows you to verify the entry points for the
extensions supported on your platform. The Windows version
reports the results to a text file called <tt>glewinfo.txt</tt>. The
Unix version prints the results to <tt>stdout</tt>.
</p>
<p>Windows usage:</p>
<blockquote><pre>glewinfo [-pf &lt;id&gt;]</pre></blockquote>
<p>where <tt>&lt;id&gt;</tt> is the pixel format id for which the
capabilities are displayed.</p>
<p>Unix usage:</p>
<blockquote><pre>glewinfo [-display &lt;dpy&gt;] [-visual &lt;id&gt;]</pre></blockquote>
<p>where <tt>&lt;dpy&gt;</tt> is the X11 display and <tt>&lt;id&gt;</tt> is
the visual id for which the capabilities are displayed.</p>
<!-- begin footer.html -->
</td></tr></table></body>
<!-- end footer.html -->

150
interface/external/glew/doc/build.html vendored Normal file
View file

@ -0,0 +1,150 @@
<!-- begin header.html -->
<!--
The OpenGL Extension Wrangler Library
Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>
Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>
Copyright (C) 2002, Lev Povalahev
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.
* The name of the author 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.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html/4/loose.dtd">
<!-- &nbsp;<img src="new.png" height="12" alt="NEW!"> -->
<html>
<head>
<title>GLEW: The OpenGL Extension Wrangler Library</title>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<link href="glew.css" type="text/css" rel="stylesheet">
</head>
<body bgcolor="#fff0d0">
<table border="0" width="100%" cellpadding="12" cellspacing="8" style="height:100%">
<tr>
<td bgcolor="#ffffff" align="left" valign="top" width="200">
<table border="0" width="100%" cellpadding="0" cellspacing="0" align="left">
<tr>
<td valign="top">
<table border="0" width="100%" cellpadding="0" cellspacing="0" align="left">
<tr><td align="center"><i>Latest Release: <a href="https://sourceforge.net/projects/glew/files/glew/1.10.0/">1.10.0</a></i></td></tr>
<tr><td align="center"><br></td></tr>
<tr><td align="center"><img src="./glew.png" alt="GLEW Logo" width="97" height="75"></td></tr>
<tr><td align="center"><br></td></tr>
<tr><td align="center">
<table border="0" cellpadding="0" cellspacing="0" align="center">
<tr><td align="center"><a href="index.html">Download</a></td></tr>
<tr><td align="center"><a href="basic.html">Usage</a></td></tr>
<tr><td align="center">Building</td></tr>
<tr><td align="center"><a href="install.html">Installation</a></td></tr>
<tr><td align="center"><a href="advanced.html">Source Generation</a></td></tr>
<tr><td align="center"><a href="credits.html">Credits & Copyright</a></td></tr>
<tr><td align="center"><a href="log.html">Change Log</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/projects/glew">Project Page</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/p/glew/mailman">Mailing Lists</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/p/glew/_list/tickets">Bug Tracker</a></td></tr>
</table>
<tr><td align="center"><br></tr>
</table>
</td>
</tr>
<tr>
<td valign="bottom">
<table border="0" width="100%" cellpadding="5" cellspacing="0" align="left">
<tr><td align="center"><i>Last Update: 07-22-13</i></td></tr>
<tr><td align="center">
<a href="http://www.opengl.org"> <img src="./ogl_sm.jpg" width="68"
height="35" border="0" alt="OpenGL Logo"></a>
<a href="http://sourceforge.net"> <img
src="http://sourceforge.net/sflogo.php?group_id=67586&amp;type=1"
width="88" height="31" border="0" alt="SourceForge Logo"></a>
</td>
</tr>
<!--- <tr><td align="center"><a
href="http://sourceforge.net/donate/index.php?group_id=67586"><img
src="http://images.sourceforge.net/images/project-support.jpg"
width="88" height="32" border="0" alt="Support This Project"></a></td></tr> -->
</table>
</td>
</tr>
</table>
</td>
<td bgcolor="#ffffff" align="left" valign="top">
<h1>The OpenGL Extension Wrangler Library</h1>
<!-- end header.html -->
<h2>Building GLEW</h2>
<h3>Windows</h3>
<p>A MS Visual Studio project is provided in the <tt>build/vc6</tt> directory.</p>
<p>Pre-built shared and static libraries are also available for <a href="index.html">download</a>.</p>
<h3>Makefile</h3>
<p>For platforms other than MS Windows, the provided <tt>Makefile</tt> is used.</p>
<h4>Command-line variables</h4>
<table border=0 cellpadding=0 cellspacing=10>
<tr><td valign=top><tt>SYSTEM</tt></td><td valign=top>auto</td>
<td align=left>Target system to build: darwin, linux, solaris, etc.<br/>For a full list of supported targets: <tt>ls config/Makefile.*</tt><br/>
<a href="http://git.savannah.gnu.org/gitweb/?p=config.git;a=tree">config.guess</a> is used to auto detect, as necessary.</td></tr>
<tr><td valign=top><tt>GLEW_DEST</tt></td><td valign=top><tt>/usr</tt></td>
<td align=left>Base directory for installation.</td></tr>
</table>
<h4>Make targets</h4>
<table border=0 cellpadding=0 cellspacing=10>
<tr><td valign=top><tt>all</tt></td><td>Build everything.</td><tr>
<tr><td valign=top><tt>glew.lib</tt></td><td>Build static and dynamic GLEW libraries.</td><tr>
<tr><td valign=top><tt>glew.lib.mx</tt></td><td>Build static and dynamic GLEWmx libraries.</td><tr>
<tr><td valign=top><tt>glew.bin</tt></td><td>Build <tt>glewinfo</tt> and <tt>visualinfo</tt> utilities.</td><tr>
<tr><td valign=top><tt>clean</tt></td><td>Delete temporary and built files.</td><tr>
<tr><td valign=top><tt>install.all</tt></td><td>Install everything.</td><tr>
<tr><td valign=top><tt>install</tt></td><td>Install GLEW libraries.</td><tr>
<tr><td valign=top><tt>install.mx</tt></td><td>Install GLEWmx libraries.</td><tr>
<tr><td valign=top><tt>install.bin</tt></td><td>Install <tt>glewinfo</tt> and <tt>visualinfo</tt> utilities.</td><tr>
<tr><td valign=top><tt>uninstall</tt></td><td>Delete installed files.</td><tr>
</table>
<h4>Requirements</h4>
<ul>
<li>GNU make</li>
<li>perl</li>
<li>wget</li>
<li>GNU sed</li>
<li>gcc compiler</li>
</ul>
Ubuntu: <pre>sudo apt-get install Xmu-dev Xi-Dev</pre>
<!-- begin footer.html -->
</td></tr></table></body>
<!-- end footer.html -->

128
interface/external/glew/doc/credits.html vendored Normal file
View file

@ -0,0 +1,128 @@
<!-- begin header.html -->
<!--
The OpenGL Extension Wrangler Library
Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>
Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>
Copyright (C) 2002, Lev Povalahev
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.
* The name of the author 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.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html/4/loose.dtd">
<!-- &nbsp;<img src="new.png" height="12" alt="NEW!"> -->
<html>
<head>
<title>GLEW: The OpenGL Extension Wrangler Library</title>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<link href="glew.css" type="text/css" rel="stylesheet">
</head>
<body bgcolor="#fff0d0">
<table border="0" width="100%" cellpadding="12" cellspacing="8" style="height:100%">
<tr>
<td bgcolor="#ffffff" align="left" valign="top" width="200">
<table border="0" width="100%" cellpadding="0" cellspacing="0" align="left">
<tr>
<td valign="top">
<table border="0" width="100%" cellpadding="0" cellspacing="0" align="left">
<tr><td align="center"><i>Latest Release: <a href="https://sourceforge.net/projects/glew/files/glew/1.10.0/">1.10.0</a></i></td></tr>
<tr><td align="center"><br></td></tr>
<tr><td align="center"><img src="./glew.png" alt="GLEW Logo" width="97" height="75"></td></tr>
<tr><td align="center"><br></td></tr>
<tr><td align="center">
<table border="0" cellpadding="0" cellspacing="0" align="center">
<tr><td align="center"><a href="index.html">Download</a></td></tr>
<tr><td align="center"><a href="basic.html">Usage</a></td></tr>
<tr><td align="center"><a href="build.html">Building</a></td></tr>
<tr><td align="center"><a href="install.html">Installation</a></td></tr>
<tr><td align="center"><a href="advanced.html">Source Generation</a></td></tr>
<tr><td align="center">Credits & Copyright</td></tr>
<tr><td align="center"><a href="log.html">Change Log</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/projects/glew">Project Page</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/p/glew/mailman">Mailing Lists</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/p/glew/_list/tickets">Bug Tracker</a></td></tr>
</table>
<tr><td align="center"><br></tr>
</table>
</td>
</tr>
<tr>
<td valign="bottom">
<table border="0" width="100%" cellpadding="5" cellspacing="0" align="left">
<tr><td align="center"><i>Last Update: 07-22-13</i></td></tr>
<tr><td align="center">
<a href="http://www.opengl.org"> <img src="./ogl_sm.jpg" width="68"
height="35" border="0" alt="OpenGL Logo"></a>
<a href="http://sourceforge.net"> <img
src="http://sourceforge.net/sflogo.php?group_id=67586&amp;type=1"
width="88" height="31" border="0" alt="SourceForge Logo"></a>
</td>
</tr>
<!--- <tr><td align="center"><a
href="http://sourceforge.net/donate/index.php?group_id=67586"><img
src="http://images.sourceforge.net/images/project-support.jpg"
width="88" height="32" border="0" alt="Support This Project"></a></td></tr> -->
</table>
</td>
</tr>
</table>
</td>
<td bgcolor="#ffffff" align="left" valign="top">
<h1>The OpenGL Extension Wrangler Library</h1>
<!-- end header.html -->
<h2>Credits</h2>
<p>
GLEW was developed by <a href="http://www.cs.utah.edu/~ikits/">Milan
Ikits</a> and <a
href="http://wwwvis.informatik.uni-stuttgart.de/~magallon/">Marcelo
Magallon</a>. They also perform occasional maintainance to make sure
that GLEW stays in mint condition. Aaron Lefohn, Joe Kniss, and Chris
Wyman were the first users and also assisted with the design and
debugging process. The acronym GLEW originates from Aaron Lefohn.
Pasi K&auml;rkk&auml;inen identified and fixed several problems with
GLX and SDL. Nate Robins created the <tt>wglinfo</tt> utility, to
which modifications were made by Michael Wimmer.
</p>
<h2>Copyright</h2>
<p>
GLEW is originally derived from the EXTGL project by Lev Povalahev.
The source code is licensed under the <a href="glew.txt">Modified BSD
License</a>, the <a href="mesa.txt">Mesa 3-D License</a> (MIT
License), and the <a href="khronos.txt">Khronos License</a> (MIT
License). The automatic code generation scripts are released under
the <a href="gpl.txt">GNU GPL</a>.
</p>
<!-- begin footer.html -->
</td></tr></table></body>
<!-- end footer.html -->

187
interface/external/glew/doc/glew.css vendored Normal file
View file

@ -0,0 +1,187 @@
h1
{
color: black;
font: 23px "Verdana", "Arial", "Helvetica", sans-serif;
font-weight: bold;
text-align: center;
margin-top: 12px;
margin-bottom: 18px;
}
h2
{
color: black;
font: 18px "Verdana", "Arial", "Helvetica", sans-serif;
font-weight: bold;
text-align: left;
padding-top: 0px;
padding-bottom: 0px;
margin-top: 18px;
margin-bottom: 12px;
}
h3
{
color: black;
font: 17px "Verdana", "Arial", "Helvetica", sans-serif;
text-align: left;
padding-top: 0px;
padding-bottom: 0px;
margin-top: 12px;
margin-bottom: 12px;
}
small
{
font: 8pt "Verdana", "Arial", "Helvetica", sans-serif;
}
body
{
color: black;
font: 10pt "Verdana", "Arial", "Helvetica", sans-serif;
text-align: left;
}
td
{
color: black;
font: 10pt "Verdana", "Arial", "Helvetica", sans-serif;
}
tt
{
color: rgb(0,120,0);
}
/* color: maroon; */
td.num
{
color: lightgrey;
font: 10pt "Verdana", "Arial", "Helvetica", sans-serif;
text-align: right;
}
blockquote
{
color: rgb(0,120,0);
background: #f0f0f0;
text-align: left;
margin-left: 40px;
margin-right: 40px;
margin-bottom: 6px;
padding-bottom: 0px;
margin-top: 0px;
padding-top: 0px;
border-top: 0px;
border-width: 0px;
}
pre
{
color: rgb(0,120,0);
background: #f0f0f0;
text-align: left;
margin-left: 40px;
margin-right: 40px;
margin-bottom: 6px;
padding-bottom: 0px;
margin-top: 0px;
padding-top: 0px;
border-top: 0px;
border-width: 0px;
}
p
{
color: black;
font: 10pt "Verdana", "Arial", "Helvetica", sans-serif;
text-align: left;
margin-bottom: 0px;
padding-bottom: 6px;
margin-top: 0px;
padding-top: 0px;
}
p.right
{
color: black;
font: 10pt "Verdana", "Arial", "Helvetica", sans-serif;
text-align: right;
margin-bottom: 0px;
padding-bottom: 6px;
margin-top: 0px;
padding-top: 0px;
}
p.pre
{
color: rgb(0,120,0);
font: 10pt "Courier New", "Courier", monospace;
background: #f0f0f0;
text-align: left;
margin-top: 0px;
margin-bottom: 6px;
margin-left: 40px;
margin-right: 40px;
padding-top: 0px;
padding-bottom: 6px;
padding-left: 6px;
padding-right: 6px;
border-top: 0px;
border-width: 0px;
}
a:link
{
color: rgb(0,0,139);
text-decoration: none;
}
a:visited
{
color: rgb(220,20,60);
text-decoration: none;
}
a:hover
{
color: rgb(220,20,60);
text-decoration: underline;
background: "#e8e8e8";
}
ul
{
list-style-type: disc;
text-align: left;
margin-left: 40px;
margin-top: 0px;
padding-top: 0px;
margin-bottom: 0px;
padding-bottom: 3px;
}
ul.none
{
list-style-type: none;
}
ol
{
text-align: left;
margin-left: 40px;
margin-top: 0px;
padding-top: 0px;
margin-bottom: 0px;
padding-bottom: 12px;
}
hr
{
color: maroon;
background-color: maroon;
height: 1px;
border: 0px;
width: 80%;
}

635
interface/external/glew/doc/glew.html vendored Normal file
View file

@ -0,0 +1,635 @@
<!-- begin header.html -->
<!--
The OpenGL Extension Wrangler Library
Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>
Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>
Copyright (C) 2002, Lev Povalahev
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.
* The name of the author 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.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html/4/loose.dtd">
<!-- &nbsp;<img src="new.png" height="12" alt="NEW!"> -->
<html>
<head>
<title>GLEW: The OpenGL Extension Wrangler Library</title>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<link href="glew.css" type="text/css" rel="stylesheet">
</head>
<body bgcolor="#fff0d0">
<table border="0" width="100%" cellpadding="12" cellspacing="8" style="height:100%">
<tr>
<td bgcolor="#ffffff" align="left" valign="top" width="200">
<table border="0" width="100%" cellpadding="0" cellspacing="0" align="left">
<tr>
<td valign="top">
<table border="0" width="100%" cellpadding="0" cellspacing="0" align="left">
<tr><td align="center"><i>Latest Release: <a href="https://sourceforge.net/projects/glew/files/glew/1.10.0/">1.10.0</a></i></td></tr>
<tr><td align="center"><br></td></tr>
<tr><td align="center"><img src="./glew.png" alt="GLEW Logo" width="97" height="75"></td></tr>
<tr><td align="center"><br></td></tr>
<tr><td align="center">
<table border="0" cellpadding="0" cellspacing="0" align="center">
<tr><td align="center"><a href="index.html">Download</a></td></tr>
<tr><td align="center"><a href="basic.html">Usage</a></td></tr>
<tr><td align="center"><a href="build.html">Building</a></td></tr>
<tr><td align="center"><a href="install.html">Installation</a></td></tr>
<tr><td align="center"><a href="advanced.html">Source Generation</a></td></tr>
<tr><td align="center"><a href="credits.html">Credits & Copyright</a></td></tr>
<tr><td align="center"><a href="log.html">Change Log</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/projects/glew">Project Page</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/p/glew/mailman">Mailing Lists</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/p/glew/_list/tickets">Bug Tracker</a></td></tr>
</table>
<tr><td align="center"><br></tr>
</table>
</td>
</tr>
<tr>
<td valign="bottom">
<table border="0" width="100%" cellpadding="5" cellspacing="0" align="left">
<tr><td align="center"><i>Last Update: 07-22-13</i></td></tr>
<tr><td align="center">
<a href="http://www.opengl.org"> <img src="./ogl_sm.jpg" width="68"
height="35" border="0" alt="OpenGL Logo"></a>
<a href="http://sourceforge.net"> <img
src="http://sourceforge.net/sflogo.php?group_id=67586&amp;type=1"
width="88" height="31" border="0" alt="SourceForge Logo"></a>
</td>
</tr>
<!--- <tr><td align="center"><a
href="http://sourceforge.net/donate/index.php?group_id=67586"><img
src="http://images.sourceforge.net/images/project-support.jpg"
width="88" height="32" border="0" alt="Support This Project"></a></td></tr> -->
</table>
</td>
</tr>
</table>
</td>
<td bgcolor="#ffffff" align="left" valign="top">
<h1>The OpenGL Extension Wrangler Library</h1>
<!-- end header.html -->
<h2>Supported OpenGL Extensions</h2>
<table border="0" width="100%" cellpadding="1" cellspacing="0" align="center">
<tr><td class="num">1</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/3DFX/3dfx_multisample.txt">3DFX_multisample</a></td></tr>
<tr><td class="num">2</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/3DFX/tbuffer.txt">3DFX_tbuffer</a></td></tr>
<tr><td class="num">3</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/3DFX/texture_compression_FXT1.txt">3DFX_texture_compression_FXT1</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">4</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/blend_minmax_factor.txt">AMD_blend_minmax_factor</a></td></tr>
<tr><td class="num">5</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/conservative_depth.txt">AMD_conservative_depth</a></td></tr>
<tr><td class="num">6</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/debug_output.txt">AMD_debug_output</a></td></tr>
<tr><td class="num">7</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/depth_clamp_separate.txt">AMD_depth_clamp_separate</a></td></tr>
<tr><td class="num">8</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/draw_buffers_blend.txt">AMD_draw_buffers_blend</a></td></tr>
<tr><td class="num">9</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/interleaved_elements.txt">AMD_interleaved_elements</a></td></tr>
<tr><td class="num">10</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/multi_draw_indirect.txt">AMD_multi_draw_indirect</a></td></tr>
<tr><td class="num">11</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/name_gen_delete.txt">AMD_name_gen_delete</a></td></tr>
<tr><td class="num">12</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/performance_monitor.txt">AMD_performance_monitor</a></td></tr>
<tr><td class="num">13</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/pinned_memory.txt">AMD_pinned_memory</a></td></tr>
<tr><td class="num">14</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/query_buffer_object.txt">AMD_query_buffer_object</a></td></tr>
<tr><td class="num">15</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/sample_positions.txt">AMD_sample_positions</a></td></tr>
<tr><td class="num">16</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/seamless_cubemap_per_texture.txt">AMD_seamless_cubemap_per_texture</a></td></tr>
<tr><td class="num">17</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/shader_stencil_export.txt">AMD_shader_stencil_export</a></td></tr>
<tr><td class="num">18</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/shader_trinary_minmax.txt">AMD_shader_trinary_minmax</a></td></tr>
<tr><td class="num">19</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/sparse_texture.txt">AMD_sparse_texture</a></td></tr>
<tr><td class="num">20</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/stencil_operation_extended.txt">AMD_stencil_operation_extended</a></td></tr>
<tr><td class="num">21</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/texture_texture4.txt">AMD_texture_texture4</a></td></tr>
<tr><td class="num">22</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/transform_feedback3_lines_triangles.txt">AMD_transform_feedback3_lines_triangles</a></td></tr>
<tr><td class="num">23</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/vertex_shader_layer.txt">AMD_vertex_shader_layer</a></td></tr>
<tr><td class="num">24</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/vertex_shader_tessellator.txt">AMD_vertex_shader_tessellator</a></td></tr>
<tr><td class="num">25</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/vertex_shader_viewport_index.txt">AMD_vertex_shader_viewport_index</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">26</td><td>&nbsp;</td><td><a href="https://code.google.com/p/angleproject/source/browse/#git%2Fextensions">ANGLE_depth_texture</a></td></tr>
<tr><td class="num">27</td><td>&nbsp;</td><td><a href="https://code.google.com/p/angleproject/source/browse/#git%2Fextensions">ANGLE_framebuffer_blit</a></td></tr>
<tr><td class="num">28</td><td>&nbsp;</td><td><a href="https://code.google.com/p/angleproject/source/browse/#git%2Fextensions">ANGLE_framebuffer_multisample</a></td></tr>
<tr><td class="num">29</td><td>&nbsp;</td><td><a href="https://code.google.com/p/angleproject/source/browse/#git%2Fextensions">ANGLE_instanced_arrays</a></td></tr>
<tr><td class="num">30</td><td>&nbsp;</td><td><a href="https://code.google.com/p/angleproject/source/browse/#git%2Fextensions">ANGLE_pack_reverse_row_order</a></td></tr>
<tr><td class="num">31</td><td>&nbsp;</td><td><a href="https://code.google.com/p/angleproject/source/browse/#git%2Fextensions">ANGLE_program_binary</a></td></tr>
<tr><td class="num">32</td><td>&nbsp;</td><td><a href="https://code.google.com/p/angleproject/source/browse/#git%2Fextensions">ANGLE_texture_compression_dxt1</a></td></tr>
<tr><td class="num">33</td><td>&nbsp;</td><td><a href="https://code.google.com/p/angleproject/source/browse/#git%2Fextensions">ANGLE_texture_compression_dxt3</a></td></tr>
<tr><td class="num">34</td><td>&nbsp;</td><td><a href="https://code.google.com/p/angleproject/source/browse/#git%2Fextensions">ANGLE_texture_compression_dxt5</a></td></tr>
<tr><td class="num">35</td><td>&nbsp;</td><td><a href="https://code.google.com/p/angleproject/source/browse/#git%2Fextensions">ANGLE_texture_usage</a></td></tr>
<tr><td class="num">36</td><td>&nbsp;</td><td><a href="https://code.google.com/p/angleproject/source/browse/#git%2Fextensions">ANGLE_timer_query</a></td></tr>
<tr><td class="num">37</td><td>&nbsp;</td><td><a href="https://code.google.com/p/angleproject/source/browse/#git%2Fextensions">ANGLE_translated_shader_source</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">38</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/APPLE/aux_depth_stencil.txt">APPLE_aux_depth_stencil</a></td></tr>
<tr><td class="num">39</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/APPLE/client_storage.txt">APPLE_client_storage</a></td></tr>
<tr><td class="num">40</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/APPLE/element_array.txt">APPLE_element_array</a></td></tr>
<tr><td class="num">41</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/APPLE/fence.txt">APPLE_fence</a></td></tr>
<tr><td class="num">42</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/APPLE/float_pixels.txt">APPLE_float_pixels</a></td></tr>
<tr><td class="num">43</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/APPLE/flush_buffer_range.txt">APPLE_flush_buffer_range</a></td></tr>
<tr><td class="num">44</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/APPLE/object_purgeable.txt">APPLE_object_purgeable</a></td></tr>
<tr><td class="num">45</td><td>&nbsp;</td><td>APPLE_pixel_buffer</td></tr>
<tr><td class="num">46</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/APPLE/rgb_422.txt">APPLE_rgb_422</a></td></tr>
<tr><td class="num">47</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/APPLE/row_bytes.txt">APPLE_row_bytes</a></td></tr>
<tr><td class="num">48</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/APPLE/specular_vector.txt">APPLE_specular_vector</a></td></tr>
<tr><td class="num">49</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/APPLE/texture_range.txt">APPLE_texture_range</a></td></tr>
<tr><td class="num">50</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/APPLE/transform_hint.txt">APPLE_transform_hint</a></td></tr>
<tr><td class="num">51</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/APPLE/vertex_array_object.txt">APPLE_vertex_array_object</a></td></tr>
<tr><td class="num">52</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/APPLE/vertex_array_range.txt">APPLE_vertex_array_range</a></td></tr>
<tr><td class="num">53</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/APPLE/vertex_program_evaluators.txt">APPLE_vertex_program_evaluators</a></td></tr>
<tr><td class="num">54</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/APPLE/ycbcr_422.txt">APPLE_ycbcr_422</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">55</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/ES2_compatibility.txt">ARB_ES2_compatibility</a></td></tr>
<tr><td class="num">56</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/ES3_compatibility.txt">ARB_ES3_compatibility</a></td></tr>
<tr><td class="num">57</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/arrays_of_arrays.txt">ARB_arrays_of_arrays</a></td></tr>
<tr><td class="num">58</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/base_instance.txt">ARB_base_instance</a></td></tr>
<tr><td class="num">59</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/bindless_texture.txt">ARB_bindless_texture</a></td></tr>
<tr><td class="num">60</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/blend_func_extended.txt">ARB_blend_func_extended</a></td></tr>
<tr><td class="num">61</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/buffer_storage.txt">ARB_buffer_storage</a></td></tr>
<tr><td class="num">62</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/cl_event.txt">ARB_cl_event</a></td></tr>
<tr><td class="num">63</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/clear_buffer_object.txt">ARB_clear_buffer_object</a></td></tr>
<tr><td class="num">64</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/clear_texture.txt">ARB_clear_texture</a></td></tr>
<tr><td class="num">65</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/color_buffer_float.txt">ARB_color_buffer_float</a></td></tr>
<tr><td class="num">66</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/compatibility.txt">ARB_compatibility</a></td></tr>
<tr><td class="num">67</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/compressed_texture_pixel_storage.txt">ARB_compressed_texture_pixel_storage</a></td></tr>
<tr><td class="num">68</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/compute_shader.txt">ARB_compute_shader</a></td></tr>
<tr><td class="num">69</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/compute_variable_group_size.txt">ARB_compute_variable_group_size</a></td></tr>
<tr><td class="num">70</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/conservative_depth.txt">ARB_conservative_depth</a></td></tr>
<tr><td class="num">71</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/copy_buffer.txt">ARB_copy_buffer</a></td></tr>
<tr><td class="num">72</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/copy_image.txt">ARB_copy_image</a></td></tr>
<tr><td class="num">73</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/debug_output.txt">ARB_debug_output</a></td></tr>
<tr><td class="num">74</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/depth_buffer_float.txt">ARB_depth_buffer_float</a></td></tr>
<tr><td class="num">75</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/depth_clamp.txt">ARB_depth_clamp</a></td></tr>
<tr><td class="num">76</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/depth_texture.txt">ARB_depth_texture</a></td></tr>
<tr><td class="num">77</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/draw_buffers.txt">ARB_draw_buffers</a></td></tr>
<tr><td class="num">78</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/draw_buffers_blend.txt">ARB_draw_buffers_blend</a></td></tr>
<tr><td class="num">79</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/draw_elements_base_vertex.txt">ARB_draw_elements_base_vertex</a></td></tr>
<tr><td class="num">80</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/draw_indirect.txt">ARB_draw_indirect</a></td></tr>
<tr><td class="num">81</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/ARB/draw_instanced.txt">ARB_draw_instanced</a></td></tr>
<tr><td class="num">82</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/enhanced_layouts.txt">ARB_enhanced_layouts</a></td></tr>
<tr><td class="num">83</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/explicit_attrib_location.txt">ARB_explicit_attrib_location</a></td></tr>
<tr><td class="num">84</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/explicit_uniform_location.txt">ARB_explicit_uniform_location</a></td></tr>
<tr><td class="num">85</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/fragment_coord_conventions.txt">ARB_fragment_coord_conventions</a></td></tr>
<tr><td class="num">86</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/fragment_layer_viewport.txt">ARB_fragment_layer_viewport</a></td></tr>
<tr><td class="num">87</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/fragment_program.txt">ARB_fragment_program</a></td></tr>
<tr><td class="num">88</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/fragment_program_shadow.txt">ARB_fragment_program_shadow</a></td></tr>
<tr><td class="num">89</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/fragment_shader.txt">ARB_fragment_shader</a></td></tr>
<tr><td class="num">90</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/framebuffer_no_attachments.txt">ARB_framebuffer_no_attachments</a></td></tr>
<tr><td class="num">91</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/framebuffer_object.txt">ARB_framebuffer_object</a></td></tr>
<tr><td class="num">92</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/framebuffer_sRGB.txt">ARB_framebuffer_sRGB</a></td></tr>
<tr><td class="num">93</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/geometry_shader4.txt">ARB_geometry_shader4</a></td></tr>
<tr><td class="num">94</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/get_program_binary.txt">ARB_get_program_binary</a></td></tr>
<tr><td class="num">95</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/gpu_shader5.txt">ARB_gpu_shader5</a></td></tr>
<tr><td class="num">96</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/gpu_shader_fp64.txt">ARB_gpu_shader_fp64</a></td></tr>
<tr><td class="num">97</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/half_float_pixel.txt">ARB_half_float_pixel</a></td></tr>
<tr><td class="num">98</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/half_float_vertex.txt">ARB_half_float_vertex</a></td></tr>
<tr><td class="num">99</td><td>&nbsp;</td><td>ARB_imaging</td></tr>
<tr><td class="num">100</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/indirect_parameters.txt">ARB_indirect_parameters</a></td></tr>
<tr><td class="num">101</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/ARB/instanced_arrays.txt">ARB_instanced_arrays</a></td></tr>
<tr><td class="num">102</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/internalformat_query.txt">ARB_internalformat_query</a></td></tr>
<tr><td class="num">103</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/ARB/internalformat_query2.txt">ARB_internalformat_query2</a></td></tr>
<tr><td class="num">104</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/invalidate_subdata.txt">ARB_invalidate_subdata</a></td></tr>
<tr><td class="num">105</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/map_buffer_alignment.txt">ARB_map_buffer_alignment</a></td></tr>
<tr><td class="num">106</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/map_buffer_range.txt">ARB_map_buffer_range</a></td></tr>
<tr><td class="num">107</td><td>&nbsp;</td><td><a href="http://oss.sgi.com/projects/ogl-sample/registry/ARB/matrix_palette.txt">ARB_matrix_palette</a></td></tr>
<tr><td class="num">108</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/multi_bind.txt">ARB_multi_bind</a></td></tr>
<tr><td class="num">109</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/multi_draw_indirect.txt">ARB_multi_draw_indirect</a></td></tr>
<tr><td class="num">110</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/multisample.txt">ARB_multisample</a></td></tr>
<tr><td class="num">111</td><td>&nbsp;</td><td><a href="http://oss.sgi.com/projects/ogl-sample/registry/ARB/multitexture.txt">ARB_multitexture</a></td></tr>
<tr><td class="num">112</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/occlusion_query.txt">ARB_occlusion_query</a></td></tr>
<tr><td class="num">113</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/occlusion_query2.txt">ARB_occlusion_query2</a></td></tr>
<tr><td class="num">114</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/pixel_buffer_object.txt">ARB_pixel_buffer_object</a></td></tr>
<tr><td class="num">115</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/point_parameters.txt">ARB_point_parameters</a></td></tr>
<tr><td class="num">116</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/point_sprite.txt">ARB_point_sprite</a></td></tr>
<tr><td class="num">117</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/program_interface_query.txt">ARB_program_interface_query</a></td></tr>
<tr><td class="num">118</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/provoking_vertex.txt">ARB_provoking_vertex</a></td></tr>
<tr><td class="num">119</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/query_buffer_object.txt">ARB_query_buffer_object</a></td></tr>
<tr><td class="num">120</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/robust_buffer_access_behavior.txt">ARB_robust_buffer_access_behavior</a></td></tr>
<tr><td class="num">121</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/ARB/robustness.txt">ARB_robustness</a></td></tr>
<tr><td class="num">122</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/robustness_isolation.txt">ARB_robustness_application_isolation</a></td></tr>
<tr><td class="num">123</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/robustness_isolation.txt">ARB_robustness_share_group_isolation</a></td></tr>
<tr><td class="num">124</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/sample_shading.txt">ARB_sample_shading</a></td></tr>
<tr><td class="num">125</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/sampler_objects.txt">ARB_sampler_objects</a></td></tr>
<tr><td class="num">126</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/seamless_cube_map.txt">ARB_seamless_cube_map</a></td></tr>
<tr><td class="num">127</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/seamless_cubemap_per_texture.txt">ARB_seamless_cubemap_per_texture</a></td></tr>
<tr><td class="num">128</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/ARB/separate_shader_objects.txt">ARB_separate_shader_objects</a></td></tr>
<tr><td class="num">129</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/shader_atomic_counters.txt">ARB_shader_atomic_counters</a></td></tr>
<tr><td class="num">130</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/shader_bit_encoding.txt">ARB_shader_bit_encoding</a></td></tr>
<tr><td class="num">131</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/shader_draw_parameters.txt">ARB_shader_draw_parameters</a></td></tr>
<tr><td class="num">132</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/shader_group_vote.txt">ARB_shader_group_vote</a></td></tr>
<tr><td class="num">133</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/shader_image_load_store.txt">ARB_shader_image_load_store</a></td></tr>
<tr><td class="num">134</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/shader_image_size.txt">ARB_shader_image_size</a></td></tr>
<tr><td class="num">135</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/shader_objects.txt">ARB_shader_objects</a></td></tr>
<tr><td class="num">136</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/shader_precision.txt">ARB_shader_precision</a></td></tr>
<tr><td class="num">137</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/shader_stencil_export.txt">ARB_shader_stencil_export</a></td></tr>
<tr><td class="num">138</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/shader_storage_buffer_object.txt">ARB_shader_storage_buffer_object</a></td></tr>
<tr><td class="num">139</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/shader_subroutine.txt">ARB_shader_subroutine</a></td></tr>
<tr><td class="num">140</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/shader_texture_lod.txt">ARB_shader_texture_lod</a></td></tr>
<tr><td class="num">141</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/shading_language_100.txt">ARB_shading_language_100</a></td></tr>
<tr><td class="num">142</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/shading_language_420pack.txt">ARB_shading_language_420pack</a></td></tr>
<tr><td class="num">143</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/shading_language_include.txt">ARB_shading_language_include</a></td></tr>
<tr><td class="num">144</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/shading_language_packing.txt">ARB_shading_language_packing</a></td></tr>
<tr><td class="num">145</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/shadow.txt">ARB_shadow</a></td></tr>
<tr><td class="num">146</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/shadow_ambient.txt">ARB_shadow_ambient</a></td></tr>
<tr><td class="num">147</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/sparse_texture.txt">ARB_sparse_texture</a></td></tr>
<tr><td class="num">148</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/stencil_texturing.txt">ARB_stencil_texturing</a></td></tr>
<tr><td class="num">149</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/sync.txt">ARB_sync</a></td></tr>
<tr><td class="num">150</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/tessellation_shader.txt">ARB_tessellation_shader</a></td></tr>
<tr><td class="num">151</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_border_clamp.txt">ARB_texture_border_clamp</a></td></tr>
<tr><td class="num">152</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_buffer_object.txt">ARB_texture_buffer_object</a></td></tr>
<tr><td class="num">153</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_buffer_object_rgb32.txt">ARB_texture_buffer_object_rgb32</a></td></tr>
<tr><td class="num">154</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_buffer_range.txt">ARB_texture_buffer_range</a></td></tr>
<tr><td class="num">155</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_compression.txt">ARB_texture_compression</a></td></tr>
<tr><td class="num">156</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_compression_bptc.txt">ARB_texture_compression_bptc</a></td></tr>
<tr><td class="num">157</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_compression_rgtc.txt">ARB_texture_compression_rgtc</a></td></tr>
<tr><td class="num">158</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_cube_map.txt">ARB_texture_cube_map</a></td></tr>
<tr><td class="num">159</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_cube_map_array.txt">ARB_texture_cube_map_array</a></td></tr>
<tr><td class="num">160</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_env_add.txt">ARB_texture_env_add</a></td></tr>
<tr><td class="num">161</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_env_combine.txt">ARB_texture_env_combine</a></td></tr>
<tr><td class="num">162</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_env_crossbar.txt">ARB_texture_env_crossbar</a></td></tr>
<tr><td class="num">163</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_env_dot3.txt">ARB_texture_env_dot3</a></td></tr>
<tr><td class="num">164</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_float.txt">ARB_texture_float</a></td></tr>
<tr><td class="num">165</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_gather.txt">ARB_texture_gather</a></td></tr>
<tr><td class="num">166</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_mirror_clamp_to_edge.txt">ARB_texture_mirror_clamp_to_edge</a></td></tr>
<tr><td class="num">167</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_mirrored_repeat.txt">ARB_texture_mirrored_repeat</a></td></tr>
<tr><td class="num">168</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_multisample.txt">ARB_texture_multisample</a></td></tr>
<tr><td class="num">169</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_non_power_of_two.txt">ARB_texture_non_power_of_two</a></td></tr>
<tr><td class="num">170</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_query_levels.txt">ARB_texture_query_levels</a></td></tr>
<tr><td class="num">171</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_query_lod.txt">ARB_texture_query_lod</a></td></tr>
<tr><td class="num">172</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_rectangle.txt">ARB_texture_rectangle</a></td></tr>
<tr><td class="num">173</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_rg.txt">ARB_texture_rg</a></td></tr>
<tr><td class="num">174</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_rgb10_a2ui.txt">ARB_texture_rgb10_a2ui</a></td></tr>
<tr><td class="num">175</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_stencil8.txt">ARB_texture_stencil8</a></td></tr>
<tr><td class="num">176</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_storage.txt">ARB_texture_storage</a></td></tr>
<tr><td class="num">177</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_storage_multisample.txt">ARB_texture_storage_multisample</a></td></tr>
<tr><td class="num">178</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_swizzle.txt">ARB_texture_swizzle</a></td></tr>
<tr><td class="num">179</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/texture_view.txt">ARB_texture_view</a></td></tr>
<tr><td class="num">180</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/timer_query.txt">ARB_timer_query</a></td></tr>
<tr><td class="num">181</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/transform_feedback2.txt">ARB_transform_feedback2</a></td></tr>
<tr><td class="num">182</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/transform_feedback3.txt">ARB_transform_feedback3</a></td></tr>
<tr><td class="num">183</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/transform_feedback_instanced.txt">ARB_transform_feedback_instanced</a></td></tr>
<tr><td class="num">184</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/transpose_matrix.txt">ARB_transpose_matrix</a></td></tr>
<tr><td class="num">185</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/uniform_buffer_object.txt">ARB_uniform_buffer_object</a></td></tr>
<tr><td class="num">186</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/vertex_array_bgra.txt">ARB_vertex_array_bgra</a></td></tr>
<tr><td class="num">187</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/vertex_array_object.txt">ARB_vertex_array_object</a></td></tr>
<tr><td class="num">188</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/ARB/vertex_attrib_64bit.txt">ARB_vertex_attrib_64bit</a></td></tr>
<tr><td class="num">189</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/vertex_attrib_binding.txt">ARB_vertex_attrib_binding</a></td></tr>
<tr><td class="num">190</td><td>&nbsp;</td><td><a href="http://oss.sgi.com/projects/ogl-sample/registry/ARB/vertex_blend.txt">ARB_vertex_blend</a></td></tr>
<tr><td class="num">191</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/vertex_buffer_object.txt">ARB_vertex_buffer_object</a></td></tr>
<tr><td class="num">192</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/vertex_program.txt">ARB_vertex_program</a></td></tr>
<tr><td class="num">193</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/vertex_shader.txt">ARB_vertex_shader</a></td></tr>
<tr><td class="num">194</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/vertex_type_10f_11f_11f_rev.txt">ARB_vertex_type_10f_11f_11f_rev</a></td></tr>
<tr><td class="num">195</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/vertex_type_2_10_10_10_rev.txt">ARB_vertex_type_2_10_10_10_rev</a></td></tr>
<tr><td class="num">196</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/viewport_array.txt">ARB_viewport_array</a></td></tr>
<tr><td class="num">197</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/window_pos.txt">ARB_window_pos</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">198</td><td>&nbsp;</td><td><a href="http://www.ati.com/developer/atiopengl.pdf">ATIX_point_sprites</a></td></tr>
<tr><td class="num">199</td><td>&nbsp;</td><td><a href="http://www.ati.com/developer/atiopengl.pdf">ATIX_texture_env_combine3</a></td></tr>
<tr><td class="num">200</td><td>&nbsp;</td><td><a href="http://www.ati.com/developer/sdk/RadeonSDK/Html/Info/ATIX_texture_env_route.txt">ATIX_texture_env_route</a></td></tr>
<tr><td class="num">201</td><td>&nbsp;</td><td><a href="http://www.ati.com/developer/atiopengl.pdf">ATIX_vertex_shader_output_point_size</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">202</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ATI/draw_buffers.txt">ATI_draw_buffers</a></td></tr>
<tr><td class="num">203</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ATI/element_array.txt">ATI_element_array</a></td></tr>
<tr><td class="num">204</td><td>&nbsp;</td><td><a href="http://oss.sgi.com/projects/ogl-sample/registry/ATI/envmap_bumpmap.txt">ATI_envmap_bumpmap</a></td></tr>
<tr><td class="num">205</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ATI/fragment_shader.txt">ATI_fragment_shader</a></td></tr>
<tr><td class="num">206</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/ATI/map_object_buffer.txt">ATI_map_object_buffer</a></td></tr>
<tr><td class="num">207</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ATI/meminfo.txt">ATI_meminfo</a></td></tr>
<tr><td class="num">208</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/ATI/pn_triangles.txt">ATI_pn_triangles</a></td></tr>
<tr><td class="num">209</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/ATI/separate_stencil.txt">ATI_separate_stencil</a></td></tr>
<tr><td class="num">210</td><td>&nbsp;</td><td>ATI_shader_texture_lod</td></tr>
<tr><td class="num">211</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ATI/text_fragment_shader.txt">ATI_text_fragment_shader</a></td></tr>
<tr><td class="num">212</td><td>&nbsp;</td><td>ATI_texture_compression_3dc</td></tr>
<tr><td class="num">213</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ATI/texture_env_combine3.txt">ATI_texture_env_combine3</a></td></tr>
<tr><td class="num">214</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ATI/texture_float.txt">ATI_texture_float</a></td></tr>
<tr><td class="num">215</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ATI/texture_mirror_once.txt">ATI_texture_mirror_once</a></td></tr>
<tr><td class="num">216</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ATI/vertex_array_object.txt">ATI_vertex_array_object</a></td></tr>
<tr><td class="num">217</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ATI/vertex_attrib_array_object.txt">ATI_vertex_attrib_array_object</a></td></tr>
<tr><td class="num">218</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/ATI/vertex_streams.txt">ATI_vertex_streams</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">219</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/422_pixels.txt">EXT_422_pixels</a></td></tr>
<tr><td class="num">220</td><td>&nbsp;</td><td><a href="http://download.nvidia.com/developer/GLSL/GLSL%20Release%20Notes%20for%20Release%2060.pdf">EXT_Cg_shader</a></td></tr>
<tr><td class="num">221</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/abgr.txt">EXT_abgr</a></td></tr>
<tr><td class="num">222</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/bgra.txt">EXT_bgra</a></td></tr>
<tr><td class="num">223</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_EXT_bindable_uniform.txt">EXT_bindable_uniform</a></td></tr>
<tr><td class="num">224</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/blend_color.txt">EXT_blend_color</a></td></tr>
<tr><td class="num">225</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/blend_equation_separate.txt">EXT_blend_equation_separate</a></td></tr>
<tr><td class="num">226</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/blend_func_separate.txt">EXT_blend_func_separate</a></td></tr>
<tr><td class="num">227</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/blend_logic_op.txt">EXT_blend_logic_op</a></td></tr>
<tr><td class="num">228</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/blend_minmax.txt">EXT_blend_minmax</a></td></tr>
<tr><td class="num">229</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/blend_subtract.txt">EXT_blend_subtract</a></td></tr>
<tr><td class="num">230</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/clip_volume_hint.txt">EXT_clip_volume_hint</a></td></tr>
<tr><td class="num">231</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/cmyka.txt">EXT_cmyka</a></td></tr>
<tr><td class="num">232</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/color_subtable.txt">EXT_color_subtable</a></td></tr>
<tr><td class="num">233</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/compiled_vertex_array.txt">EXT_compiled_vertex_array</a></td></tr>
<tr><td class="num">234</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/convolution.txt">EXT_convolution</a></td></tr>
<tr><td class="num">235</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/coordinate_frame.txt">EXT_coordinate_frame</a></td></tr>
<tr><td class="num">236</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/copy_texture.txt">EXT_copy_texture</a></td></tr>
<tr><td class="num">237</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/cull_vertex.txt">EXT_cull_vertex</a></td></tr>
<tr><td class="num">238</td><td>&nbsp;</td><td><a href="http://www.khronos.org/registry/gles/extensions/EXT/EXT_debug_marker.txt">EXT_debug_marker</a></td></tr>
<tr><td class="num">239</td><td>&nbsp;</td><td><a href="http://www.nvidia.com/dev_content/nvopenglspecs/GL_EXT_depth_bounds_test.txt">EXT_depth_bounds_test</a></td></tr>
<tr><td class="num">240</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/direct_state_access.txt">EXT_direct_state_access</a></td></tr>
<tr><td class="num">241</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/draw_buffers2.txt">EXT_draw_buffers2</a></td></tr>
<tr><td class="num">242</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_EXT_draw_instanced.txt">EXT_draw_instanced</a></td></tr>
<tr><td class="num">243</td><td>&nbsp;</td><td><a href="http://oss.sgi.com/projects/ogl-sample/registry/EXT/draw_range_elements.txt">EXT_draw_range_elements</a></td></tr>
<tr><td class="num">244</td><td>&nbsp;</td><td><a href="http://oss.sgi.com/projects/ogl-sample/registry/EXT/fog_coord.txt">EXT_fog_coord</a></td></tr>
<tr><td class="num">245</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/fragment_lighting.txt">EXT_fragment_lighting</a></td></tr>
<tr><td class="num">246</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/framebuffer_blit.txt">EXT_framebuffer_blit</a></td></tr>
<tr><td class="num">247</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/framebuffer_multisample.txt">EXT_framebuffer_multisample</a></td></tr>
<tr><td class="num">248</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/framebuffer_multisample_blit_scaled.txt">EXT_framebuffer_multisample_blit_scaled</a></td></tr>
<tr><td class="num">249</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/framebuffer_object.txt">EXT_framebuffer_object</a></td></tr>
<tr><td class="num">250</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_EXT_framebuffer_sRGB.txt">EXT_framebuffer_sRGB</a></td></tr>
<tr><td class="num">251</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_EXT_geometry_shader4.txt">EXT_geometry_shader4</a></td></tr>
<tr><td class="num">252</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_EXT_gpu_program_parameters.txt">EXT_gpu_program_parameters</a></td></tr>
<tr><td class="num">253</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_EXT_gpu_shader4.txt">EXT_gpu_shader4</a></td></tr>
<tr><td class="num">254</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/histogram.txt">EXT_histogram</a></td></tr>
<tr><td class="num">255</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/index_array_formats.txt">EXT_index_array_formats</a></td></tr>
<tr><td class="num">256</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/index_func.txt">EXT_index_func</a></td></tr>
<tr><td class="num">257</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/index_material.txt">EXT_index_material</a></td></tr>
<tr><td class="num">258</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/index_texture.txt">EXT_index_texture</a></td></tr>
<tr><td class="num">259</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/light_texture.txt">EXT_light_texture</a></td></tr>
<tr><td class="num">260</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/misc_attribute.txt">EXT_misc_attribute</a></td></tr>
<tr><td class="num">261</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/multi_draw_arrays.txt">EXT_multi_draw_arrays</a></td></tr>
<tr><td class="num">262</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/wgl_multisample.txt">EXT_multisample</a></td></tr>
<tr><td class="num">263</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/packed_depth_stencil.txt">EXT_packed_depth_stencil</a></td></tr>
<tr><td class="num">264</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_EXT_packed_float.txt">EXT_packed_float</a></td></tr>
<tr><td class="num">265</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/packed_pixels.txt">EXT_packed_pixels</a></td></tr>
<tr><td class="num">266</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/paletted_texture.txt">EXT_paletted_texture</a></td></tr>
<tr><td class="num">267</td><td>&nbsp;</td><td><a href="http://www.nvidia.com/dev_content/nvopenglspecs/GL_EXT_pixel_buffer_object.txt">EXT_pixel_buffer_object</a></td></tr>
<tr><td class="num">268</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/pixel_transform.txt">EXT_pixel_transform</a></td></tr>
<tr><td class="num">269</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/pixel_transform_color_table.txt">EXT_pixel_transform_color_table</a></td></tr>
<tr><td class="num">270</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/point_parameters.txt">EXT_point_parameters</a></td></tr>
<tr><td class="num">271</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/polygon_offset.txt">EXT_polygon_offset</a></td></tr>
<tr><td class="num">272</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/provoking_vertex.txt">EXT_provoking_vertex</a></td></tr>
<tr><td class="num">273</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/rescale_normal.txt">EXT_rescale_normal</a></td></tr>
<tr><td class="num">274</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/scene_marker.txt">EXT_scene_marker</a></td></tr>
<tr><td class="num">275</td><td>&nbsp;</td><td><a href="http://oss.sgi.com/projects/ogl-sample/registry/EXT/secondary_color.txt">EXT_secondary_color</a></td></tr>
<tr><td class="num">276</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/separate_shader_objects.txt">EXT_separate_shader_objects</a></td></tr>
<tr><td class="num">277</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/separate_specular_color.txt">EXT_separate_specular_color</a></td></tr>
<tr><td class="num">278</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/shader_image_load_store.txt">EXT_shader_image_load_store</a></td></tr>
<tr><td class="num">279</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/shadow_funcs.txt">EXT_shadow_funcs</a></td></tr>
<tr><td class="num">280</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/shared_texture_palette.txt">EXT_shared_texture_palette</a></td></tr>
<tr><td class="num">281</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/stencil_clear_tag.txt">EXT_stencil_clear_tag</a></td></tr>
<tr><td class="num">282</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/stencil_two_side.txt">EXT_stencil_two_side</a></td></tr>
<tr><td class="num">283</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/stencil_wrap.txt">EXT_stencil_wrap</a></td></tr>
<tr><td class="num">284</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/subtexture.txt">EXT_subtexture</a></td></tr>
<tr><td class="num">285</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/texture.txt">EXT_texture</a></td></tr>
<tr><td class="num">286</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/texture3D.txt">EXT_texture3D</a></td></tr>
<tr><td class="num">287</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_array.txt">EXT_texture_array</a></td></tr>
<tr><td class="num">288</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_buffer_object.txt">EXT_texture_buffer_object</a></td></tr>
<tr><td class="num">289</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/texture_compression_dxt1.txt">EXT_texture_compression_dxt1</a></td></tr>
<tr><td class="num">290</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_compression_latc.txt">EXT_texture_compression_latc</a></td></tr>
<tr><td class="num">291</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_compression_rgtc.txt">EXT_texture_compression_rgtc</a></td></tr>
<tr><td class="num">292</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/texture_compression_s3tc.txt">EXT_texture_compression_s3tc</a></td></tr>
<tr><td class="num">293</td><td>&nbsp;</td><td><a href="http://www.nvidia.com/dev_content/nvopenglspecs/GL_EXT_texture_cube_map.txt">EXT_texture_cube_map</a></td></tr>
<tr><td class="num">294</td><td>&nbsp;</td><td><a href="http://www.opengl.org/developers/documentation/Version1.2/1.2specs/texture_edge_clamp.txt">EXT_texture_edge_clamp</a></td></tr>
<tr><td class="num">295</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/texture_env.txt">EXT_texture_env</a></td></tr>
<tr><td class="num">296</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/texture_env_add.txt">EXT_texture_env_add</a></td></tr>
<tr><td class="num">297</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/texture_env_combine.txt">EXT_texture_env_combine</a></td></tr>
<tr><td class="num">298</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/texture_env_dot3.txt">EXT_texture_env_dot3</a></td></tr>
<tr><td class="num">299</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/texture_filter_anisotropic.txt">EXT_texture_filter_anisotropic</a></td></tr>
<tr><td class="num">300</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_integer.txt">EXT_texture_integer</a></td></tr>
<tr><td class="num">301</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/texture_lod_bias.txt">EXT_texture_lod_bias</a></td></tr>
<tr><td class="num">302</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/texture_mirror_clamp.txt">EXT_texture_mirror_clamp</a></td></tr>
<tr><td class="num">303</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/texture_object.txt">EXT_texture_object</a></td></tr>
<tr><td class="num">304</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/texture_perturb_normal.txt">EXT_texture_perturb_normal</a></td></tr>
<tr><td class="num">305</td><td>&nbsp;</td><td><a href="http://developer.apple.com/opengl/extensions/ext_texture_rectangle.html">EXT_texture_rectangle</a></td></tr>
<tr><td class="num">306</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/texture_sRGB.txt">EXT_texture_sRGB</a></td></tr>
<tr><td class="num">307</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/texture_sRGB_decode.txt">EXT_texture_sRGB_decode</a></td></tr>
<tr><td class="num">308</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_shared_exponent.txt">EXT_texture_shared_exponent</a></td></tr>
<tr><td class="num">309</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/texture_snorm.txt">EXT_texture_snorm</a></td></tr>
<tr><td class="num">310</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/texture_swizzle.txt">EXT_texture_swizzle</a></td></tr>
<tr><td class="num">311</td><td>&nbsp;</td><td><a href="http://www.nvidia.com/dev_content/nvopenglspecs/GL_EXT_timer_query.txt">EXT_timer_query</a></td></tr>
<tr><td class="num">312</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/transform_feedback.txt">EXT_transform_feedback</a></td></tr>
<tr><td class="num">313</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/vertex_array.txt">EXT_vertex_array</a></td></tr>
<tr><td class="num">314</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/vertex_array_bgra.txt">EXT_vertex_array_bgra</a></td></tr>
<tr><td class="num">315</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/vertex_attrib_64bit.txt">EXT_vertex_attrib_64bit</a></td></tr>
<tr><td class="num">316</td><td>&nbsp;</td><td><a href="http://oss.sgi.com/projects/ogl-sample/registry/EXT/vertex_shader.txt">EXT_vertex_shader</a></td></tr>
<tr><td class="num">317</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/vertex_weighting.txt">EXT_vertex_weighting</a></td></tr>
<tr><td class="num">318</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/x11_sync_object.txt">EXT_x11_sync_object</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">319</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/GREMEDY/frame_terminator.txt">GREMEDY_frame_terminator</a></td></tr>
<tr><td class="num">320</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/GREMEDY/string_marker.txt">GREMEDY_string_marker</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">321</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/HP/convolution_border_modes.txt">HP_convolution_border_modes</a></td></tr>
<tr><td class="num">322</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/HP/image_transform.txt">HP_image_transform</a></td></tr>
<tr><td class="num">323</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/HP/occlusion_test.txt">HP_occlusion_test</a></td></tr>
<tr><td class="num">324</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/HP/texture_lighting.txt">HP_texture_lighting</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">325</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/IBM/cull_vertex.txt">IBM_cull_vertex</a></td></tr>
<tr><td class="num">326</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/IBM/multimode_draw_arrays.txt">IBM_multimode_draw_arrays</a></td></tr>
<tr><td class="num">327</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/IBM/rasterpos_clip.txt">IBM_rasterpos_clip</a></td></tr>
<tr><td class="num">328</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/IBM/static_data.txt">IBM_static_data</a></td></tr>
<tr><td class="num">329</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/IBM/texture_mirrored_repeat.txt">IBM_texture_mirrored_repeat</a></td></tr>
<tr><td class="num">330</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/IBM/vertex_array_lists.txt">IBM_vertex_array_lists</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">331</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/INGR/color_clamp.txt">INGR_color_clamp</a></td></tr>
<tr><td class="num">332</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/INGR/interlace_read.txt">INGR_interlace_read</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">333</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/INTEL/map_texture.txt">INTEL_map_texture</a></td></tr>
<tr><td class="num">334</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/INTEL/parallel_arrays.txt">INTEL_parallel_arrays</a></td></tr>
<tr><td class="num">335</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/INTEL/texture_scissor.txt">INTEL_texture_scissor</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">336</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/KHR/debug.txt">KHR_debug</a></td></tr>
<tr><td class="num">337</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/KHR/texture_compression_astc_ldr.txt">KHR_texture_compression_astc_ldr</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">338</td><td>&nbsp;</td><td>KTX_buffer_region</td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">339</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/MESAX/texture_stack.txt">MESAX_texture_stack</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">340</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/MESA/pack_invert.txt">MESA_pack_invert</a></td></tr>
<tr><td class="num">341</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/MESA/resize_buffers.txt">MESA_resize_buffers</a></td></tr>
<tr><td class="num">342</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/MESA/window_pos.txt">MESA_window_pos</a></td></tr>
<tr><td class="num">343</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/MESA/ycbcr_texture.txt">MESA_ycbcr_texture</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">344</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NVX/nvx_conditional_render.txt">NVX_conditional_render</a></td></tr>
<tr><td class="num">345</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_NVX_gpu_memory_info.txt">NVX_gpu_memory_info</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">346</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/bindless_multi_draw_indirect.txt">NV_bindless_multi_draw_indirect</a></td></tr>
<tr><td class="num">347</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/bindless_texture.txt">NV_bindless_texture</a></td></tr>
<tr><td class="num">348</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/blend_equation_advanced.txt">NV_blend_equation_advanced</a></td></tr>
<tr><td class="num">349</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/blend_equation_advanced.txt">NV_blend_equation_advanced_coherent</a></td></tr>
<tr><td class="num">350</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/blend_square.txt">NV_blend_square</a></td></tr>
<tr><td class="num">351</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/compute_program5.txt">NV_compute_program5</a></td></tr>
<tr><td class="num">352</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/conditional_render.txt">NV_conditional_render</a></td></tr>
<tr><td class="num">353</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/copy_depth_to_color.txt">NV_copy_depth_to_color</a></td></tr>
<tr><td class="num">354</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/copy_image.txt">NV_copy_image</a></td></tr>
<tr><td class="num">355</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/deep_texture3D.txt">NV_deep_texture3D</a></td></tr>
<tr><td class="num">356</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_NV_depth_buffer_float.txt">NV_depth_buffer_float</a></td></tr>
<tr><td class="num">357</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/depth_clamp.txt">NV_depth_clamp</a></td></tr>
<tr><td class="num">358</td><td>&nbsp;</td><td>NV_depth_range_unclamped</td></tr>
<tr><td class="num">359</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/draw_texture.txt">NV_draw_texture</a></td></tr>
<tr><td class="num">360</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/evaluators.txt">NV_evaluators</a></td></tr>
<tr><td class="num">361</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/explicit_multisample.txt">NV_explicit_multisample</a></td></tr>
<tr><td class="num">362</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/fence.txt">NV_fence</a></td></tr>
<tr><td class="num">363</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/float_buffer.txt">NV_float_buffer</a></td></tr>
<tr><td class="num">364</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/fog_distance.txt">NV_fog_distance</a></td></tr>
<tr><td class="num">365</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/fragment_program.txt">NV_fragment_program</a></td></tr>
<tr><td class="num">366</td><td>&nbsp;</td><td><a href="http://www.nvidia.com/dev_content/nvopenglspecs/GL_NV_fragment_program2.txt">NV_fragment_program2</a></td></tr>
<tr><td class="num">367</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_NV_fragment_program4.txt">NV_fragment_program4</a></td></tr>
<tr><td class="num">368</td><td>&nbsp;</td><td><a href="http://www.nvidia.com/dev_content/nvopenglspecs/GL_NV_fragment_program_option.txt">NV_fragment_program_option</a></td></tr>
<tr><td class="num">369</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_NV_framebuffer_multisample_coverage.txt">NV_framebuffer_multisample_coverage</a></td></tr>
<tr><td class="num">370</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_NV_geometry_program4.txt">NV_geometry_program4</a></td></tr>
<tr><td class="num">371</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_NV_geometry_shader4.txt">NV_geometry_shader4</a></td></tr>
<tr><td class="num">372</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_NV_gpu_program4.txt">NV_gpu_program4</a></td></tr>
<tr><td class="num">373</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/NV/gpu_program5.txt">NV_gpu_program5</a></td></tr>
<tr><td class="num">374</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/gpu_program5_mem_extended.txt">NV_gpu_program5_mem_extended</a></td></tr>
<tr><td class="num">375</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/gpu_program5.txt">NV_gpu_program_fp64</a></td></tr>
<tr><td class="num">376</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/gpu_shader5.txt">NV_gpu_shader5</a></td></tr>
<tr><td class="num">377</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/half_float.txt">NV_half_float</a></td></tr>
<tr><td class="num">378</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/light_max_exponent.txt">NV_light_max_exponent</a></td></tr>
<tr><td class="num">379</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/multisample_coverage.txt">NV_multisample_coverage</a></td></tr>
<tr><td class="num">380</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/multisample_filter_hint.txt">NV_multisample_filter_hint</a></td></tr>
<tr><td class="num">381</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/occlusion_query.txt">NV_occlusion_query</a></td></tr>
<tr><td class="num">382</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/packed_depth_stencil.txt">NV_packed_depth_stencil</a></td></tr>
<tr><td class="num">383</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_NV_parameter_buffer_object.txt">NV_parameter_buffer_object</a></td></tr>
<tr><td class="num">384</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/parameter_buffer_object2.txt">NV_parameter_buffer_object2</a></td></tr>
<tr><td class="num">385</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/NV/path_rendering.txt">NV_path_rendering</a></td></tr>
<tr><td class="num">386</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/pixel_data_range.txt">NV_pixel_data_range</a></td></tr>
<tr><td class="num">387</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/point_sprite.txt">NV_point_sprite</a></td></tr>
<tr><td class="num">388</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/NV/present_video.txt">NV_present_video</a></td></tr>
<tr><td class="num">389</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/primitive_restart.txt">NV_primitive_restart</a></td></tr>
<tr><td class="num">390</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/register_combiners.txt">NV_register_combiners</a></td></tr>
<tr><td class="num">391</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/register_combiners2.txt">NV_register_combiners2</a></td></tr>
<tr><td class="num">392</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/shader_atomic_counters.txt">NV_shader_atomic_counters</a></td></tr>
<tr><td class="num">393</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/shader_atomic_float.txt">NV_shader_atomic_float</a></td></tr>
<tr><td class="num">394</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/shader_buffer_load.txt">NV_shader_buffer_load</a></td></tr>
<tr><td class="num">395</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/shader_storage_buffer_object.txt">NV_shader_storage_buffer_object</a></td></tr>
<tr><td class="num">396</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/NV/tessellation_program5.txt">NV_tessellation_program5</a></td></tr>
<tr><td class="num">397</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/texgen_emboss.txt">NV_texgen_emboss</a></td></tr>
<tr><td class="num">398</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/texgen_reflection.txt">NV_texgen_reflection</a></td></tr>
<tr><td class="num">399</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/texture_barrier.txt">NV_texture_barrier</a></td></tr>
<tr><td class="num">400</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/texture_compression_vtc.txt">NV_texture_compression_vtc</a></td></tr>
<tr><td class="num">401</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/texture_env_combine4.txt">NV_texture_env_combine4</a></td></tr>
<tr><td class="num">402</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/texture_expand_normal.txt">NV_texture_expand_normal</a></td></tr>
<tr><td class="num">403</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/texture_multisample.txt">NV_texture_multisample</a></td></tr>
<tr><td class="num">404</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/texture_rectangle.txt">NV_texture_rectangle</a></td></tr>
<tr><td class="num">405</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/texture_shader.txt">NV_texture_shader</a></td></tr>
<tr><td class="num">406</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/texture_shader2.txt">NV_texture_shader2</a></td></tr>
<tr><td class="num">407</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/texture_shader3.txt">NV_texture_shader3</a></td></tr>
<tr><td class="num">408</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_NV_transform_feedback.txt">NV_transform_feedback</a></td></tr>
<tr><td class="num">409</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/transform_feedback2.txt">NV_transform_feedback2</a></td></tr>
<tr><td class="num">410</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/NV/vdpau_interop.txt">NV_vdpau_interop</a></td></tr>
<tr><td class="num">411</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/vertex_array_range.txt">NV_vertex_array_range</a></td></tr>
<tr><td class="num">412</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/vertex_array_range2.txt">NV_vertex_array_range2</a></td></tr>
<tr><td class="num">413</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/vertex_attrib_integer_64bit.txt">NV_vertex_attrib_integer_64bit</a></td></tr>
<tr><td class="num">414</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/vertex_buffer_unified_memory.txt">NV_vertex_buffer_unified_memory</a></td></tr>
<tr><td class="num">415</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/vertex_program.txt">NV_vertex_program</a></td></tr>
<tr><td class="num">416</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/vertex_program1_1.txt">NV_vertex_program1_1</a></td></tr>
<tr><td class="num">417</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/vertex_program2.txt">NV_vertex_program2</a></td></tr>
<tr><td class="num">418</td><td>&nbsp;</td><td><a href="http://www.nvidia.com/dev_content/nvopenglspecs/GL_NV_vertex_program2_option.txt">NV_vertex_program2_option</a></td></tr>
<tr><td class="num">419</td><td>&nbsp;</td><td><a href="http://www.nvidia.com/dev_content/nvopenglspecs/GL_NV_vertex_program3.txt">NV_vertex_program3</a></td></tr>
<tr><td class="num">420</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_NV_vertex_program4.txt">NV_vertex_program4</a></td></tr>
<tr><td class="num">421</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/video_capture.txt">NV_video_capture</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">422</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/OES/OES_byte_coordinates.txt">OES_byte_coordinates</a></td></tr>
<tr><td class="num">423</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/OES/OES_compressed_paletted_texture.txt">OES_compressed_paletted_texture</a></td></tr>
<tr><td class="num">424</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/OES/OES_read_format.txt">OES_read_format</a></td></tr>
<tr><td class="num">425</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/OES/OES_single_precision.txt">OES_single_precision</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">426</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/OML/interlace.txt">OML_interlace</a></td></tr>
<tr><td class="num">427</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/OML/resample.txt">OML_resample</a></td></tr>
<tr><td class="num">428</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/OML/subsample.txt">OML_subsample</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">429</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/PGI/misc_hints.txt">PGI_misc_hints</a></td></tr>
<tr><td class="num">430</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/PGI/vertex_hints.txt">PGI_vertex_hints</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">431</td><td>&nbsp;</td><td><a href="https://github.com/p3/regal/tree/master/doc/extensions">REGAL_ES1_0_compatibility</a></td></tr>
<tr><td class="num">432</td><td>&nbsp;</td><td><a href="https://github.com/p3/regal/tree/master/doc/extensions">REGAL_ES1_1_compatibility</a></td></tr>
<tr><td class="num">433</td><td>&nbsp;</td><td><a href="https://github.com/p3/regal/tree/master/doc/extensions">REGAL_enable</a></td></tr>
<tr><td class="num">434</td><td>&nbsp;</td><td><a href="https://github.com/p3/regal/tree/master/doc/extensions">REGAL_error_string</a></td></tr>
<tr><td class="num">435</td><td>&nbsp;</td><td><a href="https://github.com/p3/regal/tree/master/doc/extensions">REGAL_extension_query</a></td></tr>
<tr><td class="num">436</td><td>&nbsp;</td><td><a href="https://github.com/p3/regal/tree/master/doc/extensions">REGAL_log</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">437</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/REND/screen_coordinates.txt">REND_screen_coordinates</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">438</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/S3/s3tc.txt">S3_s3tc</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">439</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIS/color_range.txt">SGIS_color_range</a></td></tr>
<tr><td class="num">440</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIS/detail_texture.txt">SGIS_detail_texture</a></td></tr>
<tr><td class="num">441</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIS/fog_func.txt">SGIS_fog_function</a></td></tr>
<tr><td class="num">442</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIS/generate_mipmap.txt">SGIS_generate_mipmap</a></td></tr>
<tr><td class="num">443</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIS/multisample.txt">SGIS_multisample</a></td></tr>
<tr><td class="num">444</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIS/pixel_texture.txt">SGIS_pixel_texture</a></td></tr>
<tr><td class="num">445</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIS/point_line_texgen.txt">SGIS_point_line_texgen</a></td></tr>
<tr><td class="num">446</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIS/sharpen_texture.txt">SGIS_sharpen_texture</a></td></tr>
<tr><td class="num">447</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIS/texture4D.txt">SGIS_texture4D</a></td></tr>
<tr><td class="num">448</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIS/texture_border_clamp.txt">SGIS_texture_border_clamp</a></td></tr>
<tr><td class="num">449</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIS/texture_edge_clamp.txt">SGIS_texture_edge_clamp</a></td></tr>
<tr><td class="num">450</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIS/texture_filter4.txt">SGIS_texture_filter4</a></td></tr>
<tr><td class="num">451</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIS/texture_lod.txt">SGIS_texture_lod</a></td></tr>
<tr><td class="num">452</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIS/texture_select.txt">SGIS_texture_select</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">453</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/async.txt">SGIX_async</a></td></tr>
<tr><td class="num">454</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/async_histogram.txt">SGIX_async_histogram</a></td></tr>
<tr><td class="num">455</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/async_pixel.txt">SGIX_async_pixel</a></td></tr>
<tr><td class="num">456</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/blend_alpha_minmax.txt">SGIX_blend_alpha_minmax</a></td></tr>
<tr><td class="num">457</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/clipmap.txt">SGIX_clipmap</a></td></tr>
<tr><td class="num">458</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/convolution_accuracy.txt">SGIX_convolution_accuracy</a></td></tr>
<tr><td class="num">459</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/depth_texture.txt">SGIX_depth_texture</a></td></tr>
<tr><td class="num">460</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/flush_raster.txt">SGIX_flush_raster</a></td></tr>
<tr><td class="num">461</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/fog_offset.txt">SGIX_fog_offset</a></td></tr>
<tr><td class="num">462</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/fog_texture.txt">SGIX_fog_texture</a></td></tr>
<tr><td class="num">463</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/fragment_specular_lighting.txt">SGIX_fragment_specular_lighting</a></td></tr>
<tr><td class="num">464</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/framezoom.txt">SGIX_framezoom</a></td></tr>
<tr><td class="num">465</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/interlace.txt">SGIX_interlace</a></td></tr>
<tr><td class="num">466</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/ir_instrument1.txt">SGIX_ir_instrument1</a></td></tr>
<tr><td class="num">467</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/list_priority.txt">SGIX_list_priority</a></td></tr>
<tr><td class="num">468</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/sgix_pixel_texture.txt">SGIX_pixel_texture</a></td></tr>
<tr><td class="num">469</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/pixel_texture_bits.txt">SGIX_pixel_texture_bits</a></td></tr>
<tr><td class="num">470</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/reference_plane.txt">SGIX_reference_plane</a></td></tr>
<tr><td class="num">471</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/resample.txt">SGIX_resample</a></td></tr>
<tr><td class="num">472</td><td>&nbsp;</td><td><a href="http://oss.sgi.com/projects/ogl-sample/registry/SGIX/shadow.txt">SGIX_shadow</a></td></tr>
<tr><td class="num">473</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/shadow_ambient.txt">SGIX_shadow_ambient</a></td></tr>
<tr><td class="num">474</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/sprite.txt">SGIX_sprite</a></td></tr>
<tr><td class="num">475</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/tag_sample_buffer.txt">SGIX_tag_sample_buffer</a></td></tr>
<tr><td class="num">476</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/texture_env_add.txt">SGIX_texture_add_env</a></td></tr>
<tr><td class="num">477</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/texture_coordinate_clamp.txt">SGIX_texture_coordinate_clamp</a></td></tr>
<tr><td class="num">478</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/texture_lod_bias.txt">SGIX_texture_lod_bias</a></td></tr>
<tr><td class="num">479</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/texture_multi_buffer.txt">SGIX_texture_multi_buffer</a></td></tr>
<tr><td class="num">480</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/texture_range.txt">SGIX_texture_range</a></td></tr>
<tr><td class="num">481</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/texture_scale_bias.txt">SGIX_texture_scale_bias</a></td></tr>
<tr><td class="num">482</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/vertex_preclip.txt">SGIX_vertex_preclip</a></td></tr>
<tr><td class="num">483</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/vertex_preclip.txt">SGIX_vertex_preclip_hint</a></td></tr>
<tr><td class="num">484</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/ycrcb.txt">SGIX_ycrcb</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">485</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGI/color_matrix.txt">SGI_color_matrix</a></td></tr>
<tr><td class="num">486</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGI/color_table.txt">SGI_color_table</a></td></tr>
<tr><td class="num">487</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGI/texture_color_table.txt">SGI_texture_color_table</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">488</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SUNX/constant_data.txt">SUNX_constant_data</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">489</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SUN/convolution_border_modes.txt">SUN_convolution_border_modes</a></td></tr>
<tr><td class="num">490</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SUN/global_alpha.txt">SUN_global_alpha</a></td></tr>
<tr><td class="num">491</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SUN/mesh_array.txt">SUN_mesh_array</a></td></tr>
<tr><td class="num">492</td><td>&nbsp;</td><td><a href="http://wwws.sun.com/software/graphics/opengl/extensions/gl_sun_read_video_pixels.txt">SUN_read_video_pixels</a></td></tr>
<tr><td class="num">493</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SUN/slice_accum.txt">SUN_slice_accum</a></td></tr>
<tr><td class="num">494</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SUN/triangle_list.txt">SUN_triangle_list</a></td></tr>
<tr><td class="num">495</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SUN/vertex.txt">SUN_vertex</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">496</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/WIN/phong_shading.txt">WIN_phong_shading</a></td></tr>
<tr><td class="num">497</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/WIN/specular_fog.txt">WIN_specular_fog</a></td></tr>
<tr><td class="num">498</td><td>&nbsp;</td><td><a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc01_16zy.asp">WIN_swap_hint</a></td></tr>
</table>
<!-- begin footer.html -->
</td></tr></table></body>
<!-- end footer.html -->

BIN
interface/external/glew/doc/glew.png vendored Normal file

Binary file not shown.

After

(image error) Size: 9.1 KiB

28
interface/external/glew/doc/glew.txt vendored Normal file
View file

@ -0,0 +1,28 @@
The OpenGL Extension Wrangler Library
Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>
Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>
Copyright (C) 2002, Lev Povalahev
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.
* The name of the author 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.

179
interface/external/glew/doc/glxew.html vendored Normal file
View file

@ -0,0 +1,179 @@
<!-- begin header.html -->
<!--
The OpenGL Extension Wrangler Library
Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>
Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>
Copyright (C) 2002, Lev Povalahev
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.
* The name of the author 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.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html/4/loose.dtd">
<!-- &nbsp;<img src="new.png" height="12" alt="NEW!"> -->
<html>
<head>
<title>GLEW: The OpenGL Extension Wrangler Library</title>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<link href="glew.css" type="text/css" rel="stylesheet">
</head>
<body bgcolor="#fff0d0">
<table border="0" width="100%" cellpadding="12" cellspacing="8" style="height:100%">
<tr>
<td bgcolor="#ffffff" align="left" valign="top" width="200">
<table border="0" width="100%" cellpadding="0" cellspacing="0" align="left">
<tr>
<td valign="top">
<table border="0" width="100%" cellpadding="0" cellspacing="0" align="left">
<tr><td align="center"><i>Latest Release: <a href="https://sourceforge.net/projects/glew/files/glew/1.10.0/">1.10.0</a></i></td></tr>
<tr><td align="center"><br></td></tr>
<tr><td align="center"><img src="./glew.png" alt="GLEW Logo" width="97" height="75"></td></tr>
<tr><td align="center"><br></td></tr>
<tr><td align="center">
<table border="0" cellpadding="0" cellspacing="0" align="center">
<tr><td align="center"><a href="index.html">Download</a></td></tr>
<tr><td align="center"><a href="basic.html">Usage</a></td></tr>
<tr><td align="center"><a href="build.html">Building</a></td></tr>
<tr><td align="center"><a href="install.html">Installation</a></td></tr>
<tr><td align="center"><a href="advanced.html">Source Generation</a></td></tr>
<tr><td align="center"><a href="credits.html">Credits & Copyright</a></td></tr>
<tr><td align="center"><a href="log.html">Change Log</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/projects/glew">Project Page</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/p/glew/mailman">Mailing Lists</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/p/glew/_list/tickets">Bug Tracker</a></td></tr>
</table>
<tr><td align="center"><br></tr>
</table>
</td>
</tr>
<tr>
<td valign="bottom">
<table border="0" width="100%" cellpadding="5" cellspacing="0" align="left">
<tr><td align="center"><i>Last Update: 07-22-13</i></td></tr>
<tr><td align="center">
<a href="http://www.opengl.org"> <img src="./ogl_sm.jpg" width="68"
height="35" border="0" alt="OpenGL Logo"></a>
<a href="http://sourceforge.net"> <img
src="http://sourceforge.net/sflogo.php?group_id=67586&amp;type=1"
width="88" height="31" border="0" alt="SourceForge Logo"></a>
</td>
</tr>
<!--- <tr><td align="center"><a
href="http://sourceforge.net/donate/index.php?group_id=67586"><img
src="http://images.sourceforge.net/images/project-support.jpg"
width="88" height="32" border="0" alt="Support This Project"></a></td></tr> -->
</table>
</td>
</tr>
</table>
</td>
<td bgcolor="#ffffff" align="left" valign="top">
<h1>The OpenGL Extension Wrangler Library</h1>
<!-- end header.html -->
<h2>Supported GLX Extensions</h2>
<table border="0" width="100%" cellpadding="1" cellspacing="0" align="center">
<tr><td class="num">1</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/3DFX/3dfx_multisample.txt">3DFX_multisample</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">2</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/AMD/glx_gpu_association.txt">AMD_gpu_association</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">3</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/glx_create_context.txt">ARB_create_context</a></td></tr>
<tr><td class="num">4</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/glx_create_context.txt">ARB_create_context_profile</a></td></tr>
<tr><td class="num">5</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/glx_create_context_robustness.txt">ARB_create_context_robustness</a></td></tr>
<tr><td class="num">6</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/color_buffer_float.txt">ARB_fbconfig_float</a></td></tr>
<tr><td class="num">7</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/framebuffer_sRGB.txt">ARB_framebuffer_sRGB</a></td></tr>
<tr><td class="num">8</td><td>&nbsp;</td><td><a href="http://oss.sgi.com/projects/ogl-sample/registry/ARB/get_proc_address.txt">ARB_get_proc_address</a></td></tr>
<tr><td class="num">9</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/multisample.txt">ARB_multisample</a></td></tr>
<tr><td class="num">10</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/glx_robustness_isolation.txt">ARB_robustness_application_isolation</a></td></tr>
<tr><td class="num">11</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/glx_robustness_isolation.txt">ARB_robustness_share_group_isolation</a></td></tr>
<tr><td class="num">12</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/vertex_buffer_object.txt">ARB_vertex_buffer_object</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">13</td><td>&nbsp;</td><td>ATI_pixel_format_float</td></tr>
<tr><td class="num">14</td><td>&nbsp;</td><td>ATI_render_texture</td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">15</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/glx_buffer_age.txt">EXT_buffer_age</a></td></tr>
<tr><td class="num">16</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/EXT/glx_create_context_es2_profile.txt">EXT_create_context_es2_profile</a></td></tr>
<tr><td class="num">17</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/EXT/glx_create_context_es_profile.txt">EXT_create_context_es_profile</a></td></tr>
<tr><td class="num">18</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_EXT_packed_float.txt">EXT_fbconfig_packed_float</a></td></tr>
<tr><td class="num">19</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_EXT_framebuffer_sRGB.txt">EXT_framebuffer_sRGB</a></td></tr>
<tr><td class="num">20</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/import_context.txt">EXT_import_context</a></td></tr>
<tr><td class="num">21</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/scene_marker.txt">EXT_scene_marker</a></td></tr>
<tr><td class="num">22</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/swap_control.txt">EXT_swap_control</a></td></tr>
<tr><td class="num">23</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/glx_swap_control_tear.txt">EXT_swap_control_tear</a></td></tr>
<tr><td class="num">24</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/texture_from_pixmap.txt">EXT_texture_from_pixmap</a></td></tr>
<tr><td class="num">25</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/visual_info.txt">EXT_visual_info</a></td></tr>
<tr><td class="num">26</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/visual_rating.txt">EXT_visual_rating</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">27</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/INTEL/swap_event.txt">INTEL_swap_event</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">28</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/MESA/agp_offset.txt">MESA_agp_offset</a></td></tr>
<tr><td class="num">29</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/MESA/copy_sub_buffer.txt">MESA_copy_sub_buffer</a></td></tr>
<tr><td class="num">30</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/MESA/pixmap_colormap.txt">MESA_pixmap_colormap</a></td></tr>
<tr><td class="num">31</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/MESA/release_buffers.txt">MESA_release_buffers</a></td></tr>
<tr><td class="num">32</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/MESA/set_3dfx_mode.txt">MESA_set_3dfx_mode</a></td></tr>
<tr><td class="num">33</td><td>&nbsp;</td><td><a href="http://cgit.freedesktop.org/mesa/mesa/plain/docs/MESA_swap_control.spec">MESA_swap_control</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">34</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/copy_image.txt">NV_copy_image</a></td></tr>
<tr><td class="num">35</td><td>&nbsp;</td><td><a href="http://cvs1.nvidia.com/inc/GL/glxtokens.h">NV_float_buffer</a></td></tr>
<tr><td class="num">36</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/multisample_coverage.txt">NV_multisample_coverage</a></td></tr>
<tr><td class="num">37</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/present_video.txt">NV_present_video</a></td></tr>
<tr><td class="num">38</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/glx_swap_group.txt">NV_swap_group</a></td></tr>
<tr><td class="num">39</td><td>&nbsp;</td><td><a href="http://oss.sgi.com/projects/ogl-sample/registry/NV/vertex_array_range.txt">NV_vertex_array_range</a></td></tr>
<tr><td class="num">40</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/video_capture.txt">NV_video_capture</a></td></tr>
<tr><td class="num">41</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/glx_video_output.txt">NV_video_output</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">42</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/OML/glx_swap_method.txt">OML_swap_method</a></td></tr>
<tr><td class="num">43</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/OML/glx_sync_control.txt">OML_sync_control</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">44</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIS/blended_overlay.txt">SGIS_blended_overlay</a></td></tr>
<tr><td class="num">45</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIS/color_range.txt">SGIS_color_range</a></td></tr>
<tr><td class="num">46</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIS/multisample.txt">SGIS_multisample</a></td></tr>
<tr><td class="num">47</td><td>&nbsp;</td><td>SGIS_shared_multisample</td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">48</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/fbconfig.txt">SGIX_fbconfig</a></td></tr>
<tr><td class="num">49</td><td>&nbsp;</td><td><a href="http://oss.sgi.com/projects/ogl-sample/registry/SGIX/hyperpipe_group.txt">SGIX_hyperpipe</a></td></tr>
<tr><td class="num">50</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/pbuffer.txt">SGIX_pbuffer</a></td></tr>
<tr><td class="num">51</td><td>&nbsp;</td><td><a href="http://oss.sgi.com/projects/ogl-sample/registry/SGIX/swap_barrier.txt">SGIX_swap_barrier</a></td></tr>
<tr><td class="num">52</td><td>&nbsp;</td><td><a href="http://oss.sgi.com/projects/ogl-sample/registry/SGIX/swap_group.txt">SGIX_swap_group</a></td></tr>
<tr><td class="num">53</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/video_resize.txt">SGIX_video_resize</a></td></tr>
<tr><td class="num">54</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGIX/visual_select_group.txt">SGIX_visual_select_group</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">55</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGI/cushion.txt">SGI_cushion</a></td></tr>
<tr><td class="num">56</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGI/make_current_read.txt">SGI_make_current_read</a></td></tr>
<tr><td class="num">57</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SGI/swap_control.txt">SGI_swap_control</a></td></tr>
<tr><td class="num">58</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/SGI/video_sync.txt">SGI_video_sync</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">59</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/SUN/get_transparent_index.txt">SUN_get_transparent_index</a></td></tr>
<tr><td class="num">60</td><td>&nbsp;</td><td><a href="http://wwws.sun.com/software/graphics/opengl/extensions/glx_sun_video_resize.txt">SUN_video_resize</a></td></tr>
</table>
<!-- begin footer.html -->
</td></tr></table></body>
<!-- end footer.html -->

340
interface/external/glew/doc/gpl.txt vendored Normal file
View file

@ -0,0 +1,340 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.

221
interface/external/glew/doc/index.html vendored Normal file
View file

@ -0,0 +1,221 @@
<!-- begin header.html -->
<!--
The OpenGL Extension Wrangler Library
Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>
Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>
Copyright (C) 2002, Lev Povalahev
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.
* The name of the author 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.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html/4/loose.dtd">
<!-- &nbsp;<img src="new.png" height="12" alt="NEW!"> -->
<html>
<head>
<title>GLEW: The OpenGL Extension Wrangler Library</title>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<link href="glew.css" type="text/css" rel="stylesheet">
</head>
<body bgcolor="#fff0d0">
<table border="0" width="100%" cellpadding="12" cellspacing="8" style="height:100%">
<tr>
<td bgcolor="#ffffff" align="left" valign="top" width="200">
<table border="0" width="100%" cellpadding="0" cellspacing="0" align="left">
<tr>
<td valign="top">
<table border="0" width="100%" cellpadding="0" cellspacing="0" align="left">
<tr><td align="center"><i>Latest Release: <a href="https://sourceforge.net/projects/glew/files/glew/1.10.0/">1.10.0</a></i></td></tr>
<tr><td align="center"><br></td></tr>
<tr><td align="center"><img src="./glew.png" alt="GLEW Logo" width="97" height="75"></td></tr>
<tr><td align="center"><br></td></tr>
<tr><td align="center">
<table border="0" cellpadding="0" cellspacing="0" align="center">
<tr><td align="center">Download</td></tr>
<tr><td align="center"><a href="basic.html">Usage</a></td></tr>
<tr><td align="center"><a href="build.html">Building</a></td></tr>
<tr><td align="center"><a href="install.html">Installation</a></td></tr>
<tr><td align="center"><a href="advanced.html">Source Generation</a></td></tr>
<tr><td align="center"><a href="credits.html">Credits & Copyright</a></td></tr>
<tr><td align="center"><a href="log.html">Change Log</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/projects/glew">Project Page</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/p/glew/mailman">Mailing Lists</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/p/glew/_list/tickets">Bug Tracker</a></td></tr>
</table>
<tr><td align="center"><br></tr>
</table>
</td>
</tr>
<tr>
<td valign="bottom">
<table border="0" width="100%" cellpadding="5" cellspacing="0" align="left">
<tr><td align="center"><i>Last Update: 07-22-13</i></td></tr>
<tr><td align="center">
<a href="http://www.opengl.org"> <img src="./ogl_sm.jpg" width="68"
height="35" border="0" alt="OpenGL Logo"></a>
<a href="http://sourceforge.net"> <img
src="http://sourceforge.net/sflogo.php?group_id=67586&amp;type=1"
width="88" height="31" border="0" alt="SourceForge Logo"></a>
</td>
</tr>
<!--- <tr><td align="center"><a
href="http://sourceforge.net/donate/index.php?group_id=67586"><img
src="http://images.sourceforge.net/images/project-support.jpg"
width="88" height="32" border="0" alt="Support This Project"></a></td></tr> -->
</table>
</td>
</tr>
</table>
</td>
<td bgcolor="#ffffff" align="left" valign="top">
<h1>The OpenGL Extension Wrangler Library</h1>
<!-- end header.html -->
<p>
The OpenGL Extension Wrangler Library (GLEW) is a cross-platform
open-source C/C++ extension loading library. GLEW provides efficient
run-time mechanisms for determining which OpenGL extensions are
supported on the target platform. OpenGL core and extension
functionality is exposed in a single header file. GLEW has been
tested on a variety of operating systems, including Windows, Linux,
Mac OS X, FreeBSD, Irix, and Solaris.
</p>
<h2>Downloads</h2>
<p>
<a href="http://sourceforge.net/projects/glew/">GLEW</a> is distributed
as source and precompiled binaries.<br/>
The latest release is
<a href="https://sourceforge.net/projects/glew/files/glew/1.10.0/">1.10.0</a>[07-22-13]:
</p>
<p>
</p>
<p>
<table border="1" cellpadding="5" cellspacing="0" bgcolor="#f0f0f0" align="center">
<tr>
<td>
<table border="0" cellpadding="3" cellspacing="0">
<tr>
<td></td>
<td align="right"><b>Source</b></td>
<td></td>
<td align="left">
<a href="https://sourceforge.net/projects/glew/files/glew/1.10.0/glew-1.10.0.zip/download">ZIP</a>&nbsp;|&nbsp;
<a href="https://sourceforge.net/projects/glew/files/glew/1.10.0/glew-1.10.0.tgz/download">TGZ</a></td>
<td></td>
</tr>
<tr>
<td></td>
<td align="right"><b>Binaries</b></td>
<td></td>
<td align="left">
<a href="https://sourceforge.net/projects/glew/files/glew/1.10.0/glew-1.10.0-win32.zip/download">Windows 32-bit and 64-bit</a>&nbsp;|&nbsp;
</td>
<td></td>
</tr>
</table>
</tr>
</table>
<p></p>
<p>
An up-to-date copy is also available using <a href="http://git-scm.com/">git</a>:
</p>
<ul>
<li><a href="https://github.com/nigels-com/glew">github</a><br/>
<tt>git clone https://github.com/nigels-com/glew.git glew</tt><br/>&nbsp;</li>
<li><a href="https://sourceforge.net/p/glew/code">Sourceforge</a><br/>
<tt>git clone git://git.code.sf.net/p/glew/code glew</tt><br/>&nbsp;</li>
</ul>
<p></p>
<p>
<a href="https://sourceforge.net/projects/glew/files/glew/snapshots/">Unsupported snapshots</a> are also available:
</p>
<ul>
<li><a href="http://sourceforge.net/projects/glew/files/glew/snapshots/glew-20130715.tgz/download">glew-20130715.tgz</a></li>
<li><a href="http://sourceforge.net/projects/glew/files/glew/snapshots/glew-20130118.tgz/download">glew-20130118.tgz</a></li>
</ul>
<h2>Supported Extensions</h2>
<p>
The latest release contains support for OpenGL 4.4 and the following extensions:
</p>
<ul>
<li><a href="glew.html">OpenGL extensions</a>
<li><a href="wglew.html">WGL extensions</a>
<li><a href="glxew.html">GLX extensions</a>
</ul>
<h2>News</h2>
<ul>
<li>[07-22-13] <a href="https://sourceforge.net/projects/glew/files/glew/1.10.0/">GLEW 1.10.0</a> adds support for OpenGL 4.4, new extensions</li>
<li>[08-06-12] <a href="https://sourceforge.net/projects/glew/files/glew/1.9.0/">GLEW 1.9.0</a> adds support for OpenGL 4.3, new extensions</li>
<li>[07-17-12] <a href="https://sourceforge.net/projects/glew/files/glew/1.8.0/">GLEW 1.8.0</a> fixes minor bugs and adds new extensions</li>
<li>[08-26-11] <a href="https://sourceforge.net/projects/glew/files/glew/1.7.0/">GLEW 1.7.0</a> adds support for OpenGL 4.2, new extensions, fixes bugs</li>
<li>[04-27-11] <a href="https://sourceforge.net/projects/glew/files/glew/1.6.0/">GLEW 1.6.0</a> fixes minor bugs and adds eight new extensions</li>
<li>[01-31-11] <a href="https://sourceforge.net/projects/glew/files/glew/1.5.8/">GLEW 1.5.8</a> fixes minor bugs and adds two new extensions</li>
<li>[11-03-10] <a href="https://sourceforge.net/projects/glew/files/glew/1.5.7/">GLEW 1.5.7</a> fixes minor bugs and adds one new extension</li>
<li>[09-07-10] <a href="https://sourceforge.net/projects/glew/files/glew/1.5.6/">GLEW 1.5.6</a> adds support for OpenGL 4.1, fixes bugs</li>
<li>[07-13-10] <a href="https://sourceforge.net/projects/glew/files/glew/1.5.5/">GLEW 1.5.5</a> fixes minor bugs and adds new extensions</li>
<li>[04-21-10] <a href="https://sourceforge.net/projects/glew/files/glew/1.5.4/">GLEW 1.5.4</a> adds support for OpenGL 3.3, OpenGL 4.0 and new extensions, fixes bugs</li>
<li>[02-28-10] <a href="https://sourceforge.net/projects/glew/files/glew/1.5.3/">GLEW 1.5.3</a> fixes minor bugs and adds three new extensions</li>
<li>[12-31-09] <a href="https://sourceforge.net/projects/glew/files/glew/1.5.2/">GLEW 1.5.2</a> adds support for OpenGL 3.1, OpenGL 3.2 and new extensions</li>
<li>[11-03-08] <a href="https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=637800">GLEW 1.5.1</a> adds support for OpenGL 3.0 and 31 new extensions</li>
<li>[12-27-07] <a href="https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=564464">GLEW 1.5.0</a> is released under less restrictive licenses</li>
<li>[04-27-07] <a href="https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=504079">GLEW 1.4.0</a> is released</li>
<li>[03-08-07] GLEW is included in the <a href="http://developer.nvidia.com/object/sdk_home.html">NVIDIA OpenGL SDK</a></li>
<li>[03-04-07] <a href="https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=491113">GLEW 1.3.6</a> is released</li>
<li>[02-28-07] <a href="http://glew.svn.sourceforge.net/svnroot/glew/trunk/glew/">Repository</a> is migrated to SVN</li>
<li>[02-25-07] GLEW is included in the <a href="http://www.opengl.org/sdk/">OpenGL SDK</a></li>
<li>[11-21-06] <a href="https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=465334">GLEW 1.3.5</a> adds OpenGL 2.1 and NVIDIA G80 extensions</li>
<li>[03-04-06] <a href="https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=398455">GLEW 1.3.4</a> adds support for five new extensions</li>
<li>[05-16-05] <a href="https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=327647">GLEW 1.3.3</a> is released</li>
<li>[03-16-05] <a href="https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=313345">GLEW 1.3.2</a> adds support for GL_APPLE_pixel_buffer</li>
<li>[02-11-05] <a href="http://gljava.sourceforge.net/">gljava</a> and <a href="http://sdljava.sourceforge.net/">sdljava</a> provide a Java binding to OpenGL via GLEW</li>
<li>[02-02-05] <a href="https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=302049">GLEW 1.3.1</a> adds support for <a href="http://www.opengl.org/documentation/extensions/EXT_framebuffer_object.txt">GL_EXT_framebuffer_object</a></li>
<li>[01-04-05] <a href="https://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=294527">GLEW 1.3.0</a> adds core OpenGL 2.0 support plus many enhancements</li>
<li>[12-22-04] <a href="http://glewpy.sf.net/">GLEWpy</a> Python wrapper announced</li>
<li>[12-12-04] <a href="https://sourceforge.net/mail/?group_id=67586">Mailing lists</a> created on sourceforge</li>
<li>[12-06-04] <a href="http://sourceforge.net/project/showfiles.php?group_id=67586&amp;package_id=67942&amp;release_id=287948">GLEW 1.2.5</a> adds new extensions and support for FreeBSD</li>
</ul>
<h2>Links</h2>
<ul>
<li><a href="http://www.opengl.org/sdk/">OpenGL Software Development Kit</a></li>
<li><a href="http://www.opengl.org/resources/features/OGLextensions/">All About OpenGL Extensions</a></li>
<li><a href="http://www.opengl.org/registry/">OpenGL Extension Registry</a></li>
<li><a href="http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Conceptual/OpenGLExtensionsGuide/Reference/reference.html">APPLE OpenGL Extensions Guide</a></li>
<li><a href="http://developer.nvidia.com/nvidia-opengl-specs">NVIDIA OpenGL Extension Specifications</a></li>
</ul>
<!-- begin footer.html -->
</td></tr></table></body>
<!-- end footer.html -->

229
interface/external/glew/doc/install.html vendored Normal file
View file

@ -0,0 +1,229 @@
<!-- begin header.html -->
<!--
The OpenGL Extension Wrangler Library
Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>
Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>
Copyright (C) 2002, Lev Povalahev
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.
* The name of the author 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.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html/4/loose.dtd">
<!-- &nbsp;<img src="new.png" height="12" alt="NEW!"> -->
<html>
<head>
<title>GLEW: The OpenGL Extension Wrangler Library</title>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<link href="glew.css" type="text/css" rel="stylesheet">
</head>
<body bgcolor="#fff0d0">
<table border="0" width="100%" cellpadding="12" cellspacing="8" style="height:100%">
<tr>
<td bgcolor="#ffffff" align="left" valign="top" width="200">
<table border="0" width="100%" cellpadding="0" cellspacing="0" align="left">
<tr>
<td valign="top">
<table border="0" width="100%" cellpadding="0" cellspacing="0" align="left">
<tr><td align="center"><i>Latest Release: <a href="https://sourceforge.net/projects/glew/files/glew/1.10.0/">1.10.0</a></i></td></tr>
<tr><td align="center"><br></td></tr>
<tr><td align="center"><img src="./glew.png" alt="GLEW Logo" width="97" height="75"></td></tr>
<tr><td align="center"><br></td></tr>
<tr><td align="center">
<table border="0" cellpadding="0" cellspacing="0" align="center">
<tr><td align="center"><a href="index.html">Download</a></td></tr>
<tr><td align="center"><a href="basic.html">Usage</a></td></tr>
<tr><td align="center"><a href="build.html">Building</a></td></tr>
<tr><td align="center">Installation</td></tr>
<tr><td align="center"><a href="advanced.html">Source Generation</a></td></tr>
<tr><td align="center"><a href="credits.html">Credits & Copyright</a></td></tr>
<tr><td align="center"><a href="log.html">Change Log</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/projects/glew">Project Page</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/p/glew/mailman">Mailing Lists</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/p/glew/_list/tickets">Bug Tracker</a></td></tr>
</table>
<tr><td align="center"><br></tr>
</table>
</td>
</tr>
<tr>
<td valign="bottom">
<table border="0" width="100%" cellpadding="5" cellspacing="0" align="left">
<tr><td align="center"><i>Last Update: 07-22-13</i></td></tr>
<tr><td align="center">
<a href="http://www.opengl.org"> <img src="./ogl_sm.jpg" width="68"
height="35" border="0" alt="OpenGL Logo"></a>
<a href="http://sourceforge.net"> <img
src="http://sourceforge.net/sflogo.php?group_id=67586&amp;type=1"
width="88" height="31" border="0" alt="SourceForge Logo"></a>
</td>
</tr>
<!--- <tr><td align="center"><a
href="http://sourceforge.net/donate/index.php?group_id=67586"><img
src="http://images.sourceforge.net/images/project-support.jpg"
width="88" height="32" border="0" alt="Support This Project"></a></td></tr> -->
</table>
</td>
</tr>
</table>
</td>
<td bgcolor="#ffffff" align="left" valign="top">
<h1>The OpenGL Extension Wrangler Library</h1>
<!-- end header.html -->
<h2>Installation</h2>
<p>
To use the shared library version of GLEW, you need to copy the
headers and libraries into their destination directories. On Windows
this typically boils down to copying:
</p>
<table border="0" cellpadding="0" cellspacing="0" align="center"> <!-- bgcolor="#f0f0f0" -->
<tr><td align="left"><tt>bin/glew32.dll</tt></td><td>&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;&nbsp;&nbsp;</td>
<td align="left"><tt>%SystemRoot%/system32</tt></td></tr>
<tr><td align="left"><tt>lib/glew32.lib</tt></td><td>&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;&nbsp;&nbsp;</td>
<td align="left"><tt>{VC Root}/Lib</tt></td></tr>
<tr><td align="left"><tt>include/GL/glew.h</tt></td><td>&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;&nbsp;&nbsp;</td>
<td align="left"><tt>{VC Root}/Include/GL</tt></td></tr>
<tr><td align="left"><tt>include/GL/wglew.h</tt></td><td>&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;&nbsp;&nbsp;</td>
<td align="left"><tt>{VC Root}/Include/GL</tt></td></tr>
</table>
<p>
</p>
<p>
where <tt>{VC Root}</tt> is the Visual C++ root directory, typically
<tt>C:/Program Files/Microsoft Visual Studio/VC98</tt> for Visual
Studio 6.0 or <tt>C:/Program Files/Microsoft Visual
Studio .NET 2003/Vc7/PlatformSDK</tt> for Visual Studio .NET.
</p>
<p>
On Unix, typing <tt>make install</tt> will attempt to install GLEW
into <tt>/usr/include/GL</tt> and <tt>/usr/lib</tt>. You can
customize the installation target via the <tt>GLEW_DEST</tt>
environment variable if you do not have write access to these
directories.
</p>
<h2>Building Your Project with GLEW</h2>
<p>
There are two ways to build your project with GLEW.
</p>
<h3>Including the source files / project file</h3>
<p>
The simpler but less flexible way is to include <tt>glew.h</tt> and
<tt>glew.c</tt> into your project. On Windows, you also need to
define the <tt>GLEW_STATIC</tt> preprocessor token when building a
static library or executable, and the <tt>GLEW_BUILD</tt> preprocessor
token when building a dll. You also need to replace
<tt>&lt;GL/gl.h&gt;</tt> and <tt>&lt;GL/glu.h&gt;</tt> with
<tt>&lt;glew.h&gt;</tt> in your code and set the appropriate include
flag (<tt>-I</tt>) to tell the compiler where to look for it. For
example:
</p>
<p class="pre">
#include &lt;glew.h&gt;<br>
#include &lt;GL/glut.h&gt;<br>
&lt;gl, glu, and glut functionality is available here&gt;<br>
</p>
<p>
Depending on where you put <tt>glew.h</tt> you may also need to change
the include directives in <tt>glew.c</tt>. Note that if you are using
GLEW together with GLUT, you have to include <tt>glew.h</tt> first.
In addition, <tt>glew.h</tt> includes <tt>glu.h</tt>, so you do not
need to include it separately.
</p>
<p>
On Windows, you also have the option of adding the supplied project
file <tt>glew_static.dsp</tt> to your workspace (solution) and compile
it together with your other projects. In this case you also need to
change the <tt>GLEW_BUILD</tt> preprocessor constant to
<tt>GLEW_STATIC</tt> when building a static library or executable,
otherwise you get build errors.
</p>
<p>
<b>Note that GLEW does not use the C
runtime library, so it does not matter which version (single-threaded,
multi-threaded or multi-threaded DLL) it is linked with (without
debugging information). It is, however, always a good idea to compile all
your projects including GLEW with the same C runtime settings.</b>
</p>
<h3>Using GLEW as a shared library</h3>
<p>
Alternatively, you can use the provided project files / makefile to
build a separate shared library you can link your projects with later.
In this case the best practice is to install <tt>glew.h</tt>,
<tt>glew32.lib</tt>, and <tt>glew32.dll</tt> / <tt>libGLEW.so</tt> to
where the OpenGL equivalents <tt>gl.h</tt>, <tt>opengl32.lib</tt>, and
<tt>opengl32.dll</tt> / <tt>libGL.so</tt> are located. Note that you
need administrative privileges to do this. If you do not have
administrator access and your system administrator will not do it for
you, you can install GLEW into your own lib and include subdirectories
and tell the compiler where to find it. Then you can just replace
<tt>&lt;GL/gl.h&gt;</tt> with <tt>&lt;GL/glew.h&gt;</tt> in your
program:
</p>
<p class="pre">
#include &lt;GL/glew.h&gt;<br>
#include &lt;GL/glut.h&gt;<br>
&lt;gl, glu, and glut functionality is available here&gt;<br>
</p>
<p>
or:
</p>
<p class="pre">
#include &lt;GL/glew.h&gt;<br>
&lt;gl and glu functionality is available here&gt;<br>
</p>
<p>
Remember to link your project with <tt>glew32.lib</tt>,
<tt>glu32.lib</tt>, and <tt>opengl32.lib</tt> on Windows and
<tt>libGLEW.so</tt>, <tt>libGLU.so</tt>, and <tt>libGL.so</tt> on
Unix (<tt>-lGLEW -lGLU -lGL</tt>).
</p>
<p>
It is important to keep in mind that <tt>glew.h</tt> includes neither
<tt>windows.h</tt> nor <tt>gl.h</tt>. Also, GLEW will warn you by
issuing a preprocessor error in case you have included <tt>gl.h</tt>,
<tt>glext.h</tt>, or <tt>glATI.h</tt> before <tt>glew.h</tt>.
</p>
<!-- begin footer.html -->
</td></tr></table></body>
<!-- end footer.html -->

20
interface/external/glew/doc/khronos.txt vendored Normal file
View file

@ -0,0 +1,20 @@
Copyright (c) 2007 The Khronos Group Inc.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and/or associated documentation files (the
"Materials"), to deal in the Materials without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Materials, and to
permit persons to whom the Materials are furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Materials.
THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.

1015
interface/external/glew/doc/log.html vendored Normal file

File diff suppressed because it is too large Load diff

21
interface/external/glew/doc/mesa.txt vendored Normal file
View file

@ -0,0 +1,21 @@
Mesa 3-D graphics library
Version: 7.0
Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

BIN
interface/external/glew/doc/new.png vendored Normal file

Binary file not shown.

After

(image error) Size: 1.2 KiB

BIN
interface/external/glew/doc/ogl_sm.jpg vendored Normal file

Binary file not shown.

After

(image error) Size: 1.6 KiB

167
interface/external/glew/doc/wglew.html vendored Normal file
View file

@ -0,0 +1,167 @@
<!-- begin header.html -->
<!--
The OpenGL Extension Wrangler Library
Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>
Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>
Copyright (C) 2002, Lev Povalahev
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.
* The name of the author 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.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html/4/loose.dtd">
<!-- &nbsp;<img src="new.png" height="12" alt="NEW!"> -->
<html>
<head>
<title>GLEW: The OpenGL Extension Wrangler Library</title>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<link href="glew.css" type="text/css" rel="stylesheet">
</head>
<body bgcolor="#fff0d0">
<table border="0" width="100%" cellpadding="12" cellspacing="8" style="height:100%">
<tr>
<td bgcolor="#ffffff" align="left" valign="top" width="200">
<table border="0" width="100%" cellpadding="0" cellspacing="0" align="left">
<tr>
<td valign="top">
<table border="0" width="100%" cellpadding="0" cellspacing="0" align="left">
<tr><td align="center"><i>Latest Release: <a href="https://sourceforge.net/projects/glew/files/glew/1.10.0/">1.10.0</a></i></td></tr>
<tr><td align="center"><br></td></tr>
<tr><td align="center"><img src="./glew.png" alt="GLEW Logo" width="97" height="75"></td></tr>
<tr><td align="center"><br></td></tr>
<tr><td align="center">
<table border="0" cellpadding="0" cellspacing="0" align="center">
<tr><td align="center"><a href="index.html">Download</a></td></tr>
<tr><td align="center"><a href="basic.html">Usage</a></td></tr>
<tr><td align="center"><a href="build.html">Building</a></td></tr>
<tr><td align="center"><a href="install.html">Installation</a></td></tr>
<tr><td align="center"><a href="advanced.html">Source Generation</a></td></tr>
<tr><td align="center"><a href="credits.html">Credits & Copyright</a></td></tr>
<tr><td align="center"><a href="log.html">Change Log</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/projects/glew">Project Page</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/p/glew/mailman">Mailing Lists</a></td></tr>
<tr><td align="center"><a href="https://sourceforge.net/p/glew/_list/tickets">Bug Tracker</a></td></tr>
</table>
<tr><td align="center"><br></tr>
</table>
</td>
</tr>
<tr>
<td valign="bottom">
<table border="0" width="100%" cellpadding="5" cellspacing="0" align="left">
<tr><td align="center"><i>Last Update: 07-22-13</i></td></tr>
<tr><td align="center">
<a href="http://www.opengl.org"> <img src="./ogl_sm.jpg" width="68"
height="35" border="0" alt="OpenGL Logo"></a>
<a href="http://sourceforge.net"> <img
src="http://sourceforge.net/sflogo.php?group_id=67586&amp;type=1"
width="88" height="31" border="0" alt="SourceForge Logo"></a>
</td>
</tr>
<!--- <tr><td align="center"><a
href="http://sourceforge.net/donate/index.php?group_id=67586"><img
src="http://images.sourceforge.net/images/project-support.jpg"
width="88" height="32" border="0" alt="Support This Project"></a></td></tr> -->
</table>
</td>
</tr>
</table>
</td>
<td bgcolor="#ffffff" align="left" valign="top">
<h1>The OpenGL Extension Wrangler Library</h1>
<!-- end header.html -->
<h2>Supported WGL Extensions</h2>
<table border="0" width="100%" cellpadding="1" cellspacing="0" align="center">
<tr><td class="num">1</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/3DFX/3dfx_multisample.txt">3DFX_multisample</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">2</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/3DL/stereo_control.txt">3DL_stereo_control</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">3</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/AMD/wgl_gpu_association.txt">AMD_gpu_association</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">4</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/wgl_buffer_region.txt">ARB_buffer_region</a></td></tr>
<tr><td class="num">5</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/ARB/wgl_create_context.txt">ARB_create_context</a></td></tr>
<tr><td class="num">6</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/wgl_create_context.txt">ARB_create_context_profile</a></td></tr>
<tr><td class="num">7</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/wgl_create_context_robustness.txt">ARB_create_context_robustness</a></td></tr>
<tr><td class="num">8</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/wgl_extensions_string.txt">ARB_extensions_string</a></td></tr>
<tr><td class="num">9</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/framebuffer_sRGB.txt">ARB_framebuffer_sRGB</a></td></tr>
<tr><td class="num">10</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/wgl_make_current_read.txt">ARB_make_current_read</a></td></tr>
<tr><td class="num">11</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/multisample.txt">ARB_multisample</a></td></tr>
<tr><td class="num">12</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/wgl_pbuffer.txt">ARB_pbuffer</a></td></tr>
<tr><td class="num">13</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/wgl_pixel_format.txt">ARB_pixel_format</a></td></tr>
<tr><td class="num">14</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/color_buffer_float.txt">ARB_pixel_format_float</a></td></tr>
<tr><td class="num">15</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/wgl_render_texture.txt">ARB_render_texture</a></td></tr>
<tr><td class="num">16</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/wgl_robustness_isolation.txt">ARB_robustness_application_isolation</a></td></tr>
<tr><td class="num">17</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ARB/wgl_robustness_isolation.txt">ARB_robustness_share_group_isolation</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">18</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/ATI/pixel_format_float.txt">ATI_pixel_format_float</a></td></tr>
<tr><td class="num">19</td><td>&nbsp;</td><td>ATI_render_texture_rectangle</td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">20</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/EXT/wgl_create_context_es2_profile.txt">EXT_create_context_es2_profile</a></td></tr>
<tr><td class="num">21</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/EXT/wgl_create_context_es_profile.txt">EXT_create_context_es_profile</a></td></tr>
<tr><td class="num">22</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/wgl_depth_float.txt">EXT_depth_float</a></td></tr>
<tr><td class="num">23</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/wgl_display_color_table.txt">EXT_display_color_table</a></td></tr>
<tr><td class="num">24</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/wgl_extensions_string.txt">EXT_extensions_string</a></td></tr>
<tr><td class="num">25</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_EXT_framebuffer_sRGB.txt">EXT_framebuffer_sRGB</a></td></tr>
<tr><td class="num">26</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/wgl_make_current_read.txt">EXT_make_current_read</a></td></tr>
<tr><td class="num">27</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/wgl_multisample.txt">EXT_multisample</a></td></tr>
<tr><td class="num">28</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/wgl_pbuffer.txt">EXT_pbuffer</a></td></tr>
<tr><td class="num">29</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/wgl_pixel_format.txt">EXT_pixel_format</a></td></tr>
<tr><td class="num">30</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/GL_EXT_packed_float.txt">EXT_pixel_format_packed_float</a></td></tr>
<tr><td class="num">31</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/wgl_swap_control.txt">EXT_swap_control</a></td></tr>
<tr><td class="num">32</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/EXT/wgl_swap_control_tear.txt">EXT_swap_control_tear</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">33</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/I3D/wgl_digital_video_control.txt">I3D_digital_video_control</a></td></tr>
<tr><td class="num">34</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/I3D/wgl_gamma.txt">I3D_gamma</a></td></tr>
<tr><td class="num">35</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/I3D/wgl_genlock.txt">I3D_genlock</a></td></tr>
<tr><td class="num">36</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/I3D/wgl_image_buffer.txt">I3D_image_buffer</a></td></tr>
<tr><td class="num">37</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/I3D/wgl_swap_frame_lock.txt">I3D_swap_frame_lock</a></td></tr>
<tr><td class="num">38</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/I3D/wgl_swap_frame_usage.txt">I3D_swap_frame_usage</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">39</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/DX_interop.txt">NV_DX_interop</a></td></tr>
<tr><td class="num">40</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/DX_interop2.txt">NV_DX_interop2</a></td></tr>
<tr><td class="num">41</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/copy_image.txt">NV_copy_image</a></td></tr>
<tr><td class="num">42</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/float_buffer.txt">NV_float_buffer</a></td></tr>
<tr><td class="num">43</td><td>&nbsp;</td><td><a href="http://developer.download.nvidia.com/opengl/specs/WGL_nv_gpu_affinity.txt">NV_gpu_affinity</a></td></tr>
<tr><td class="num">44</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/multisample_coverage.txt">NV_multisample_coverage</a></td></tr>
<tr><td class="num">45</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/present_video.txt">NV_present_video</a></td></tr>
<tr><td class="num">46</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/render_depth_texture.txt">NV_render_depth_texture</a></td></tr>
<tr><td class="num">47</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/render_texture_rectangle.txt">NV_render_texture_rectangle</a></td></tr>
<tr><td class="num">48</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/wgl_swap_group.txt">NV_swap_group</a></td></tr>
<tr><td class="num">49</td><td>&nbsp;</td><td><a href="http://oss.sgi.com/projects/ogl-sample/registry/NV/vertex_array_range.txt">NV_vertex_array_range</a></td></tr>
<tr><td class="num">50</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/video_capture.txt">NV_video_capture</a></td></tr>
<tr><td class="num">51</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/NV/wgl_video_output.txt">NV_video_output</a></td></tr>
<tr><td><br></td><td></td><td></td></tr>
<tr><td class="num">52</td><td>&nbsp;</td><td><a href="http://www.opengl.org/registry/specs/gl/OML/wgl_sync_control.txt">OML_sync_control</a></td></tr>
</table>
<!-- begin footer.html -->
</td></tr></table></body>
<!-- end footer.html -->

18062
interface/external/glew/include/GL/glew.h vendored Normal file

File diff suppressed because it is too large Load diff

1669
interface/external/glew/include/GL/glxew.h vendored Normal file

File diff suppressed because it is too large Load diff

1421
interface/external/glew/include/GL/wglew.h vendored Normal file

File diff suppressed because it is too large Load diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,189 @@
/*
* Module: sched.h
*
* Purpose:
* Provides an implementation of POSIX realtime extensions
* as defined in
*
* POSIX 1003.1b-1993 (POSIX.1b)
*
* --------------------------------------------------------------------------
*
* Pthreads-win32 - POSIX Threads Library for Win32
* Copyright(C) 1998 John E. Bossom
* Copyright(C) 1999,2005 Pthreads-win32 contributors
*
* Contact Email: rpj@callisto.canberra.edu.au
*
* The current list of contributors is contained
* in the file CONTRIBUTORS included with the source
* code distribution. The list can also be seen at the
* following World Wide Web location:
* http://sources.redhat.com/pthreads-win32/contributors.html
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library in the file COPYING.LIB;
* if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(_SCHED_H)
#define _SCHED_H
#undef PTW32_SCHED_LEVEL
#if defined(_POSIX_SOURCE)
#define PTW32_SCHED_LEVEL 0
/* Early POSIX */
#endif
#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309
#undef PTW32_SCHED_LEVEL
#define PTW32_SCHED_LEVEL 1
/* Include 1b, 1c and 1d */
#endif
#if defined(INCLUDE_NP)
#undef PTW32_SCHED_LEVEL
#define PTW32_SCHED_LEVEL 2
/* Include Non-Portable extensions */
#endif
#define PTW32_SCHED_LEVEL_MAX 3
#if ( defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112 ) || !defined(PTW32_SCHED_LEVEL)
#define PTW32_SCHED_LEVEL PTW32_SCHED_LEVEL_MAX
/* Include everything */
#endif
#if defined(__GNUC__) && !defined(__declspec)
# error Please upgrade your GNU compiler to one that supports __declspec.
#endif
/*
* When building the library, you should define PTW32_BUILD so that
* the variables/functions are exported correctly. When using the library,
* do NOT define PTW32_BUILD, and then the variables/functions will
* be imported correctly.
*/
#if !defined(PTW32_STATIC_LIB)
# if defined(PTW32_BUILD)
# define PTW32_DLLPORT __declspec (dllexport)
# else
# define PTW32_DLLPORT __declspec (dllimport)
# endif
#else
# define PTW32_DLLPORT
#endif
/*
* This is a duplicate of what is in the autoconf config.h,
* which is only used when building the pthread-win32 libraries.
*/
#if !defined(PTW32_CONFIG_H)
# if defined(WINCE)
# define NEED_ERRNO
# define NEED_SEM
# endif
# if defined(__MINGW64__)
# define HAVE_STRUCT_TIMESPEC
# define HAVE_MODE_T
# elif defined(_UWIN) || defined(__MINGW32__)
# define HAVE_MODE_T
# endif
#endif
/*
*
*/
#if PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX
#if defined(NEED_ERRNO)
#include "need_errno.h"
#else
#include <errno.h>
#endif
#endif /* PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX */
#if (defined(__MINGW64__) || defined(__MINGW32__)) || defined(_UWIN)
# if PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX
/* For pid_t */
# include <sys/types.h>
/* Required by Unix 98 */
# include <time.h>
# else
typedef int pid_t;
# endif
#else
/* [i_a] fix for using pthread_win32 with mongoose code, which #define's its own pid_t akin to typedef HANDLE pid_t; */
#undef pid_t
# if defined(_MSC_VER)
typedef void *pid_t;
# else
typedef int pid_t;
# endif
#endif
/* Thread scheduling policies */
enum {
SCHED_OTHER = 0,
SCHED_FIFO,
SCHED_RR,
SCHED_MIN = SCHED_OTHER,
SCHED_MAX = SCHED_RR
};
struct sched_param {
int sched_priority;
};
#if defined(__cplusplus)
extern "C"
{
#endif /* __cplusplus */
PTW32_DLLPORT int __cdecl sched_yield (void);
PTW32_DLLPORT int __cdecl sched_get_priority_min (int policy);
PTW32_DLLPORT int __cdecl sched_get_priority_max (int policy);
PTW32_DLLPORT int __cdecl sched_setscheduler (pid_t pid, int policy);
PTW32_DLLPORT int __cdecl sched_getscheduler (pid_t pid);
/*
* Note that this macro returns ENOTSUP rather than
* ENOSYS as might be expected. However, returning ENOSYS
* should mean that sched_get_priority_{min,max} are
* not implemented as well as sched_rr_get_interval.
* This is not the case, since we just don't support
* round-robin scheduling. Therefore I have chosen to
* return the same value as sched_setscheduler when
* SCHED_RR is passed to it.
*/
#define sched_rr_get_interval(_pid, _interval) \
( errno = ENOTSUP, (int) -1 )
#if defined(__cplusplus)
} /* End of extern "C" */
#endif /* __cplusplus */
#undef PTW32_SCHED_LEVEL
#undef PTW32_SCHED_LEVEL_MAX
#endif /* !_SCHED_H */

View file

@ -5,10 +5,16 @@
// Created by Andrzej Kapolka on 5/10/13.
// Copyright (c) 2013 High Fidelity, Inc. All rights reserved.
#ifdef WIN32
#include <Systime.h>
#endif
#include <sstream>
#include <stdlib.h>
#include <cmath>
#include <math.h>
#include <glm/gtx/component_wise.hpp>
#include <glm/gtx/quaternion.hpp>
@ -125,7 +131,6 @@ Application::Application(int& argc, char** argv, timeval &startup_time) :
_lookingAwayFromOrigin(true),
_lookatTargetAvatar(NULL),
_lookatIndicatorScale(1.0f),
_perfStatsOn(false),
_chatEntryOn(false),
_audio(&_audioScope, STARTUP_JITTER_SAMPLES),
_enableProcessVoxelsThread(true),
@ -165,7 +170,7 @@ Application::Application(int& argc, char** argv, timeval &startup_time) :
}
NodeList* nodeList = NodeList::createInstance(NODE_TYPE_AGENT, listenPort);
// connect our processDatagrams slot to the QUDPSocket readyRead() signal
connect(&nodeList->getNodeSocket(), SIGNAL(readyRead()), SLOT(processDatagrams()));
@ -176,7 +181,7 @@ Application::Application(int& argc, char** argv, timeval &startup_time) :
connect(audioThread, SIGNAL(started()), &_audio, SLOT(start()));
audioThread->start();
connect(nodeList, SIGNAL(domainChanged(const QString&)), SLOT(domainChanged(const QString&)));
connect(nodeList, SIGNAL(nodeKilled(SharedNodePointer)), SLOT(nodeKilled(SharedNodePointer)));
@ -209,7 +214,7 @@ Application::Application(int& argc, char** argv, timeval &startup_time) :
#endif
// tell the NodeList instance who to tell the domain server we care about
const char nodeTypesOfInterest[] = {NODE_TYPE_AUDIO_MIXER, NODE_TYPE_AVATAR_MIXER, NODE_TYPE_VOXEL_SERVER,
const char nodeTypesOfInterest[] = {NODE_TYPE_AUDIO_MIXER, NODE_TYPE_AVATAR_MIXER, NODE_TYPE_VOXEL_SERVER,
NODE_TYPE_PARTICLE_SERVER, NODE_TYPE_METAVOXEL_SERVER};
nodeList->setNodeTypesOfInterest(nodeTypesOfInterest, sizeof(nodeTypesOfInterest));
@ -316,11 +321,21 @@ void Application::initializeGL() {
glutInit(&argc, 0);
#endif
#ifdef WIN32
GLenum err = glewInit();
if (GLEW_OK != err) {
/* Problem: glewInit failed, something is seriously wrong. */
qDebug("Error: %s\n", glewGetErrorString(err));
}
qDebug("Status: Using GLEW %s\n", glewGetString(GLEW_VERSION));
#endif
// Before we render anything, let's set up our viewFrustumOffsetCamera with a sufficiently large
// field of view and near and far clip to make it interesting.
//viewFrustumOffsetCamera.setFieldOfView(90.0);
_viewFrustumOffsetCamera.setNearClip(0.1);
_viewFrustumOffsetCamera.setFarClip(500.0 * TREE_SCALE);
_viewFrustumOffsetCamera.setNearClip(0.1f);
_viewFrustumOffsetCamera.setFarClip(500.0f * TREE_SCALE);
initDisplay();
qDebug( "Initialized Display.");
@ -1310,7 +1325,7 @@ void Application::sendAvatarFaceVideoMessage(int frameCount, const QByteArray& d
getInstance()->controlledBroadcastToNodes(packet, headerSize + payloadSize, &NODE_TYPE_AVATAR_MIXER, 1);
*offsetPosition += payloadSize;
} while (*offsetPosition < data.size());
} while (*offsetPosition < (uint32_t)data.size());
}
// Every second, check the frame rates and other stuff
@ -1355,6 +1370,7 @@ static glm::vec3 getFaceVector(BoxFace face) {
case MIN_Z_FACE:
return glm::vec3(0, 0, -1);
default: // quiet windows warnings
case MAX_Z_FACE:
return glm::vec3(0, 0, 1);
}
@ -1417,8 +1433,10 @@ void Application::terminate() {
_voxelHideShowThread.terminate();
_voxelEditSender.terminate();
_particleEditSender.terminate();
_persistThread->terminate();
_persistThread = NULL;
if (_persistThread) {
_persistThread->terminate();
_persistThread = NULL;
}
}
static Avatar* processAvatarMessageHeader(unsigned char*& packetData, size_t& dataBytes) {
@ -1946,7 +1964,7 @@ void Application::shrinkMirrorView() {
const float MAX_AVATAR_EDIT_VELOCITY = 1.0f;
const float MAX_VOXEL_EDIT_DISTANCE = 50.0f;
const float HEAD_SPHERE_RADIUS = 0.07;
const float HEAD_SPHERE_RADIUS = 0.07f;
static QUuid DEFAULT_NODE_ID_REF;
@ -1967,12 +1985,12 @@ Avatar* Application::findLookatTargetAvatar(const glm::vec3& mouseRayOrigin, con
if (node->getLinkedData() != NULL && node->getType() == NODE_TYPE_AGENT) {
Avatar* avatar = (Avatar*)node->getLinkedData();
float distance;
if (avatar->findRayIntersection(mouseRayOrigin, mouseRayDirection, distance)) {
// rescale to compensate for head embiggening
eyePosition = (avatar->getHead().calculateAverageEyePosition() - avatar->getHead().getScalePivot()) *
(avatar->getScale() / avatar->getHead().getScale()) + avatar->getHead().getScalePivot();
_lookatIndicatorScale = avatar->getHead().getScale();
_lookatOtherPosition = avatar->getHead().getPosition();
nodeUUID = avatar->getOwningNode()->getUUID();
@ -1980,7 +1998,7 @@ Avatar* Application::findLookatTargetAvatar(const glm::vec3& mouseRayOrigin, con
}
}
}
return NULL;
}
@ -2022,7 +2040,7 @@ void Application::renderHighlightVoxel(VoxelDetail voxel) {
void Application::updateAvatars(float deltaTime, glm::vec3 mouseRayOrigin, glm::vec3 mouseRayDirection) {
bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings);
PerformanceWarning warn(showWarnings, "Application::updateAvatars()");
foreach (const SharedNodePointer& node, NodeList::getInstance()->getNodeHash()) {
QMutexLocker(&node->getMutex());
if (node->getLinkedData()) {
@ -2039,11 +2057,11 @@ void Application::updateAvatars(float deltaTime, glm::vec3 mouseRayOrigin, glm::
for (vector<Avatar*>::iterator fade = _avatarFades.begin(); fade != _avatarFades.end(); fade++) {
Avatar* avatar = *fade;
const float SHRINK_RATE = 0.9f;
avatar->setTargetScale(avatar->getScale() * SHRINK_RATE);
const float MIN_FADE_SCALE = 0.001;
const float MIN_FADE_SCALE = 0.001f;
if (avatar->getTargetScale() < MIN_FADE_SCALE) {
delete avatar;
_avatarFades.erase(fade--);
@ -2261,6 +2279,7 @@ void Application::updateMouseVoxels(float deltaTime, glm::vec3& mouseRayOrigin,
}
}
void Application::updateHandAndTouch(float deltaTime) {
bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings);
PerformanceWarning warn(showWarnings, "Application::updateHandAndTouch()");
@ -2304,7 +2323,9 @@ void Application::updateThreads(float deltaTime) {
_voxelHideShowThread.threadRoutine();
_voxelEditSender.threadRoutine();
_particleEditSender.threadRoutine();
_persistThread->threadRoutine();
if (_persistThread) {
_persistThread->threadRoutine();
}
}
}
@ -2614,32 +2635,32 @@ void Application::queryOctree(NODE_TYPE serverType, PACKET_TYPE packetType, Node
int totalServers = 0;
int inViewServers = 0;
int unknownJurisdictionServers = 0;
foreach (const SharedNodePointer& node, NodeList::getInstance()->getNodeHash()) {
// only send to the NodeTypes that are serverType
if (node->getActiveSocket() != NULL && node->getType() == serverType) {
totalServers++;
// get the server bounds for this server
QUuid nodeUUID = node->getUUID();
// if we haven't heard from this voxel server, go ahead and send it a query, so we
// can get the jurisdiction...
if (jurisdictions.find(nodeUUID) == jurisdictions.end()) {
unknownJurisdictionServers++;
} else {
const JurisdictionMap& map = (jurisdictions)[nodeUUID];
unsigned char* rootCode = map.getRootOctalCode();
if (rootCode) {
VoxelPositionSize rootDetails;
voxelDetailsForCode(rootCode, rootDetails);
AABox serverBounds(glm::vec3(rootDetails.x, rootDetails.y, rootDetails.z), rootDetails.s);
serverBounds.scale(TREE_SCALE);
ViewFrustum::location serverFrustumLocation = _viewFrustum.boxInFrustum(serverBounds);
if (serverFrustumLocation != ViewFrustum::OUTSIDE) {
inViewServers++;
}
@ -2672,20 +2693,20 @@ void Application::queryOctree(NODE_TYPE serverType, PACKET_TYPE packetType, Node
if (wantExtraDebugging && unknownJurisdictionServers > 0) {
qDebug("perServerPPS: %d perUnknownServer: %d", perServerPPS, perUnknownServer);
}
NodeList* nodeList = NodeList::getInstance();
foreach (const SharedNodePointer& node, nodeList->getNodeHash()) {
// only send to the NodeTypes that are serverType
if (node->getActiveSocket() != NULL && node->getType() == serverType) {
// get the server bounds for this server
QUuid nodeUUID = node->getUUID();
bool inView = false;
bool unknownView = false;
// if we haven't heard from this voxel server, go ahead and send it a query, so we
// can get the jurisdiction...
if (jurisdictions.find(nodeUUID) == jurisdictions.end()) {
@ -2695,15 +2716,15 @@ void Application::queryOctree(NODE_TYPE serverType, PACKET_TYPE packetType, Node
}
} else {
const JurisdictionMap& map = (jurisdictions)[nodeUUID];
unsigned char* rootCode = map.getRootOctalCode();
if (rootCode) {
VoxelPositionSize rootDetails;
voxelDetailsForCode(rootCode, rootDetails);
AABox serverBounds(glm::vec3(rootDetails.x, rootDetails.y, rootDetails.z), rootDetails.s);
serverBounds.scale(TREE_SCALE);
ViewFrustum::location serverFrustumLocation = _viewFrustum.boxInFrustum(serverBounds);
if (serverFrustumLocation != ViewFrustum::OUTSIDE) {
inView = true;
@ -2716,7 +2737,7 @@ void Application::queryOctree(NODE_TYPE serverType, PACKET_TYPE packetType, Node
}
}
}
if (inView) {
_voxelQuery.setMaxOctreePacketsPerSecond(perServerPPS);
} else if (unknownView) {
@ -2724,7 +2745,7 @@ void Application::queryOctree(NODE_TYPE serverType, PACKET_TYPE packetType, Node
qDebug() << "no known jurisdiction for node " << *node << ", give it budget of "
<< perUnknownServer << " to send us jurisdiction.";
}
// set the query's position/orientation to be degenerate in a manner that will get the scene quickly
// If there's only one server, then don't do this, and just let the normal voxel query pass through
// as expected... this way, we will actually get a valid scene if there is one to be seen
@ -2732,8 +2753,8 @@ void Application::queryOctree(NODE_TYPE serverType, PACKET_TYPE packetType, Node
_voxelQuery.setCameraPosition(glm::vec3(-0.1,-0.1,-0.1));
const glm::quat OFF_IN_NEGATIVE_SPACE = glm::quat(-0.5, 0, -0.5, 1.0);
_voxelQuery.setCameraOrientation(OFF_IN_NEGATIVE_SPACE);
_voxelQuery.setCameraNearClip(0.1);
_voxelQuery.setCameraFarClip(0.1);
_voxelQuery.setCameraNearClip(0.1f);
_voxelQuery.setCameraFarClip(0.1f);
if (wantExtraDebugging) {
qDebug() << "Using 'minimal' camera position for node" << *node;
}
@ -2748,24 +2769,24 @@ void Application::queryOctree(NODE_TYPE serverType, PACKET_TYPE packetType, Node
}
// set up the packet for sending...
unsigned char* endOfVoxelQueryPacket = voxelQueryPacket;
// insert packet type/version and node UUID
endOfVoxelQueryPacket += populateTypeAndVersion(endOfVoxelQueryPacket, packetType);
QByteArray ownerUUID = nodeList->getOwnerUUID().toRfc4122();
memcpy(endOfVoxelQueryPacket, ownerUUID.constData(), ownerUUID.size());
endOfVoxelQueryPacket += ownerUUID.size();
// encode the query data...
endOfVoxelQueryPacket += _voxelQuery.getBroadcastData(endOfVoxelQueryPacket);
int packetLength = endOfVoxelQueryPacket - voxelQueryPacket;
// make sure we still have an active socket
if (node->getActiveSocket()) {
nodeList->getNodeSocket().writeDatagram((char*) voxelQueryPacket, packetLength,
node->getActiveSocket()->getAddress(), node->getActiveSocket()->getPort());
}
// Feed number of bytes to corresponding channel of the bandwidth meter
_bandwidthMeter.outputStream(BandwidthMeter::VOXELS).updateValue(packetLength);
}
@ -2891,9 +2912,9 @@ void Application::setupWorldLight() {
glm::vec3 sunDirection = getSunDirection();
GLfloat light_position0[] = { sunDirection.x, sunDirection.y, sunDirection.z, 0.0 };
glLightfv(GL_LIGHT0, GL_POSITION, light_position0);
GLfloat ambient_color[] = { 0.7, 0.7, 0.8 };
GLfloat ambient_color[] = { 0.7f, 0.7f, 0.8f };
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient_color);
GLfloat diffuse_color[] = { 0.8, 0.7, 0.7 };
GLfloat diffuse_color[] = { 0.8f, 0.7f, 0.7f };
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse_color);
glLightfv(GL_LIGHT0, GL_SPECULAR, WHITE_SPECULAR_COLOR);
@ -3154,10 +3175,10 @@ void Application::loadTranslatedViewMatrix(const glm::vec3& translation) {
translation.z + _viewMatrixTranslation.z);
}
void Application::computeOffAxisFrustum(float& left, float& right, float& bottom, float& top, float& near,
float& far, glm::vec4& nearClipPlane, glm::vec4& farClipPlane) const {
void Application::computeOffAxisFrustum(float& left, float& right, float& bottom, float& top, float& nearVal,
float& farVal, glm::vec4& nearClipPlane, glm::vec4& farClipPlane) const {
_viewFrustum.computeOffAxisFrustum(left, right, bottom, top, near, far, nearClipPlane, farClipPlane);
_viewFrustum.computeOffAxisFrustum(left, right, bottom, top, nearVal, farVal, nearClipPlane, farClipPlane);
}
void Application::displayOverlay() {
@ -3245,13 +3266,13 @@ void Application::displayOverlay() {
char nodes[100];
int totalAvatars = 0, totalServers = 0;
foreach (const SharedNodePointer& node, NodeList::getInstance()->getNodeHash()) {
node->getType() == NODE_TYPE_AGENT ? totalAvatars++ : totalServers++;
}
sprintf(nodes, "Servers: %d, Avatars: %d\n", totalServers, totalAvatars);
drawtext(_glWidget->width() - 150, 20, 0.10, 0, 1.0, 0, nodes, 1, 0, 0);
drawtext(_glWidget->width() - 150, 20, 0.10f, 0, 1.0f, 0, nodes, 1, 0, 0);
}
// testing rendering coverage map
@ -3273,8 +3294,8 @@ void Application::displayOverlay() {
char frameTimer[10];
uint64_t mSecsNow = floor(usecTimestampNow() / 1000.0 + 0.5);
sprintf(frameTimer, "%d\n", (int)(mSecsNow % 1000));
drawtext(_glWidget->width() - 100, _glWidget->height() - 20, 0.30, 0, 1.0, 0, frameTimer, 0, 0, 0);
drawtext(_glWidget->width() - 102, _glWidget->height() - 22, 0.30, 0, 1.0, 0, frameTimer, 1, 1, 1);
drawtext(_glWidget->width() - 100, _glWidget->height() - 20, 0.30f, 0, 1.0f, 0, frameTimer, 0, 0, 0);
drawtext(_glWidget->width() - 102, _glWidget->height() - 22, 0.30f, 0, 1.0f, 0, frameTimer, 1, 1, 1);
}
@ -3336,6 +3357,7 @@ void Application::displayOverlay() {
glPopMatrix();
}
void Application::displayStats() {
int statsVerticalOffset = 8;
const int PELS_PER_LINE = 15;
@ -3359,7 +3381,7 @@ void Application::displayStats() {
// Now handle voxel servers, since there could be more than one, we average their ping times
unsigned long totalPingVoxel = 0;
int voxelServerCount = 0;
foreach (const SharedNodePointer& node, nodeList->getNodeHash()) {
if (node->getType() == NODE_TYPE_VOXEL_SERVER) {
totalPingVoxel += node->getPingMs();
@ -3369,7 +3391,7 @@ void Application::displayStats() {
}
}
}
if (voxelServerCount) {
pingVoxel = totalPingVoxel/voxelServerCount;
}
@ -3517,20 +3539,6 @@ void Application::displayStats() {
}
statsVerticalOffset += PELS_PER_LINE;
drawtext(10, statsVerticalOffset, 0.10f, 0, 1.0, 0, (char*)voxelStats.str().c_str());
if (_perfStatsOn) {
// Get the PerfStats group details. We need to allocate and array of char* long enough to hold 1+groups
char** perfStatLinesArray = new char*[PerfStat::getGroupCount()+1];
int lines = PerfStat::DumpStats(perfStatLinesArray);
for (int line=0; line < lines; line++) {
statsVerticalOffset += PELS_PER_LINE;
drawtext(10, statsVerticalOffset, 0.10f, 0, 1.0, 0, perfStatLinesArray[line]);
delete perfStatLinesArray[line]; // we're responsible for cleanup
perfStatLinesArray[line]=NULL;
}
delete []perfStatLinesArray; // we're responsible for cleanup
}
}
void Application::renderThrustAtVoxel(const glm::vec3& thrust) {
@ -3705,10 +3713,10 @@ void Application::renderAvatars(bool forceRenderHead, bool selfAvatarOnly) {
if (!selfAvatarOnly) {
// Render avatars of other nodes
NodeList* nodeList = NodeList::getInstance();
foreach (const SharedNodePointer& node, nodeList->getNodeHash()) {
QMutexLocker(&node->getMutex());
if (node->getLinkedData() != NULL && node->getType() == NODE_TYPE_AGENT) {
Avatar *avatar = (Avatar *)node->getLinkedData();
if (!avatar->isInitialized()) {
@ -4056,7 +4064,7 @@ void Application::nodeKilled(SharedNodePointer node) {
if (!Menu::getInstance()->isOptionChecked(MenuOption::DontFadeOnVoxelServerChanges)) {
VoxelFade fade(VoxelFade::FADE_OUT, NODE_KILLED_RED, NODE_KILLED_GREEN, NODE_KILLED_BLUE);
fade.voxelDetails = rootDetails;
const float slightly_smaller = 0.99;
const float slightly_smaller = 0.99f;
fade.voxelDetails.s = fade.voxelDetails.s * slightly_smaller;
_voxelFades.push_back(fade);
}
@ -4087,7 +4095,7 @@ void Application::nodeKilled(SharedNodePointer node) {
if (!Menu::getInstance()->isOptionChecked(MenuOption::DontFadeOnVoxelServerChanges)) {
VoxelFade fade(VoxelFade::FADE_OUT, NODE_KILLED_RED, NODE_KILLED_GREEN, NODE_KILLED_BLUE);
fade.voxelDetails = rootDetails;
const float slightly_smaller = 0.99;
const float slightly_smaller = 0.99f;
fade.voxelDetails.s = fade.voxelDetails.s * slightly_smaller;
_voxelFades.push_back(fade);
}
@ -4177,7 +4185,7 @@ int Application::parseOctreeStats(unsigned char* messageData, ssize_t messageLen
if (!Menu::getInstance()->isOptionChecked(MenuOption::DontFadeOnVoxelServerChanges)) {
VoxelFade fade(VoxelFade::FADE_OUT, NODE_ADDED_RED, NODE_ADDED_GREEN, NODE_ADDED_BLUE);
fade.voxelDetails = rootDetails;
const float slightly_smaller = 0.99;
const float slightly_smaller = 0.99f;
fade.voxelDetails.s = fade.voxelDetails.s * slightly_smaller;
_voxelFades.push_back(fade);
}
@ -4206,28 +4214,28 @@ void Application::processDatagrams() {
MAX_PACKET_SIZE,
senderSockAddr.getAddressPointer(),
senderSockAddr.getPortPointer()))) {
_packetCount++;
_bytesCount += bytesReceived;
if (packetVersionMatch(_incomingPacket)) {
// only process this packet if we have a match on the packet version
switch (_incomingPacket[0]) {
case PACKET_TYPE_TRANSMITTER_DATA_V2:
// V2 = IOS transmitter app
_myTransmitter.processIncomingData(_incomingPacket, bytesReceived);
break;
case PACKET_TYPE_MIXED_AUDIO:
QMetaObject::invokeMethod(&_audio, "addReceivedAudioToBuffer", Qt::QueuedConnection,
Q_ARG(QByteArray, QByteArray((char*) _incomingPacket, bytesReceived)));
break;
case PACKET_TYPE_PARTICLE_ADD_RESPONSE:
// look up our ParticleEditHanders....
ParticleEditHandle::handleAddResponse(_incomingPacket, bytesReceived);
break;
case PACKET_TYPE_PARTICLE_DATA:
case PACKET_TYPE_VOXEL_DATA:
case PACKET_TYPE_VOXEL_ERASE:
@ -4235,7 +4243,7 @@ void Application::processDatagrams() {
case PACKET_TYPE_ENVIRONMENT_DATA: {
PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings),
"Application::networkReceive()... _voxelProcessor.queueReceivedPacket()");
bool wantExtraDebugging = getLogger()->extraDebugging();
if (wantExtraDebugging && _incomingPacket[0] == PACKET_TYPE_VOXEL_DATA) {
int numBytesPacketHeader = numBytesForPacketHeader(_incomingPacket);
@ -4247,10 +4255,10 @@ void Application::processDatagrams() {
dataAt += sizeof(VOXEL_PACKET_SENT_TIME);
VOXEL_PACKET_SENT_TIME arrivedAt = usecTimestampNow();
int flightTime = arrivedAt - sentAt;
printf("got PACKET_TYPE_VOXEL_DATA, sequence:%d flightTime:%d\n", sequence, flightTime);
}
// add this packet to our list of voxel packets and process them on the voxel processing
_voxelProcessor.queueReceivedPacket(senderSockAddr, _incomingPacket, bytesReceived);
break;
@ -4393,10 +4401,13 @@ void Application::updateLocalOctreeCache(bool firstTime) {
QString localVoxelCacheFileName = getLocalVoxelCacheFileName();
const int LOCAL_CACHE_PERSIST_INTERVAL = 1000 * 10; // every 10 seconds
_persistThread = new OctreePersistThread(_voxels.getTree(),
localVoxelCacheFileName.toLocal8Bit().constData(),LOCAL_CACHE_PERSIST_INTERVAL);
qDebug() << "updateLocalOctreeCache()... localVoxelCacheFileName=" << localVoxelCacheFileName;
if (!Menu::getInstance()->isOptionChecked(MenuOption::DisableLocalVoxelCache)) {
_persistThread = new OctreePersistThread(_voxels.getTree(),
localVoxelCacheFileName.toLocal8Bit().constData(),LOCAL_CACHE_PERSIST_INTERVAL);
qDebug() << "updateLocalOctreeCache()... localVoxelCacheFileName=" << localVoxelCacheFileName;
}
if (_persistThread) {
_voxels.beginLoadingLocalVoxelCache(); // while local voxels are importing, don't do individual node VBO updates

View file

@ -10,7 +10,6 @@
#define __interface__Application__
#include <map>
#include <pthread.h>
#include <time.h>
#include <QApplication>
@ -28,9 +27,7 @@
#include <ScriptEngine.h>
#include <VoxelQuery.h>
#ifndef _WIN32
#include "Audio.h"
#endif
#include "BandwidthMeter.h"
#include "Camera.h"
@ -189,10 +186,10 @@ public:
const glm::mat4& getShadowMatrix() const { return _shadowMatrix; }
/// Computes the off-axis frustum parameters for the view frustum, taking mirroring into account.
void computeOffAxisFrustum(float& left, float& right, float& bottom, float& top, float& near,
float& far, glm::vec4& nearClipPlane, glm::vec4& farClipPlane) const;
void computeOffAxisFrustum(float& left, float& right, float& bottom, float& top, float& nearVal,
float& farVal, glm::vec4& nearClipPlane, glm::vec4& farClipPlane) const;
virtual void packetSentNotification(ssize_t length);
VoxelShader& getVoxelShader() { return _voxelShader; }
@ -211,9 +208,9 @@ public:
public slots:
void domainChanged(const QString& domainHostname);
void nodeKilled(SharedNodePointer node);
void processDatagrams();
void sendAvatarFaceVideoMessage(int frameCount, const QByteArray& data);
void exportVoxels();
void importVoxels();
@ -445,8 +442,6 @@ private:
glm::vec3 _transmitterPickStart;
glm::vec3 _transmitterPickEnd;
bool _perfStatsOn; // Do we want to display perfStats?
ChatEntry _chatEntry; // chat entry field
bool _chatEntryOn; // Whether to show the chat entry
@ -458,9 +453,7 @@ private:
VoxelShader _voxelShader;
PointShader _pointShader;
#ifndef _WIN32
Audio _audio;
#endif
bool _enableProcessVoxelsThread;
VoxelPacketProcessor _voxelProcessor;

View file

@ -9,6 +9,8 @@
#include <cstring>
#include <sys/stat.h>
#include <math.h>
#ifdef __APPLE__
#include <CoreAudio/AudioHardware.h>
#endif
@ -96,26 +98,26 @@ QAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode) {
kAudioObjectPropertyScopeGlobal,
kAudioObjectPropertyElementMaster
};
if (mode == QAudio::AudioOutput) {
propertyAddress.mSelector = kAudioHardwarePropertyDefaultOutputDevice;
}
OSStatus getPropertyError = AudioObjectGetPropertyData(kAudioObjectSystemObject,
&propertyAddress,
0,
NULL,
&propertySize,
&defaultDeviceID);
if (!getPropertyError && propertySize) {
CFStringRef deviceName = NULL;
propertySize = sizeof(deviceName);
propertyAddress.mSelector = kAudioDevicePropertyDeviceNameCFString;
getPropertyError = AudioObjectGetPropertyData(defaultDeviceID, &propertyAddress, 0,
NULL, &propertySize, &deviceName);
if (!getPropertyError && propertySize) {
// find a device in the list that matches the name we have and return it
foreach(QAudioDeviceInfo audioDevice, QAudioDeviceInfo::availableDevices(mode)) {
@ -127,7 +129,7 @@ QAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode) {
}
}
#endif
// fallback for failed lookup is the default device
return (mode == QAudio::AudioInput) ? QAudioDeviceInfo::defaultInputDevice() : QAudioDeviceInfo::defaultOutputDevice();
}
@ -142,24 +144,24 @@ bool adjustedFormatForAudioDevice(const QAudioDeviceInfo& audioDevice,
if (desiredAudioFormat.channelCount() == 1) {
adjustedAudioFormat = desiredAudioFormat;
adjustedAudioFormat.setChannelCount(2);
if (audioDevice.isFormatSupported(adjustedAudioFormat)) {
return true;
} else {
adjustedAudioFormat.setChannelCount(1);
}
}
if (audioDevice.supportedSampleRates().contains(SAMPLE_RATE * 2)) {
// use 48, which is a sample downsample, upsample
adjustedAudioFormat = desiredAudioFormat;
adjustedAudioFormat.setSampleRate(SAMPLE_RATE * 2);
// return the nearest in case it needs 2 channels
adjustedAudioFormat = audioDevice.nearestFormat(adjustedAudioFormat);
return true;
}
return false;
} else {
// set the adjustedAudioFormat to the desiredAudioFormat, since it will work
@ -176,16 +178,16 @@ void linearResampling(int16_t* sourceSamples, int16_t* destinationSamples,
} else {
float sourceToDestinationFactor = (sourceAudioFormat.sampleRate() / (float) destinationAudioFormat.sampleRate())
* (sourceAudioFormat.channelCount() / (float) destinationAudioFormat.channelCount());
// take into account the number of channels in source and destination
// accomodate for the case where have an output with > 2 channels
// this is the case with our HDMI capture
if (sourceToDestinationFactor >= 2) {
// we need to downsample from 48 to 24
// for now this only supports a mono output - this would be the case for audio input
for (int i = sourceAudioFormat.channelCount(); i < numSourceSamples; i += 2 * sourceAudioFormat.channelCount()) {
for (unsigned int i = sourceAudioFormat.channelCount(); i < numSourceSamples; i += 2 * sourceAudioFormat.channelCount()) {
if (i + (sourceAudioFormat.channelCount()) >= numSourceSamples) {
destinationSamples[(i - sourceAudioFormat.channelCount()) / (int) sourceToDestinationFactor] =
(sourceSamples[i - sourceAudioFormat.channelCount()] / 2)
@ -197,7 +199,7 @@ void linearResampling(int16_t* sourceSamples, int16_t* destinationSamples,
+ (sourceSamples[i + sourceAudioFormat.channelCount()] / 4);
}
}
} else {
// upsample from 24 to 48
// for now this only supports a stereo to stereo conversion - this is our case for network audio to output
@ -205,12 +207,12 @@ void linearResampling(int16_t* sourceSamples, int16_t* destinationSamples,
int dtsSampleRateFactor = (destinationAudioFormat.sampleRate() / sourceAudioFormat.sampleRate());
int sampleShift = destinationAudioFormat.channelCount() * dtsSampleRateFactor;
int destinationToSourceFactor = (1 / sourceToDestinationFactor);
for (int i = 0; i < numDestinationSamples; i += sampleShift) {
for (unsigned int i = 0; i < numDestinationSamples; i += sampleShift) {
sourceIndex = (i / destinationToSourceFactor);
// fill the L/R channels and make the rest silent
for (int j = i; j < i + sampleShift; j++) {
for (unsigned int j = i; j < i + sampleShift; j++) {
if (j % destinationAudioFormat.channelCount() == 0) {
// left channel
destinationSamples[j] = sourceSamples[sourceIndex];
@ -230,7 +232,7 @@ void linearResampling(int16_t* sourceSamples, int16_t* destinationSamples,
const int CALLBACK_ACCELERATOR_RATIO = 2;
void Audio::start() {
// set up the desired audio format
_desiredInputFormat.setSampleRate(SAMPLE_RATE);
_desiredInputFormat.setSampleSize(16);
@ -238,12 +240,11 @@ void Audio::start() {
_desiredInputFormat.setSampleType(QAudioFormat::SignedInt);
_desiredInputFormat.setByteOrder(QAudioFormat::LittleEndian);
_desiredInputFormat.setChannelCount(1);
_desiredOutputFormat = _desiredInputFormat;
_desiredOutputFormat.setChannelCount(2);
QAudioDeviceInfo inputDeviceInfo = defaultAudioDeviceForMode(QAudio::AudioInput);
qDebug() << "The audio input device is" << inputDeviceInfo.deviceName();
if (adjustedFormatForAudioDevice(inputDeviceInfo, _desiredInputFormat, _inputFormat)) {
@ -254,9 +255,8 @@ void Audio::start() {
* (_inputFormat.sampleRate() / SAMPLE_RATE)
/ CALLBACK_ACCELERATOR_RATIO;
_audioInput->setBufferSize(_numInputCallbackBytes);
QAudioDeviceInfo outputDeviceInfo = defaultAudioDeviceForMode(QAudio::AudioOutput);
qDebug() << "The audio output device is" << outputDeviceInfo.deviceName();
if (adjustedFormatForAudioDevice(outputDeviceInfo, _desiredOutputFormat, _outputFormat)) {
@ -265,17 +265,17 @@ void Audio::start() {
_inputRingBuffer.resizeForFrameSize(_numInputCallbackBytes * CALLBACK_ACCELERATOR_RATIO / sizeof(int16_t));
_inputDevice = _audioInput->start();
connect(_inputDevice, SIGNAL(readyRead()), this, SLOT(handleAudioInput()));
// setup our general output device for audio-mixer audio
_audioOutput = new QAudioOutput(outputDeviceInfo, _outputFormat, this);
_outputDevice = _audioOutput->start();
// setup a loopback audio output device
_loopbackAudioOutput = new QAudioOutput(outputDeviceInfo, _outputFormat, this);
gettimeofday(&_lastReceiveTime, NULL);
}
return;
}
@ -284,56 +284,56 @@ void Audio::start() {
void Audio::handleAudioInput() {
static char monoAudioDataPacket[MAX_PACKET_SIZE];
static int numBytesPacketHeader = numBytesForPacketHeader((unsigned char*) &PACKET_TYPE_MICROPHONE_AUDIO_NO_ECHO);
static int leadingBytes = numBytesPacketHeader + sizeof(glm::vec3) + sizeof(glm::quat) + NUM_BYTES_RFC4122_UUID;
static int16_t* monoAudioSamples = (int16_t*) (monoAudioDataPacket + leadingBytes);
static float inputToNetworkInputRatio = _numInputCallbackBytes * CALLBACK_ACCELERATOR_RATIO
/ NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL;
static int inputSamplesRequired = NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL * inputToNetworkInputRatio;
static unsigned int inputSamplesRequired = NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL * inputToNetworkInputRatio;
QByteArray inputByteArray = _inputDevice->readAll();
if (Menu::getInstance()->isOptionChecked(MenuOption::EchoLocalAudio)) {
// if this person wants local loopback add that to the locally injected audio
if (!_loopbackOutputDevice) {
// we didn't have the loopback output device going so set that up now
_loopbackOutputDevice = _loopbackAudioOutput->start();
}
if (_inputFormat == _outputFormat) {
_loopbackOutputDevice->write(inputByteArray);
} else {
static float loopbackOutputToInputRatio = (_outputFormat.sampleRate() / (float) _inputFormat.sampleRate())
* (_outputFormat.channelCount() / _inputFormat.channelCount());
QByteArray loopBackByteArray(inputByteArray.size() * loopbackOutputToInputRatio, 0);
linearResampling((int16_t*) inputByteArray.data(), (int16_t*) loopBackByteArray.data(),
inputByteArray.size() / sizeof(int16_t),
loopBackByteArray.size() / sizeof(int16_t), _inputFormat, _outputFormat);
_loopbackOutputDevice->write(loopBackByteArray);
}
}
_inputRingBuffer.writeData(inputByteArray.data(), inputByteArray.size());
while (_inputRingBuffer.samplesAvailable() > inputSamplesRequired) {
int16_t inputAudioSamples[inputSamplesRequired];
int16_t* inputAudioSamples = new int16_t[inputSamplesRequired];
_inputRingBuffer.readSamples(inputAudioSamples, inputSamplesRequired);
// zero out the monoAudioSamples array and the locally injected audio
memset(monoAudioSamples, 0, NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL);
// zero out the locally injected audio in preparation for audio procedural sounds
memset(_localInjectedSamples, 0, NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL);
if (!_muted) {
// we aren't muted, downsample the input audio
linearResampling((int16_t*) inputAudioSamples,
@ -341,15 +341,15 @@ void Audio::handleAudioInput() {
inputSamplesRequired,
NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL,
_inputFormat, _desiredInputFormat);
float loudness = 0;
for (int i = 0; i < NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL; i++) {
loudness += fabsf(monoAudioSamples[i]);
}
_lastInputLoudness = loudness / NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL;
// add input data just written to the scope
QMetaObject::invokeMethod(_scope, "addSamples", Qt::QueuedConnection,
Q_ARG(QByteArray, QByteArray((char*) monoAudioSamples,
@ -359,68 +359,69 @@ void Audio::handleAudioInput() {
// our input loudness is 0, since we're muted
_lastInputLoudness = 0;
}
// add procedural effects to the appropriate input samples
addProceduralSounds(monoAudioSamples,
NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL);
NodeList* nodeList = NodeList::getInstance();
SharedNodePointer audioMixer = nodeList->soloNodeOfType(NODE_TYPE_AUDIO_MIXER);
if (audioMixer && nodeList->getNodeActiveSocketOrPing(audioMixer.data())) {
MyAvatar* interfaceAvatar = Application::getInstance()->getAvatar();
glm::vec3 headPosition = interfaceAvatar->getHeadJointPosition();
glm::quat headOrientation = interfaceAvatar->getHead().getOrientation();
// we need the amount of bytes in the buffer + 1 for type
// + 12 for 3 floats for position + float for bearing + 1 attenuation byte
PACKET_TYPE packetType = Menu::getInstance()->isOptionChecked(MenuOption::EchoServerAudio)
? PACKET_TYPE_MICROPHONE_AUDIO_WITH_ECHO : PACKET_TYPE_MICROPHONE_AUDIO_NO_ECHO;
char* currentPacketPtr = monoAudioDataPacket + populateTypeAndVersion((unsigned char*) monoAudioDataPacket,
packetType);
// pack Source Data
QByteArray rfcUUID = NodeList::getInstance()->getOwnerUUID().toRfc4122();
memcpy(currentPacketPtr, rfcUUID.constData(), rfcUUID.size());
currentPacketPtr += rfcUUID.size();
// memcpy the three float positions
memcpy(currentPacketPtr, &headPosition, sizeof(headPosition));
currentPacketPtr += (sizeof(headPosition));
// memcpy our orientation
memcpy(currentPacketPtr, &headOrientation, sizeof(headOrientation));
currentPacketPtr += sizeof(headOrientation);
nodeList->getNodeSocket().writeDatagram(monoAudioDataPacket,
NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL + leadingBytes,
audioMixer->getActiveSocket()->getAddress(),
audioMixer->getActiveSocket()->getPort());
Application::getInstance()->getBandwidthMeter()->outputStream(BandwidthMeter::AUDIO)
.updateValue(NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL + leadingBytes);
}
delete[] inputAudioSamples;
}
}
void Audio::addReceivedAudioToBuffer(const QByteArray& audioByteArray) {
const int NUM_INITIAL_PACKETS_DISCARD = 3;
const int STANDARD_DEVIATION_SAMPLE_COUNT = 500;
timeval currentReceiveTime;
gettimeofday(&currentReceiveTime, NULL);
_totalPacketsReceived++;
double timeDiff = diffclock(&_lastReceiveTime, &currentReceiveTime);
// Discard first few received packets for computing jitter (often they pile up on start)
if (_totalPacketsReceived > NUM_INITIAL_PACKETS_DISCARD) {
_stdev.addValue(timeDiff);
}
if (_stdev.getSamples() > STANDARD_DEVIATION_SAMPLE_COUNT) {
_measuredJitter = _stdev.getStDev();
_stdev.reset();
@ -432,17 +433,17 @@ void Audio::addReceivedAudioToBuffer(const QByteArray& audioByteArray) {
setJitterBufferSamples(glm::clamp((int)newJitterBufferSamples, 0, MAX_JITTER_BUFFER_SAMPLES));
}
}
_ringBuffer.parseData((unsigned char*) audioByteArray.data(), audioByteArray.size());
static float networkOutputToOutputRatio = (_desiredOutputFormat.sampleRate() / (float) _outputFormat.sampleRate())
* (_desiredOutputFormat.channelCount() / (float) _outputFormat.channelCount());
static int numRequiredOutputSamples = NETWORK_BUFFER_LENGTH_SAMPLES_STEREO / networkOutputToOutputRatio;
QByteArray outputBuffer;
outputBuffer.resize(numRequiredOutputSamples * sizeof(int16_t));
// if there is anything in the ring buffer, decide what to do
if (_ringBuffer.samplesAvailable() > 0) {
if (!_ringBuffer.isNotStarvedOrHasMinimumSamples(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO
@ -452,61 +453,61 @@ void Audio::addReceivedAudioToBuffer(const QByteArray& audioByteArray) {
} else {
// We are either already playing back, or we have enough audio to start playing back.
_ringBuffer.setIsStarved(false);
// copy the samples we'll resample from the ring buffer - this also
// pushes the read pointer of the ring buffer forwards
int16_t ringBufferSamples[NETWORK_BUFFER_LENGTH_SAMPLES_STEREO];
_ringBuffer.readSamples(ringBufferSamples, NETWORK_BUFFER_LENGTH_SAMPLES_STEREO);
// add the next NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL from each QByteArray
// in our _localInjectionByteArrays QVector to the _localInjectedSamples
// add to the output samples whatever is in the _localAudioOutput byte array
// that lets this user hear sound effects and loopback (if enabled)
for (int b = 0; b < _localInjectionByteArrays.size(); b++) {
QByteArray audioByteArray = _localInjectionByteArrays.at(b);
int16_t* byteArraySamples = (int16_t*) audioByteArray.data();
int samplesToRead = MIN(audioByteArray.size() / sizeof(int16_t),
NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL);
for (int i = 0; i < samplesToRead; i++) {
_localInjectedSamples[i] = glm::clamp(_localInjectedSamples[i] + byteArraySamples[i],
MIN_SAMPLE_VALUE, MAX_SAMPLE_VALUE);
}
if (samplesToRead < NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL) {
// there isn't anything left to inject from this byte array, remove it from the vector
_localInjectionByteArrays.remove(b);
} else {
// pull out the bytes we just read for outputs
audioByteArray.remove(0, samplesToRead * sizeof(int16_t));
// still data left to read - replace the byte array in the QVector with the smaller one
_localInjectionByteArrays.replace(b, audioByteArray);
}
}
for (int i = 0; i < NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL; i++) {
ringBufferSamples[i * 2] = glm::clamp(ringBufferSamples[i * 2] + _localInjectedSamples[i],
MIN_SAMPLE_VALUE, MAX_SAMPLE_VALUE);
ringBufferSamples[(i * 2) + 1] = glm::clamp(ringBufferSamples[(i * 2) + 1] + _localInjectedSamples[i],
MIN_SAMPLE_VALUE, MAX_SAMPLE_VALUE);
}
// copy the packet from the RB to the output
linearResampling(ringBufferSamples,
(int16_t*) outputBuffer.data(),
NETWORK_BUFFER_LENGTH_SAMPLES_STEREO,
numRequiredOutputSamples,
_desiredOutputFormat, _outputFormat);
if (_outputDevice) {
_outputDevice->write(outputBuffer);
// add output (@speakers) data just written to the scope
QMetaObject::invokeMethod(_scope, "addSamples", Qt::QueuedConnection,
Q_ARG(QByteArray, QByteArray((char*) ringBufferSamples,
@ -514,7 +515,7 @@ void Audio::addReceivedAudioToBuffer(const QByteArray& audioByteArray) {
Q_ARG(bool, true), Q_ARG(bool, false));
}
}
} else if (_audioOutput->bytesFree() == _audioOutput->bufferSize()) {
// we don't have any audio data left in the output buffer, and the ring buffer from
// the network has nothing in it either - we just starved
@ -522,9 +523,9 @@ void Audio::addReceivedAudioToBuffer(const QByteArray& audioByteArray) {
_ringBuffer.setIsStarved(true);
_numFramesDisplayStarve = 10;
}
Application::getInstance()->getBandwidthMeter()->inputStream(BandwidthMeter::AUDIO).updateValue(audioByteArray.size());
_lastReceiveTime = currentReceiveTime;
}
@ -541,59 +542,59 @@ void Audio::render(int screenWidth, int screenHeight) {
glLineWidth(2.0);
glBegin(GL_LINES);
glColor3f(1,1,1);
int startX = 20.0;
int currentX = startX;
int topY = screenHeight - 40;
int bottomY = screenHeight - 20;
float frameWidth = 20.0;
float halfY = topY + ((bottomY - topY) / 2.0);
// draw the lines for the base of the ring buffer
glVertex2f(currentX, topY);
glVertex2f(currentX, bottomY);
for (int i = 0; i < RING_BUFFER_LENGTH_FRAMES; i++) {
glVertex2f(currentX, halfY);
glVertex2f(currentX + frameWidth, halfY);
currentX += frameWidth;
glVertex2f(currentX, topY);
glVertex2f(currentX, bottomY);
}
glEnd();
// show a bar with the amount of audio remaining in ring buffer and output device
// beyond the current playback
int bytesLeftInAudioOutput = _audioOutput->bufferSize() - _audioOutput->bytesFree();
float secondsLeftForAudioOutput = (bytesLeftInAudioOutput / sizeof(int16_t))
/ ((float) _outputFormat.sampleRate() * _outputFormat.channelCount());
float secondsLeftForRingBuffer = _ringBuffer.samplesAvailable()
/ ((float) _desiredOutputFormat.sampleRate() * _desiredOutputFormat.channelCount());
float msLeftForAudioOutput = (secondsLeftForAudioOutput + secondsLeftForRingBuffer) * 1000;
if (_numFramesDisplayStarve == 0) {
glColor3f(0, 1, 0);
} else {
glColor3f(0.5 + (_numFramesDisplayStarve / 20.0f), 0, 0);
_numFramesDisplayStarve--;
}
if (_averagedLatency == 0.0) {
_averagedLatency = msLeftForAudioOutput;
} else {
_averagedLatency = 0.99f * _averagedLatency + 0.01f * (msLeftForAudioOutput);
}
glBegin(GL_QUADS);
glVertex2f(startX, topY + 2);
glVertex2f(startX + _averagedLatency / AUDIO_CALLBACK_MSECS * frameWidth, topY + 2);
glVertex2f(startX + _averagedLatency / AUDIO_CALLBACK_MSECS * frameWidth, bottomY - 2);
glVertex2f(startX, bottomY - 2);
glEnd();
// Show a yellow bar with the averaged msecs latency you are hearing (from time of packet receipt)
glColor3f(1,1,0);
glBegin(GL_QUADS);
@ -602,48 +603,48 @@ void Audio::render(int screenWidth, int screenHeight) {
glVertex2f(startX + _averagedLatency / AUDIO_CALLBACK_MSECS * frameWidth + 2, bottomY + 2);
glVertex2f(startX + _averagedLatency / AUDIO_CALLBACK_MSECS * frameWidth - 2, bottomY + 2);
glEnd();
char out[40];
sprintf(out, "%3.0f\n", _averagedLatency);
drawtext(startX + _averagedLatency / AUDIO_CALLBACK_MSECS * frameWidth - 10, topY - 9, 0.10, 0, 1, 0, out, 1,1,0);
drawtext(startX + _averagedLatency / AUDIO_CALLBACK_MSECS * frameWidth - 10, topY - 9, 0.10f, 0, 1, 0, out, 1,1,0);
// Show a red bar with the 'start' point of one frame plus the jitter buffer
glColor3f(1, 0, 0);
int jitterBufferPels = (1.f + (float)getJitterBufferSamples()
/ (float) NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL) * frameWidth;
sprintf(out, "%.0f\n", getJitterBufferSamples() / SAMPLE_RATE * 1000.f);
drawtext(startX + jitterBufferPels - 5, topY - 9, 0.10, 0, 1, 0, out, 1, 0, 0);
drawtext(startX + jitterBufferPels - 5, topY - 9, 0.10f, 0, 1, 0, out, 1, 0, 0);
sprintf(out, "j %.1f\n", _measuredJitter);
if (Menu::getInstance()->getAudioJitterBufferSamples() == 0) {
drawtext(startX + jitterBufferPels - 5, bottomY + 12, 0.10, 0, 1, 0, out, 1, 0, 0);
drawtext(startX + jitterBufferPels - 5, bottomY + 12, 0.10f, 0, 1, 0, out, 1, 0, 0);
} else {
drawtext(startX, bottomY + 12, 0.10, 0, 1, 0, out, 1, 0, 0);
drawtext(startX, bottomY + 12, 0.10f, 0, 1, 0, out, 1, 0, 0);
}
glBegin(GL_QUADS);
glVertex2f(startX + jitterBufferPels - 2, topY - 2);
glVertex2f(startX + jitterBufferPels + 2, topY - 2);
glVertex2f(startX + jitterBufferPels + 2, bottomY + 2);
glVertex2f(startX + jitterBufferPels - 2, bottomY + 2);
glEnd();
}
renderToolIcon(screenHeight);
}
// Take a pointer to the acquired microphone input samples and add procedural sounds
void Audio::addProceduralSounds(int16_t* monoInput, int numSamples) {
const float MAX_AUDIBLE_VELOCITY = 6.0;
const float MIN_AUDIBLE_VELOCITY = 0.1;
const float MAX_AUDIBLE_VELOCITY = 6.0f;
const float MIN_AUDIBLE_VELOCITY = 0.1f;
const int VOLUME_BASELINE = 400;
const float SOUND_PITCH = 8.f;
float speed = glm::length(_lastVelocity);
float volume = VOLUME_BASELINE * (1.f - speed / MAX_AUDIBLE_VELOCITY);
float sample;
// Travelling noise
// Add a noise-modulated sinewave with volume that tapers off with speed increasing
if ((speed > MIN_AUDIBLE_VELOCITY) && (speed < MAX_AUDIBLE_VELOCITY)) {
@ -661,23 +662,23 @@ void Audio::addProceduralSounds(int16_t* monoInput, int numSamples) {
if (_collisionSoundMagnitude > COLLISION_SOUND_CUTOFF_LEVEL) {
for (int i = 0; i < numSamples; i++) {
t = (float) _proceduralEffectSample + (float) i;
sample = sinf(t * _collisionSoundFrequency)
+ sinf(t * _collisionSoundFrequency / DOWN_TWO_OCTAVES)
+ sinf(t * _collisionSoundFrequency / DOWN_FOUR_OCTAVES * UP_MAJOR_FIFTH);
sample *= _collisionSoundMagnitude * COLLISION_SOUND_MAX_VOLUME;
int16_t collisionSample = (int16_t) sample;
monoInput[i] = glm::clamp(monoInput[i] + collisionSample, MIN_SAMPLE_VALUE, MAX_SAMPLE_VALUE);
_localInjectedSamples[i] = glm::clamp(_localInjectedSamples[i] + collisionSample,
MIN_SAMPLE_VALUE, MAX_SAMPLE_VALUE);
_collisionSoundMagnitude *= _collisionSoundDuration;
}
}
_proceduralEffectSample += numSamples;
// Add a drum sound
const float MAX_VOLUME = 32000.f;
const float MAX_DURATION = 2.f;
@ -690,13 +691,13 @@ void Audio::addProceduralSounds(int16_t* monoInput, int numSamples) {
sample = sinf(t * frequency);
sample += ((randFloat() - 0.5f) * NOISE_MAGNITUDE);
sample *= _drumSoundVolume * MAX_VOLUME;
int16_t collisionSample = (int16_t) sample;
monoInput[i] = glm::clamp(monoInput[i] + collisionSample, MIN_SAMPLE_VALUE, MAX_SAMPLE_VALUE);
_localInjectedSamples[i] = glm::clamp(_localInjectedSamples[i] + collisionSample,
MIN_SAMPLE_VALUE, MAX_SAMPLE_VALUE);
_drumSoundVolume *= (1.f - _drumSoundDecay);
}
_drumSoundSample += numSamples;
@ -730,46 +731,46 @@ void Audio::handleAudioByteArray(const QByteArray& audioByteArray) {
}
void Audio::renderToolIcon(int screenHeight) {
_iconBounds = QRect(ICON_LEFT, screenHeight - BOTTOM_PADDING, ICON_SIZE, ICON_SIZE);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, _micTextureId);
glColor3f(1, 1, 1);
glBegin(GL_QUADS);
glTexCoord2f(1, 1);
glVertex2f(_iconBounds.left(), _iconBounds.top());
glTexCoord2f(0, 1);
glVertex2f(_iconBounds.right(), _iconBounds.top());
glTexCoord2f(0, 0);
glVertex2f(_iconBounds.right(), _iconBounds.bottom());
glTexCoord2f(1, 0);
glVertex2f(_iconBounds.left(), _iconBounds.bottom());
glEnd();
if (_muted) {
glBindTexture(GL_TEXTURE_2D, _muteTextureId);
glBegin(GL_QUADS);
glTexCoord2f(1, 1);
glVertex2f(_iconBounds.left(), _iconBounds.top());
glTexCoord2f(0, 1);
glVertex2f(_iconBounds.right(), _iconBounds.top());
glTexCoord2f(0, 0);
glVertex2f(_iconBounds.right(), _iconBounds.bottom());
glTexCoord2f(1, 0);
glVertex2f(_iconBounds.left(), _iconBounds.bottom());
glEnd();
}
glDisable(GL_TEXTURE_2D);
}

View file

@ -9,6 +9,11 @@
#ifndef __interface__Audio__
#define __interface__Audio__
#ifdef _WIN32
#define WANT_TIMEVAL
#include <Systime.h>
#endif
#include <fstream>
#include <vector>

View file

@ -9,6 +9,11 @@
#ifndef __interface__BandwidthMeter__
#define __interface__BandwidthMeter__
#ifdef _WIN32
#define WANT_TIMEVAL
#include <Systime.h>
#endif
#include <glm/glm.hpp>
#include "ui/TextRenderer.h"

View file

@ -23,7 +23,7 @@ Cloud::Cloud() {
_particles = new Particle[_count];
_field = new Field(PARTICLE_WORLD_SIZE, FIELD_COUPLE);
for (int i = 0; i < _count; i++) {
for (unsigned int i = 0; i < _count; i++) {
_particles[i].position = randVector() * box;
const float INIT_VEL_SCALE = 0.03f;
_particles[i].velocity = randVector() * ((float)PARTICLE_WORLD_SIZE * INIT_VEL_SCALE);

View file

@ -34,33 +34,33 @@ const HifiSockAddr& DataServerClient::dataServerSockAddr() {
void DataServerClient::putValueForKey(const QString& key, const char* value) {
QString clientString = Application::getInstance()->getProfile()->getUserString();
if (!clientString.isEmpty()) {
unsigned char* putPacket = new unsigned char[MAX_PACKET_SIZE];
// setup the header for this packet
int numPacketBytes = populateTypeAndVersion(putPacket, PACKET_TYPE_DATA_SERVER_PUT);
// pack the client UUID, null terminated
memcpy(putPacket + numPacketBytes, clientString.toLocal8Bit().constData(), clientString.toLocal8Bit().size());
numPacketBytes += clientString.toLocal8Bit().size();
putPacket[numPacketBytes++] = '\0';
// pack a 1 to designate that we are putting a single value
putPacket[numPacketBytes++] = 1;
// pack the key, null terminated
strcpy((char*) putPacket + numPacketBytes, key.toLocal8Bit().constData());
numPacketBytes += key.size();
putPacket[numPacketBytes++] = '\0';
// pack the value, null terminated
strcpy((char*) putPacket + numPacketBytes, value);
numPacketBytes += strlen(value);
putPacket[numPacketBytes++] = '\0';
// add the putPacket to our vector of unconfirmed packets, will be deleted once put is confirmed
// _unmatchedPackets.insert(std::pair<unsigned char*, int>(putPacket, numPacketBytes));
// send this put request to the data server
NodeList::getInstance()->getNodeSocket().writeDatagram((char*) putPacket, numPacketBytes,
dataServerSockAddr().getAddress(),
@ -81,27 +81,27 @@ void DataServerClient::getValuesForKeysAndUUID(const QStringList& keys, const QU
void DataServerClient::getValuesForKeysAndUserString(const QStringList& keys, const QString& userString) {
if (!userString.isEmpty() && keys.size() <= UCHAR_MAX) {
unsigned char* getPacket = new unsigned char[MAX_PACKET_SIZE];
// setup the header for this packet
int numPacketBytes = populateTypeAndVersion(getPacket, PACKET_TYPE_DATA_SERVER_GET);
// pack the user string (could be username or UUID string), null-terminate
memcpy(getPacket + numPacketBytes, userString.toLocal8Bit().constData(), userString.toLocal8Bit().size());
numPacketBytes += userString.toLocal8Bit().size();
getPacket[numPacketBytes++] = '\0';
// pack one byte to designate the number of keys
getPacket[numPacketBytes++] = keys.size();
QString keyString = keys.join(MULTI_KEY_VALUE_SEPARATOR);
// pack the key string, null terminated
strcpy((char*) getPacket + numPacketBytes, keyString.toLocal8Bit().constData());
numPacketBytes += keyString.size() + sizeof('\0');
// add the getPacket to our vector of uncofirmed packets, will be deleted once we get a response from the nameserver
// _unmatchedPackets.insert(std::pair<unsigned char*, int>(getPacket, numPacketBytes));
// send the get to the data server
NodeList::getInstance()->getNodeSocket().writeDatagram((char*) getPacket, numPacketBytes,
dataServerSockAddr().getAddress(),
@ -120,25 +120,25 @@ void DataServerClient::processConfirmFromDataServer(unsigned char* packetData, i
void DataServerClient::processSendFromDataServer(unsigned char* packetData, int numPacketBytes) {
// pull the user string from the packet so we know who to associate this with
int numHeaderBytes = numBytesForPacketHeader(packetData);
char* userStringPosition = (char*) packetData + numHeaderBytes;
QString userString(QByteArray(userStringPosition, strlen(userStringPosition)));
QUuid userUUID(userString);
char* keysPosition = (char*) packetData + numHeaderBytes + strlen(userStringPosition)
+ sizeof('\0') + sizeof(unsigned char);
char* valuesPosition = keysPosition + strlen(keysPosition) + sizeof('\0');
QStringList keyList = QString(keysPosition).split(MULTI_KEY_VALUE_SEPARATOR);
QStringList valueList = QString(valuesPosition).split(MULTI_KEY_VALUE_SEPARATOR);
// user string was UUID, find matching avatar and associate data
for (int i = 0; i < keyList.size(); i++) {
if (valueList[i] != " ") {
if (keyList[i] == DataServerKey::FaceMeshURL) {
if (userUUID.isNull() || userUUID == Application::getInstance()->getProfile()->getUUID()) {
qDebug("Changing user's face model URL to %s", valueList[i].toLocal8Bit().constData());
Application::getInstance()->getProfile()->setFaceModelURL(QUrl(valueList[i]));
@ -148,7 +148,7 @@ void DataServerClient::processSendFromDataServer(unsigned char* packetData, int
foreach (const SharedNodePointer& node, NodeList::getInstance()->getNodeHash()) {
if (node->getLinkedData() != NULL && node->getType() == NODE_TYPE_AGENT) {
Avatar* avatar = (Avatar *) node->getLinkedData();
if (avatar->getUUID() == userUUID) {
QMetaObject::invokeMethod(&avatar->getHead().getFaceModel(),
"setURL", Q_ARG(QUrl, QUrl(valueList[i])));
@ -157,7 +157,7 @@ void DataServerClient::processSendFromDataServer(unsigned char* packetData, int
}
}
} else if (keyList[i] == DataServerKey::SkeletonURL) {
if (userUUID.isNull() || userUUID == Application::getInstance()->getProfile()->getUUID()) {
qDebug("Changing user's skeleton URL to %s", valueList[i].toLocal8Bit().constData());
Application::getInstance()->getProfile()->setSkeletonModelURL(QUrl(valueList[i]));
@ -166,7 +166,7 @@ void DataServerClient::processSendFromDataServer(unsigned char* packetData, int
foreach (const SharedNodePointer& node, NodeList::getInstance()->getNodeHash()) {
if (node->getLinkedData() != NULL && node->getType() == NODE_TYPE_AGENT) {
Avatar* avatar = (Avatar *) node->getLinkedData();
if (avatar->getUUID() == userUUID) {
QMetaObject::invokeMethod(&avatar->getSkeletonModel(), "setURL",
Q_ARG(QUrl, QUrl(valueList[i])));
@ -177,42 +177,41 @@ void DataServerClient::processSendFromDataServer(unsigned char* packetData, int
} else if (keyList[i] == DataServerKey::Domain && keyList[i + 1] == DataServerKey::Position &&
keyList[i + 2] == DataServerKey::Orientation && valueList[i] != " " &&
valueList[i + 1] != " " && valueList[i + 2] != " ") {
QStringList coordinateItems = valueList[i + 1].split(',');
QStringList orientationItems = valueList[i + 2].split(',');
if (coordinateItems.size() == 3 && orientationItems.size() == 3) {
// send a node kill request, indicating to other clients that they should play the "disappeared" effect
NodeList::getInstance()->sendKillNode(&NODE_TYPE_AVATAR_MIXER, 1);
qDebug() << "Changing domain to" << valueList[i].toLocal8Bit().constData() <<
", position to" << valueList[i + 1].toLocal8Bit().constData() <<
", and orientation to" << valueList[i + 2].toLocal8Bit().constData() <<
"to go to" << userString;
NodeList::getInstance()->setDomainHostname(valueList[i]);
// orient the user to face the target
glm::quat newOrientation = glm::quat(glm::radians(glm::vec3(orientationItems[0].toFloat(),
orientationItems[1].toFloat(), orientationItems[2].toFloat()))) *
glm::angleAxis(180.0f, 0.0f, 1.0f, 0.0f);
Application::getInstance()->getAvatar()->setOrientation(newOrientation);
// move the user a couple units away
const float DISTANCE_TO_USER = 2.0f;
glm::vec3 newPosition = glm::vec3(coordinateItems[0].toFloat(), coordinateItems[1].toFloat(),
coordinateItems[2].toFloat()) - newOrientation * IDENTITY_FRONT * DISTANCE_TO_USER;
Application::getInstance()->getAvatar()->setPosition(newPosition);
}
} else if (keyList[i] == DataServerKey::UUID) {
// this is the user's UUID - set it on the profile
Application::getInstance()->getProfile()->setUUID(valueList[i]);
}
}
}
// remove the matched packet from our map so it isn't re-sent to the data-server
// removeMatchedPacketFromMap(packetData, numPacketBytes);
}
@ -237,12 +236,12 @@ void DataServerClient::removeMatchedPacketFromMap(unsigned char* packetData, int
if (memcmp(mapIterator->first + sizeof(PACKET_TYPE),
packetData + sizeof(PACKET_TYPE),
numPacketBytes - sizeof(PACKET_TYPE)) == 0) {
// this is a match - remove the confirmed packet from the vector and delete associated member
// so it isn't sent back out
delete[] mapIterator->first;
_unmatchedPackets.erase(mapIterator);
// we've matched the packet - bail out
break;
}

View file

@ -37,18 +37,18 @@ Menu* Menu::_instance = NULL;
Menu* Menu::getInstance() {
static QMutex menuInstanceMutex;
// lock the menu instance mutex to make sure we don't race and create two menus and crash
menuInstanceMutex.lock();
if (!_instance) {
qDebug("First call to Menu::getInstance() - initing menu.");
_instance = new Menu();
}
menuInstanceMutex.unlock();
return _instance;
}
@ -72,9 +72,9 @@ Menu::Menu() :
_maxVoxelPacketsPerSecond(DEFAULT_MAX_VOXEL_PPS)
{
Application *appInstance = Application::getInstance();
QMenu* fileMenu = addMenu("File");
#ifdef Q_OS_MAC
addActionToQMenuAndActionHash(fileMenu,
MenuOption::AboutApp,
@ -83,7 +83,7 @@ Menu::Menu() :
SLOT(aboutApp()),
QAction::AboutRole);
#endif
(addActionToQMenuAndActionHash(fileMenu,
MenuOption::Login,
0,
@ -97,7 +97,7 @@ Menu::Menu() :
addDisabledActionAndSeparator(fileMenu, "Voxels");
addActionToQMenuAndActionHash(fileMenu, MenuOption::ExportVoxels, Qt::CTRL | Qt::Key_E, appInstance, SLOT(exportVoxels()));
addActionToQMenuAndActionHash(fileMenu, MenuOption::ImportVoxels, Qt::CTRL | Qt::Key_I, appInstance, SLOT(importVoxels()));
addDisabledActionAndSeparator(fileMenu, "Go");
addActionToQMenuAndActionHash(fileMenu,
MenuOption::GoHome,
@ -120,45 +120,45 @@ Menu::Menu() :
this,
SLOT(goToUser()));
addDisabledActionAndSeparator(fileMenu, "Settings");
addActionToQMenuAndActionHash(fileMenu, MenuOption::SettingsImport, 0, this, SLOT(importSettings()));
addActionToQMenuAndActionHash(fileMenu, MenuOption::SettingsExport, 0, this, SLOT(exportSettings()));
addDisabledActionAndSeparator(fileMenu, "Devices");
addActionToQMenuAndActionHash(fileMenu, MenuOption::Pair, 0, PairingHandler::getInstance(), SLOT(sendPairRequest()));
addCheckableActionToQMenuAndActionHash(fileMenu, MenuOption::TransmitterDrive, 0, true);
addActionToQMenuAndActionHash(fileMenu,
MenuOption::Quit,
Qt::CTRL | Qt::Key_Q,
appInstance,
SLOT(quit()),
QAction::QuitRole);
QMenu* editMenu = addMenu("Edit");
addActionToQMenuAndActionHash(editMenu,
MenuOption::Preferences,
Qt::CTRL | Qt::Key_Comma,
this,
SLOT(editPreferences()),
QAction::PreferencesRole);
addDisabledActionAndSeparator(editMenu, "Voxels");
addActionToQMenuAndActionHash(editMenu, MenuOption::CutVoxels, Qt::CTRL | Qt::Key_X, appInstance, SLOT(cutVoxels()));
addActionToQMenuAndActionHash(editMenu, MenuOption::CopyVoxels, Qt::CTRL | Qt::Key_C, appInstance, SLOT(copyVoxels()));
addActionToQMenuAndActionHash(editMenu, MenuOption::PasteVoxels, Qt::CTRL | Qt::Key_V, appInstance, SLOT(pasteVoxels()));
addActionToQMenuAndActionHash(editMenu, MenuOption::NudgeVoxels, Qt::CTRL | Qt::Key_N, appInstance, SLOT(nudgeVoxels()));
#ifdef __APPLE__
addActionToQMenuAndActionHash(editMenu, MenuOption::DeleteVoxels, Qt::Key_Backspace, appInstance, SLOT(deleteVoxels()));
#else
addActionToQMenuAndActionHash(editMenu, MenuOption::DeleteVoxels, Qt::Key_Delete, appInstance, SLOT(deleteVoxels()));
#endif
addDisabledActionAndSeparator(editMenu, "Physics");
addCheckableActionToQMenuAndActionHash(editMenu, MenuOption::Gravity, Qt::SHIFT | Qt::Key_G, true);
addCheckableActionToQMenuAndActionHash(editMenu,
@ -167,47 +167,47 @@ Menu::Menu() :
true,
appInstance->getAvatar(),
SLOT(setWantCollisionsOn(bool)));
QMenu* toolsMenu = addMenu("Tools");
_voxelModeActionsGroup = new QActionGroup(this);
_voxelModeActionsGroup->setExclusive(false);
QAction* addVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelAddMode, Qt::Key_V);
_voxelModeActionsGroup->addAction(addVoxelMode);
QAction* deleteVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelDeleteMode, Qt::Key_R);
_voxelModeActionsGroup->addAction(deleteVoxelMode);
QAction* colorVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelColorMode, Qt::Key_B);
_voxelModeActionsGroup->addAction(colorVoxelMode);
QAction* selectVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelSelectMode, Qt::Key_O);
_voxelModeActionsGroup->addAction(selectVoxelMode);
QAction* getColorMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelGetColorMode, Qt::Key_G);
_voxelModeActionsGroup->addAction(getColorMode);
addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::ClickToFly);
// connect each of the voxel mode actions to the updateVoxelModeActionsSlot
foreach (QAction* action, _voxelModeActionsGroup->actions()) {
connect(action, SIGNAL(triggered()), this, SLOT(updateVoxelModeActions()));
}
QAction* voxelPaintColor = addActionToQMenuAndActionHash(toolsMenu,
MenuOption::VoxelPaintColor,
Qt::META | Qt::Key_C,
this,
SLOT(chooseVoxelPaintColor()));
Application::getInstance()->getSwatch()->setAction(voxelPaintColor);
QColor paintColor(128, 128, 128);
voxelPaintColor->setData(paintColor);
voxelPaintColor->setIcon(Swatch::createIcon(paintColor));
addActionToQMenuAndActionHash(toolsMenu,
MenuOption::DecreaseVoxelSize,
QKeySequence::ZoomOut,
@ -220,9 +220,9 @@ Menu::Menu() :
SLOT(increaseVoxelSize()));
addActionToQMenuAndActionHash(toolsMenu, MenuOption::ResetSwatchColors, 0, this, SLOT(resetSwatchColors()));
QMenu* viewMenu = addMenu("View");
addCheckableActionToQMenuAndActionHash(viewMenu,
MenuOption::Fullscreen,
Qt::CTRL | Qt::META | Qt::Key_F,
@ -233,10 +233,10 @@ Menu::Menu() :
addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Mirror, Qt::SHIFT | Qt::Key_H);
addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::FullscreenMirror, Qt::Key_H);
addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Enable3DTVMode, 0, false);
QMenu* avatarSizeMenu = viewMenu->addMenu("Avatar Size");
addActionToQMenuAndActionHash(avatarSizeMenu,
MenuOption::IncreaseAvatarSize,
Qt::Key_Plus,
@ -263,8 +263,8 @@ Menu::Menu() :
true);
addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::MoveWithLean, 0, false);
addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::HeadMouse, 0, false);
addDisabledActionAndSeparator(viewMenu, "Stats");
addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Stats, Qt::Key_Slash);
addActionToQMenuAndActionHash(viewMenu, MenuOption::Log, Qt::CTRL | Qt::Key_L, appInstance, SLOT(toggleLogDialog()));
@ -272,7 +272,7 @@ Menu::Menu() :
addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Bandwidth, 0, true);
addActionToQMenuAndActionHash(viewMenu, MenuOption::BandwidthDetails, 0, this, SLOT(bandwidthDetails()));
addActionToQMenuAndActionHash(viewMenu, MenuOption::VoxelStats, 0, this, SLOT(voxelStatsDetails()));
QMenu* developerMenu = addMenu("Developer");
QMenu* renderOptionsMenu = developerMenu->addMenu("Rendering Options");
@ -284,11 +284,11 @@ Menu::Menu() :
0,
appInstance->getGlowEffect(),
SLOT(cycleRenderMode()));
addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::ParticleCloud, 0, false);
addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::Shadows, 0, false);
addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::Metavoxels, 0, false);
QMenu* voxelOptionsMenu = developerMenu->addMenu("Voxel Options");
@ -301,19 +301,20 @@ Menu::Menu() :
addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::DontRenderVoxels);
addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::DontCallOpenGLForVoxels);
_useVoxelShader = addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::UseVoxelShader, 0,
_useVoxelShader = addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::UseVoxelShader, 0,
false, appInstance->getVoxels(), SLOT(setUseVoxelShader(bool)));
addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::VoxelsAsPoints, 0,
addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::VoxelsAsPoints, 0,
false, appInstance->getVoxels(), SLOT(setVoxelsAsPoints(bool)));
addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::VoxelTextures);
addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::AmbientOcclusion);
addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::DontFadeOnVoxelServerChanges);
addActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::LodTools, Qt::SHIFT | Qt::Key_L, this, SLOT(lodTools()));
addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::DisableLocalVoxelCache);
QMenu* voxelProtoOptionsMenu = voxelOptionsMenu->addMenu("Voxel Server Protocol Options");
addCheckableActionToQMenuAndActionHash(voxelProtoOptionsMenu, MenuOption::DisableColorVoxels);
addCheckableActionToQMenuAndActionHash(voxelProtoOptionsMenu, MenuOption::DisableLowRes);
addCheckableActionToQMenuAndActionHash(voxelProtoOptionsMenu, MenuOption::DisableDeltaSending);
@ -322,16 +323,16 @@ Menu::Menu() :
addCheckableActionToQMenuAndActionHash(voxelProtoOptionsMenu, MenuOption::DestructiveAddVoxel);
QMenu* avatarOptionsMenu = developerMenu->addMenu("Avatar Options");
addCheckableActionToQMenuAndActionHash(avatarOptionsMenu, MenuOption::Avatars, 0, true);
addCheckableActionToQMenuAndActionHash(avatarOptionsMenu, MenuOption::CollisionProxies);
addActionToQMenuAndActionHash(avatarOptionsMenu,
MenuOption::FaceMode,
0,
&appInstance->getAvatar()->getHead().getVideoFace(),
SLOT(cycleRenderMode()));
addCheckableActionToQMenuAndActionHash(avatarOptionsMenu, MenuOption::LookAtVectors, 0, true);
addCheckableActionToQMenuAndActionHash(avatarOptionsMenu, MenuOption::LookAtIndicator, 0, true);
addCheckableActionToQMenuAndActionHash(avatarOptionsMenu,
@ -342,6 +343,7 @@ Menu::Menu() :
SLOT(setTCPEnabled(bool)));
addCheckableActionToQMenuAndActionHash(avatarOptionsMenu, MenuOption::ChatCircling, 0, true);
#ifdef HAVE_LIBVPX
QMenu* webcamOptionsMenu = developerMenu->addMenu("Webcam Options");
addCheckableActionToQMenuAndActionHash(webcamOptionsMenu,
@ -363,6 +365,8 @@ Menu::Menu() :
false,
appInstance->getWebcam()->getGrabber(),
SLOT(setDepthOnly(bool)));
#endif //def HAVE_LIBVPX
QMenu* handOptionsMenu = developerMenu->addMenu("Hand Options");
@ -375,12 +379,12 @@ Menu::Menu() :
addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::SimulateLeapHand);
addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::DisplayLeapHands, 0, true);
addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::LeapDrive, 0, false);
addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::DisplayHandTargets, 0, false);
addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::DisplayHandTargets, 0, false);
addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::BallFromHand, 0, false);
addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::VoxelDrumming, 0, false);
addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::PlaySlaps, 0, false);
QMenu* trackingOptionsMenu = developerMenu->addMenu("Tracking Options");
addCheckableActionToQMenuAndActionHash(trackingOptionsMenu,
@ -389,14 +393,16 @@ Menu::Menu() :
false,
appInstance->getWebcam(),
SLOT(setSkeletonTrackingOn(bool)));
#ifdef HAVE_LIBVPX
addCheckableActionToQMenuAndActionHash(trackingOptionsMenu,
MenuOption::LEDTracking,
0,
false,
appInstance->getWebcam()->getGrabber(),
SLOT(setLEDTrackingOn(bool)));
#endif //def HAVE_LIBVPX
addDisabledActionAndSeparator(developerMenu, "Testing");
QMenu* timingMenu = developerMenu->addMenu("Timing and Statistics Tools");
@ -408,7 +414,7 @@ Menu::Menu() :
Qt::SHIFT | Qt::Key_S,
appInstance->getVoxels(),
SLOT(collectStatsForTreesAndVBOs()));
QMenu* frustumMenu = developerMenu->addMenu("View Frustum Debugging Tools");
addCheckableActionToQMenuAndActionHash(frustumMenu, MenuOption::DisplayFrustum, Qt::SHIFT | Qt::Key_F);
addActionToQMenuAndActionHash(frustumMenu,
@ -417,8 +423,8 @@ Menu::Menu() :
this,
SLOT(cycleFrustumRenderMode()));
updateFrustumRenderModeAction();
QMenu* renderDebugMenu = developerMenu->addMenu("Render Debugging Tools");
addCheckableActionToQMenuAndActionHash(renderDebugMenu, MenuOption::PipelineWarnings, Qt::CTRL | Qt::SHIFT | Qt::Key_P);
addCheckableActionToQMenuAndActionHash(renderDebugMenu, MenuOption::SuppressShortTimings, Qt::CTRL | Qt::SHIFT | Qt::Key_S);
@ -431,48 +437,48 @@ Menu::Menu() :
Qt::CTRL | Qt::Key_A,
appInstance->getVoxels(),
SLOT(showAllLocalVoxels()));
addActionToQMenuAndActionHash(renderDebugMenu,
MenuOption::KillLocalVoxels,
Qt::CTRL | Qt::Key_K,
appInstance, SLOT(doKillLocalVoxels()));
addActionToQMenuAndActionHash(renderDebugMenu,
MenuOption::RandomizeVoxelColors,
Qt::CTRL | Qt::Key_R,
appInstance->getVoxels(),
SLOT(randomizeVoxelColors()));
addActionToQMenuAndActionHash(renderDebugMenu,
MenuOption::FalseColorRandomly,
0,
appInstance->getVoxels(),
SLOT(falseColorizeRandom()));
addActionToQMenuAndActionHash(renderDebugMenu,
MenuOption::FalseColorEveryOtherVoxel,
0,
appInstance->getVoxels(),
SLOT(falseColorizeRandomEveryOther()));
addActionToQMenuAndActionHash(renderDebugMenu,
MenuOption::FalseColorByDistance,
0,
appInstance->getVoxels(),
SLOT(falseColorizeDistanceFromView()));
addActionToQMenuAndActionHash(renderDebugMenu,
MenuOption::FalseColorOutOfView,
0,
appInstance->getVoxels(),
SLOT(falseColorizeInView()));
addActionToQMenuAndActionHash(renderDebugMenu,
MenuOption::FalseColorBySource,
0,
appInstance->getVoxels(),
SLOT(falseColorizeBySource()));
addActionToQMenuAndActionHash(renderDebugMenu,
MenuOption::ShowTrueColors,
Qt::CTRL | Qt::Key_T,
@ -485,32 +491,32 @@ Menu::Menu() :
0,
appInstance->getVoxels(),
SLOT(falseColorizeOccluded()));
addActionToQMenuAndActionHash(renderDebugMenu,
MenuOption::FalseColorOccludedV2,
0,
appInstance->getVoxels(),
SLOT(falseColorizeOccludedV2()));
addCheckableActionToQMenuAndActionHash(renderDebugMenu, MenuOption::CoverageMap, Qt::SHIFT | Qt::CTRL | Qt::Key_O);
addCheckableActionToQMenuAndActionHash(renderDebugMenu, MenuOption::CoverageMapV2, Qt::SHIFT | Qt::CTRL | Qt::Key_P);
QMenu* audioDebugMenu = developerMenu->addMenu("Audio Debugging Tools");
addCheckableActionToQMenuAndActionHash(audioDebugMenu, MenuOption::EchoServerAudio);
addCheckableActionToQMenuAndActionHash(audioDebugMenu, MenuOption::EchoLocalAudio);
addActionToQMenuAndActionHash(developerMenu, MenuOption::PasteToVoxel,
Qt::CTRL | Qt::SHIFT | Qt::Key_V,
addActionToQMenuAndActionHash(developerMenu, MenuOption::PasteToVoxel,
Qt::CTRL | Qt::SHIFT | Qt::Key_V,
this,
SLOT(pasteToVoxel()));
#ifndef Q_OS_MAC
QMenu* helpMenu = addMenu("Help");
QAction* helpAction = helpMenu->addAction(MenuOption::AboutApp);
connect(helpAction, SIGNAL(triggered()), this, SLOT(aboutApp()));
#endif
}
Menu::~Menu() {
@ -522,7 +528,7 @@ void Menu::loadSettings(QSettings* settings) {
if (!settings) {
settings = Application::getInstance()->getSettings();
}
_audioJitterBufferSamples = loadSetting(settings, "audioJitterBufferSamples", 0);
_fieldOfView = loadSetting(settings, "fieldOfView", DEFAULT_FIELD_OF_VIEW_DEGREES);
_faceshiftEyeDeflection = loadSetting(settings, "faceshiftEyeDeflection", DEFAULT_FACESHIFT_EYE_DEFLECTION);
@ -530,7 +536,7 @@ void Menu::loadSettings(QSettings* settings) {
_maxVoxelPacketsPerSecond = loadSetting(settings, "maxVoxelsPPS", DEFAULT_MAX_VOXEL_PPS);
_voxelSizeScale = loadSetting(settings, "voxelSizeScale", DEFAULT_OCTREE_SIZE_SCALE);
_boundaryLevelAdjust = loadSetting(settings, "boundaryLevelAdjust", 0);
settings->beginGroup("View Frustum Offset Camera");
// in case settings is corrupt or missing loadSetting() will check for NaN
_viewFrustumOffset.yaw = loadSetting(settings, "viewFrustumOffsetYaw", 0.0f);
@ -539,7 +545,7 @@ void Menu::loadSettings(QSettings* settings) {
_viewFrustumOffset.distance = loadSetting(settings, "viewFrustumOffsetDistance", 0.0f);
_viewFrustumOffset.up = loadSetting(settings, "viewFrustumOffsetUp", 0.0f);
settings->endGroup();
scanMenuBar(&loadAction, settings);
Application::getInstance()->getAvatar()->loadData(settings);
Application::getInstance()->getSwatch()->loadData(settings);
@ -552,7 +558,7 @@ void Menu::saveSettings(QSettings* settings) {
if (!settings) {
settings = Application::getInstance()->getSettings();
}
settings->setValue("audioJitterBufferSamples", _audioJitterBufferSamples);
settings->setValue("fieldOfView", _fieldOfView);
settings->setValue("faceshiftEyeDeflection", _faceshiftEyeDeflection);
@ -567,7 +573,7 @@ void Menu::saveSettings(QSettings* settings) {
settings->setValue("viewFrustumOffsetDistance", _viewFrustumOffset.distance);
settings->setValue("viewFrustumOffsetUp", _viewFrustumOffset.up);
settings->endGroup();
scanMenuBar(&saveAction, settings);
Application::getInstance()->getAvatar()->saveData(settings);
Application::getInstance()->getSwatch()->saveData(settings);
@ -612,7 +618,7 @@ void Menu::saveAction(QSettings* set, QAction* action) {
void Menu::scanMenuBar(settingsAction modifySetting, QSettings* set) {
QList<QMenu*> menus = this->findChildren<QMenu *>();
for (QList<QMenu *>::const_iterator it = menus.begin(); menus.end() != it; ++it) {
scanMenu(*it, modifySetting, set);
}
@ -620,7 +626,7 @@ void Menu::scanMenuBar(settingsAction modifySetting, QSettings* set) {
void Menu::scanMenu(QMenu* menu, settingsAction modifySetting, QSettings* set) {
QList<QAction*> actions = menu->actions();
set->beginGroup(menu->title());
for (QList<QAction *>::const_iterator it = actions.begin(); actions.end() != it; ++it) {
if ((*it)->menu()) {
@ -636,48 +642,48 @@ void Menu::scanMenu(QMenu* menu, settingsAction modifySetting, QSettings* set) {
void Menu::handleViewFrustumOffsetKeyModifier(int key) {
const float VIEW_FRUSTUM_OFFSET_DELTA = 0.5f;
const float VIEW_FRUSTUM_OFFSET_UP_DELTA = 0.05f;
switch (key) {
case Qt::Key_BracketLeft:
_viewFrustumOffset.yaw -= VIEW_FRUSTUM_OFFSET_DELTA;
break;
case Qt::Key_BracketRight:
_viewFrustumOffset.yaw += VIEW_FRUSTUM_OFFSET_DELTA;
break;
case Qt::Key_BraceLeft:
_viewFrustumOffset.pitch -= VIEW_FRUSTUM_OFFSET_DELTA;
break;
case Qt::Key_BraceRight:
_viewFrustumOffset.pitch += VIEW_FRUSTUM_OFFSET_DELTA;
break;
case Qt::Key_ParenLeft:
_viewFrustumOffset.roll -= VIEW_FRUSTUM_OFFSET_DELTA;
break;
case Qt::Key_ParenRight:
_viewFrustumOffset.roll += VIEW_FRUSTUM_OFFSET_DELTA;
break;
case Qt::Key_Less:
_viewFrustumOffset.distance -= VIEW_FRUSTUM_OFFSET_DELTA;
break;
case Qt::Key_Greater:
_viewFrustumOffset.distance += VIEW_FRUSTUM_OFFSET_DELTA;
break;
case Qt::Key_Comma:
_viewFrustumOffset.up -= VIEW_FRUSTUM_OFFSET_UP_DELTA;
break;
case Qt::Key_Period:
_viewFrustumOffset.up += VIEW_FRUSTUM_OFFSET_UP_DELTA;
break;
default:
break;
}
@ -695,7 +701,7 @@ QAction* Menu::addActionToQMenuAndActionHash(QMenu* destinationMenu,
const char* member,
QAction::MenuRole role) {
QAction* action;
if (receiver && member) {
action = destinationMenu->addAction(actionName, receiver, member, shortcut);
} else {
@ -703,9 +709,9 @@ QAction* Menu::addActionToQMenuAndActionHash(QMenu* destinationMenu,
action->setShortcut(shortcut);
}
action->setMenuRole(role);
_actionHash.insert(actionName, action);
return action;
}
@ -718,7 +724,7 @@ QAction* Menu::addCheckableActionToQMenuAndActionHash(QMenu* destinationMenu,
QAction* action = addActionToQMenuAndActionHash(destinationMenu, actionName, shortcut, receiver, member);
action->setCheckable(true);
action->setChecked(checked);
return action;
}
@ -755,14 +761,14 @@ void Menu::aboutApp() {
void sendFakeEnterEvent() {
QPoint lastCursorPosition = QCursor::pos();
QGLWidget* glWidget = Application::getInstance()->getGLWidget();
QPoint windowPosition = glWidget->mapFromGlobal(lastCursorPosition);
QEnterEvent enterEvent = QEnterEvent(windowPosition, windowPosition, lastCursorPosition);
QCoreApplication::sendEvent(glWidget, &enterEvent);
}
const int QLINE_MINIMUM_WIDTH = 400;
const float DIALOG_RATIO_OF_WINDOW = 0.30;
const float DIALOG_RATIO_OF_WINDOW = 0.30f;
void Menu::login() {
QInputDialog loginDialog(Application::getInstance()->getWindow());
@ -772,62 +778,62 @@ void Menu::login() {
loginDialog.setTextValue(username);
loginDialog.setWindowFlags(Qt::Sheet);
loginDialog.resize(loginDialog.parentWidget()->size().width() * DIALOG_RATIO_OF_WINDOW, loginDialog.size().height());
int dialogReturn = loginDialog.exec();
if (dialogReturn == QDialog::Accepted && !loginDialog.textValue().isEmpty() && loginDialog.textValue() != username) {
// there has been a username change
// ask for a profile reset with the new username
Application::getInstance()->resetProfile(loginDialog.textValue());
}
sendFakeEnterEvent();
}
void Menu::editPreferences() {
Application* applicationInstance = Application::getInstance();
QDialog dialog(applicationInstance->getWindow());
dialog.setWindowTitle("Interface Preferences");
QBoxLayout* layout = new QBoxLayout(QBoxLayout::TopToBottom);
dialog.setLayout(layout);
QFormLayout* form = new QFormLayout();
layout->addLayout(form, 1);
QString faceURLString = applicationInstance->getProfile()->getFaceModelURL().toString();
QLineEdit* faceURLEdit = new QLineEdit(faceURLString);
faceURLEdit->setMinimumWidth(QLINE_MINIMUM_WIDTH);
form->addRow("Face URL:", faceURLEdit);
QString skeletonURLString = applicationInstance->getProfile()->getSkeletonModelURL().toString();
QLineEdit* skeletonURLEdit = new QLineEdit(skeletonURLString);
skeletonURLEdit->setMinimumWidth(QLINE_MINIMUM_WIDTH);
form->addRow("Skeleton URL:", skeletonURLEdit);
QSlider* pupilDilation = new QSlider(Qt::Horizontal);
pupilDilation->setValue(applicationInstance->getAvatar()->getHead().getPupilDilation() * pupilDilation->maximum());
form->addRow("Pupil Dilation:", pupilDilation);
QSlider* faceshiftEyeDeflection = new QSlider(Qt::Horizontal);
faceshiftEyeDeflection->setValue(_faceshiftEyeDeflection * faceshiftEyeDeflection->maximum());
form->addRow("Faceshift Eye Deflection:", faceshiftEyeDeflection);
QSpinBox* fieldOfView = new QSpinBox();
fieldOfView->setMaximum(180);
fieldOfView->setMinimum(1);
fieldOfView->setValue(_fieldOfView);
form->addRow("Vertical Field of View (Degrees):", fieldOfView);
QDoubleSpinBox* leanScale = new QDoubleSpinBox();
leanScale->setValue(applicationInstance->getAvatar()->getLeanScale());
form->addRow("Lean Scale:", leanScale);
QDoubleSpinBox* avatarScale = new QDoubleSpinBox();
avatarScale->setValue(applicationInstance->getAvatar()->getScale());
form->addRow("Avatar Scale:", avatarScale);
QSpinBox* audioJitterBufferSamples = new QSpinBox();
audioJitterBufferSamples->setMaximum(10000);
audioJitterBufferSamples->setMinimum(-10000);
@ -853,93 +859,93 @@ void Menu::editPreferences() {
maxVoxelsPPS->setSingleStep(STEP_MAX_VOXELS_PPS);
maxVoxelsPPS->setValue(_maxVoxelPacketsPerSecond);
form->addRow("Maximum Voxels Packets Per Second:", maxVoxelsPPS);
QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
dialog.connect(buttons, SIGNAL(accepted()), SLOT(accept()));
dialog.connect(buttons, SIGNAL(rejected()), SLOT(reject()));
layout->addWidget(buttons);
int ret = dialog.exec();
if (ret == QDialog::Accepted) {
QUrl faceModelURL(faceURLEdit->text());
if (faceModelURL.toString() != faceURLString) {
// change the faceModelURL in the profile, it will also update this user's BlendFace
applicationInstance->getProfile()->setFaceModelURL(faceModelURL);
// send the new face mesh URL to the data-server (if we have a client UUID)
DataServerClient::putValueForKey(DataServerKey::FaceMeshURL,
faceModelURL.toString().toLocal8Bit().constData());
}
QUrl skeletonModelURL(skeletonURLEdit->text());
if (skeletonModelURL.toString() != skeletonURLString) {
// change the skeletonModelURL in the profile, it will also update this user's Body
applicationInstance->getProfile()->setSkeletonModelURL(skeletonModelURL);
// send the new skeleton model URL to the data-server (if we have a client UUID)
DataServerClient::putValueForKey(DataServerKey::SkeletonURL,
skeletonModelURL.toString().toLocal8Bit().constData());
}
applicationInstance->getAvatar()->getHead().setPupilDilation(pupilDilation->value() / (float)pupilDilation->maximum());
_maxVoxels = maxVoxels->value();
applicationInstance->getVoxels()->setMaxVoxels(_maxVoxels);
_maxVoxelPacketsPerSecond = maxVoxelsPPS->value();
applicationInstance->getAvatar()->setLeanScale(leanScale->value());
applicationInstance->getAvatar()->setClampedTargetScale(avatarScale->value());
_audioJitterBufferSamples = audioJitterBufferSamples->value();
if (_audioJitterBufferSamples != 0) {
applicationInstance->getAudio()->setJitterBufferSamples(_audioJitterBufferSamples);
}
_fieldOfView = fieldOfView->value();
applicationInstance->resizeGL(applicationInstance->getGLWidget()->width(), applicationInstance->getGLWidget()->height());
_faceshiftEyeDeflection = faceshiftEyeDeflection->value() / (float)faceshiftEyeDeflection->maximum();
}
sendFakeEnterEvent();
}
void Menu::goToDomain() {
QString currentDomainHostname = NodeList::getInstance()->getDomainHostname();
if (NodeList::getInstance()->getDomainPort() != DEFAULT_DOMAIN_SERVER_PORT) {
// add the port to the currentDomainHostname string if it is custom
currentDomainHostname.append(QString(":%1").arg(NodeList::getInstance()->getDomainPort()));
}
QInputDialog domainDialog(Application::getInstance()->getWindow());
domainDialog.setWindowTitle("Go to Domain");
domainDialog.setLabelText("Domain server:");
domainDialog.setTextValue(currentDomainHostname);
domainDialog.setWindowFlags(Qt::Sheet);
domainDialog.resize(domainDialog.parentWidget()->size().width() * DIALOG_RATIO_OF_WINDOW, domainDialog.size().height());
int dialogReturn = domainDialog.exec();
if (dialogReturn == QDialog::Accepted) {
QString newHostname(DEFAULT_DOMAIN_HOSTNAME);
if (domainDialog.textValue().size() > 0) {
// the user input a new hostname, use that
newHostname = domainDialog.textValue();
}
// send a node kill request, indicating to other clients that they should play the "disappeared" effect
NodeList::getInstance()->sendKillNode(&NODE_TYPE_AVATAR_MIXER, 1);
// give our nodeList the new domain-server hostname
NodeList::getInstance()->setDomainHostname(domainDialog.textValue());
}
sendFakeEnterEvent();
}
@ -948,8 +954,8 @@ void Menu::goToLocation() {
glm::vec3 avatarPos = myAvatar->getPosition();
QString currentLocation = QString("%1, %2, %3").arg(QString::number(avatarPos.x),
QString::number(avatarPos.y), QString::number(avatarPos.z));
QInputDialog coordinateDialog(Application::getInstance()->getWindow());
coordinateDialog.setWindowTitle("Go to Location");
coordinateDialog.setLabelText("Coordinate as x,y,z:");
@ -960,10 +966,10 @@ void Menu::goToLocation() {
int dialogReturn = coordinateDialog.exec();
if (dialogReturn == QDialog::Accepted && !coordinateDialog.textValue().isEmpty()) {
QByteArray newCoordinates;
QString delimiterPattern(",");
QStringList coordinateItems = coordinateDialog.textValue().split(delimiterPattern);
const int NUMBER_OF_COORDINATE_ITEMS = 3;
const int X_ITEM = 0;
const int Y_ITEM = 1;
@ -973,17 +979,17 @@ void Menu::goToLocation() {
double y = coordinateItems[Y_ITEM].toDouble();
double z = coordinateItems[Z_ITEM].toDouble();
glm::vec3 newAvatarPos(x, y, z);
if (newAvatarPos != avatarPos) {
// send a node kill request, indicating to other clients that they should play the "disappeared" effect
NodeList::getInstance()->sendKillNode(&NODE_TYPE_AVATAR_MIXER, 1);
qDebug("Going To Location: %f, %f, %f...", x, y, z);
myAvatar->setPosition(newAvatarPos);
myAvatar->setPosition(newAvatarPos);
}
}
}
sendFakeEnterEvent();
}
@ -995,7 +1001,7 @@ void Menu::goToUser() {
userDialog.setTextValue(username);
userDialog.setWindowFlags(Qt::Sheet);
userDialog.resize(userDialog.parentWidget()->size().width() * DIALOG_RATIO_OF_WINDOW, userDialog.size().height());
int dialogReturn = userDialog.exec();
if (dialogReturn == QDialog::Accepted && !userDialog.textValue().isEmpty()) {
// there's a username entered by the user, make a request to the data-server
@ -1003,7 +1009,7 @@ void Menu::goToUser() {
QStringList() << DataServerKey::Domain << DataServerKey::Position << DataServerKey::Orientation,
userDialog.textValue());
}
sendFakeEnterEvent();
}
@ -1014,15 +1020,15 @@ void Menu::pasteToVoxel() {
QString octalCode = "";
pasteToOctalCodeDialog.setTextValue(octalCode);
pasteToOctalCodeDialog.setWindowFlags(Qt::Sheet);
pasteToOctalCodeDialog.resize(pasteToOctalCodeDialog.parentWidget()->size().width() * DIALOG_RATIO_OF_WINDOW,
pasteToOctalCodeDialog.resize(pasteToOctalCodeDialog.parentWidget()->size().width() * DIALOG_RATIO_OF_WINDOW,
pasteToOctalCodeDialog.size().height());
int dialogReturn = pasteToOctalCodeDialog.exec();
if (dialogReturn == QDialog::Accepted && !pasteToOctalCodeDialog.textValue().isEmpty()) {
// we got an octalCode to paste to...
QString locationToPaste = pasteToOctalCodeDialog.textValue();
unsigned char* octalCodeDestination = hexStringToOctalCode(locationToPaste);
// check to see if it was a legit octcode...
if (locationToPaste == octalCodeToHexString(octalCodeDestination)) {
Application::getInstance()->pasteVoxelsToOctalCode(octalCodeDestination);
@ -1030,7 +1036,7 @@ void Menu::pasteToVoxel() {
qDebug() << "Problem with octcode...";
}
}
sendFakeEnterEvent();
}
@ -1039,7 +1045,7 @@ void Menu::bandwidthDetails() {
_bandwidthDialog = new BandwidthDialog(Application::getInstance()->getGLWidget(),
Application::getInstance()->getBandwidthMeter());
connect(_bandwidthDialog, SIGNAL(closed()), SLOT(bandwidthDetailsClosed()));
_bandwidthDialog->show();
}
_bandwidthDialog->raise();
@ -1112,7 +1118,7 @@ void Menu::updateVoxelModeActions() {
void Menu::chooseVoxelPaintColor() {
Application* appInstance = Application::getInstance();
QAction* paintColor = _actionHash.value(MenuOption::VoxelPaintColor);
QColor selected = QColorDialog::getColor(paintColor->data().value<QColor>(),
appInstance->getGLWidget(),
"Voxel Paint Color");
@ -1120,7 +1126,7 @@ void Menu::chooseVoxelPaintColor() {
paintColor->setData(selected);
paintColor->setIcon(Swatch::createIcon(selected));
}
// restore the main window's active state
appInstance->getWindow()->activateWindow();
}

View file

@ -44,12 +44,12 @@ class Menu : public QMenuBar, public AbstractMenuInterface {
public:
static Menu* getInstance();
~Menu();
bool isOptionChecked(const QString& menuOption);
void triggerOption(const QString& menuOption);
QAction* getActionForOption(const QString& menuOption);
bool isVoxelModeActionChecked();
float getAudioJitterBufferSamples() const { return _audioJitterBufferSamples; }
float getFieldOfView() const { return _fieldOfView; }
float getFaceshiftEyeDeflection() const { return _faceshiftEyeDeflection; }
@ -61,7 +61,7 @@ public:
int getMaxVoxels() const { return _maxVoxels; }
QAction* getUseVoxelShader() const { return _useVoxelShader; }
void handleViewFrustumOffsetKeyModifier(int key);
// User Tweakable LOD Items
@ -69,10 +69,10 @@ public:
float getVoxelSizeScale() const { return _voxelSizeScale; }
void setBoundaryLevelAdjust(int boundaryLevelAdjust);
int getBoundaryLevelAdjust() const { return _boundaryLevelAdjust; }
// User Tweakable PPS from Voxel Server
int getMaxVoxelPacketsPerSecond() const { return _maxVoxelPacketsPerSecond; }
virtual QMenu* getActiveScriptsMenu() { return _activeScriptsMenu;}
virtual QAction* addActionToQMenuAndActionHash(QMenu* destinationMenu,
const QString actionName,
@ -81,7 +81,7 @@ public:
const char* member = NULL,
QAction::MenuRole role = QAction::NoRole);
virtual void removeAction(QMenu* menu, const QString& actionName);
public slots:
void bandwidthDetails();
void voxelStatsDetails();
@ -92,7 +92,7 @@ public slots:
void exportSettings();
void goToUser();
void pasteToVoxel();
private slots:
void aboutApp();
void login();
@ -107,30 +107,30 @@ private slots:
void chooseVoxelPaintColor();
void runTests();
void resetSwatchColors();
private:
static Menu* _instance;
Menu();
typedef void(*settingsAction)(QSettings*, QAction*);
static void loadAction(QSettings* set, QAction* action);
static void saveAction(QSettings* set, QAction* action);
void scanMenuBar(settingsAction modifySetting, QSettings* set);
void scanMenu(QMenu* menu, settingsAction modifySetting, QSettings* set);
/// helper method to have separators with labels that are also compatible with OS X
void addDisabledActionAndSeparator(QMenu* destinationMenu, const QString& actionName);
QAction* addCheckableActionToQMenuAndActionHash(QMenu* destinationMenu,
const QString actionName,
const QKeySequence& shortcut = 0,
const bool checked = false,
const QObject* receiver = NULL,
const char* member = NULL);
void updateFrustumRenderModeAction();
QHash<QString, QAction*> _actionHash;
int _audioJitterBufferSamples; /// number of extra samples to wait before starting audio playback
BandwidthDialog* _bandwidthDialog;
@ -171,6 +171,7 @@ namespace MenuOption {
const QString DestructiveAddVoxel = "Create Voxel is Destructive";
const QString DisableColorVoxels = "Disable Colored Voxels";
const QString DisableDeltaSending = "Disable Delta Sending";
const QString DisableLocalVoxelCache = "Disable Local Voxel Cache";
const QString DisableLowRes = "Disable Lower Resolution While Moving";
const QString DisplayFrustum = "Display Frustum";
const QString DisplayLeapHands = "Display Leap Hands";

View file

@ -10,6 +10,9 @@
#include <cstring>
#include <algorithm>
#include <stdint.h>
#include <QtCore/QDebug>
#include "InterfaceConfig.h"
#include "Oscilloscope.h"
@ -72,7 +75,7 @@ void Oscilloscope::addSamples(const QByteArray& audioByteArray, bool isStereo, b
return;
}
int numSamplesPerChannel = audioByteArray.size() / (sizeof(int16_t) * (isStereo ? 2 : 1));
unsigned numSamplesPerChannel = audioByteArray.size() / (sizeof(int16_t) * (isStereo ? 2 : 1));
int16_t* samples = (int16_t*) audioByteArray.data();
for (int channel = 0; channel < (isStereo ? 2 : 1); channel++) {
@ -103,7 +106,7 @@ void Oscilloscope::addSamples(const QByteArray& audioByteArray, bool isStereo, b
}
} else {
// we have interleaved samples we need to separate into two channels
for (int i = 0; i < numSamplesPerChannel + n2; i++) {
for (unsigned i = 0; i < numSamplesPerChannel + n2; i++) {
if (i < numSamplesPerChannel - n2) {
_samples[writePos] = samples[(i * 2) + channel];
} else {

View file

@ -6,7 +6,10 @@
// Copyright (c) 2013 High Fidelity, Inc. All rights reserved.
//
#include <arpa/inet.h>
#ifndef _WIN32
#include <arpa/inet.h> // not available on windows
#endif
#include <string.h>
#include <stdio.h>
@ -22,23 +25,23 @@ const int PAIRING_SERVER_PORT = 7247;
PairingHandler* PairingHandler::getInstance() {
static PairingHandler* instance = NULL;
if (!instance) {
instance = new PairingHandler();
}
return instance;
}
void PairingHandler::sendPairRequest() {
// prepare the pairing request packet
NodeList* nodeList = NodeList::getInstance();
// use the getLocalAddress helper to get this client's listening address
quint32 localAddress = htonl(getHostOrderLocalAddress());
char pairPacket[24] = {};
sprintf(pairPacket, "Find %d.%d.%d.%d:%hu",
localAddress & 0xFF,
@ -46,11 +49,10 @@ void PairingHandler::sendPairRequest() {
(localAddress >> 16) & 0xFF,
(localAddress >> 24) & 0xFF,
NodeList::getInstance()->getNodeSocket().localPort());
qDebug("Sending pair packet: %s", pairPacket);
HifiSockAddr pairingServerSocket(PAIRING_SERVER_HOSTNAME, PAIRING_SERVER_PORT);
// send the pair request to the pairing server
nodeList->getNodeSocket().writeDatagram((char*) pairPacket, strlen(pairPacket),
pairingServerSocket.getAddress(), pairingServerSocket.getPort());

View file

@ -63,11 +63,10 @@ void PieMenu::render() {
return;
}
float start = M_PI / 2.0f;
float end = start + 2.0f * M_PI;
float step = 2.0f * M_PI / 100.0f;
float distance = sqrt((_mouseX - _x) * (_mouseX - _x) +
(_mouseY - _y) * (_mouseY - _y));
float start = (float)M_PI / 2.0f;
float end = start + 2.0f * (float)M_PI;
float step = 2.0f * (float)M_PI / 100.0f;
float distance = sqrt((float)(_mouseX - _x) * (_mouseX - _x) + (_mouseY - _y) * (_mouseY - _y));
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, _textureID);
@ -75,7 +74,7 @@ void PieMenu::render() {
glColor3f(1.0f, 1.0f, 1.0f);
if (_radiusIntern < distance) {
float angle = atan2((_mouseY - _y), (_mouseX - _x)) - start;
float angle = atan2((float)(_mouseY - _y), (float)(_mouseX - _x)) - start;
angle = (0.0f < angle) ? angle : angle + 2.0f * M_PI;
_selectedAction = floor(angle / (2.0f * M_PI / _actions.size()));
@ -130,7 +129,7 @@ void PieMenu::mousePressEvent(int x, int y) {
}
void PieMenu::mouseReleaseEvent(int x, int y) {
if (0 <= _selectedAction && _selectedAction < _actions.size() && _actions[_selectedAction]) {
if (0 <= _selectedAction && _selectedAction < (int)_actions.size() && _actions[_selectedAction]) {
_actions[_selectedAction]->trigger();
}

View file

@ -25,6 +25,12 @@
#include "Util.h"
#ifdef _WIN32
int isnan(double value) { return _isnan(value); }
#else
int isnan(double value) { return std::isnan(value); }
#endif
using namespace std;
// no clue which versions are affected...
@ -37,14 +43,14 @@ void eulerToOrthonormals(glm::vec3 * angles, glm::vec3 * front, glm::vec3 * righ
//
// Angles contains (pitch, yaw, roll) in radians
//
// First, create the quaternion associated with these euler angles
glm::quat q(glm::vec3(angles->x, -(angles->y), angles->z));
// Next, create a rotation matrix from that quaternion
glm::mat4 rotation;
rotation = glm::mat4_cast(q);
// Transform the original vectors by the rotation matrix to get the new vectors
glm::vec4 qup(0,1,0,0);
glm::vec4 qright(-1,0,0,0);
@ -52,7 +58,7 @@ void eulerToOrthonormals(glm::vec3 * angles, glm::vec3 * front, glm::vec3 * righ
glm::vec4 upNew = qup*rotation;
glm::vec4 rightNew = qright*rotation;
glm::vec4 frontNew = qfront*rotation;
// Copy the answers to output vectors
up->x = upNew.x; up->y = upNew.y; up->z = upNew.z;
right->x = rightNew.x; right->y = rightNew.y; right->z = rightNew.z;
@ -68,12 +74,12 @@ float azimuth_to(glm::vec3 head_pos, glm::vec3 source_pos) {
return atan2(head_pos.x - source_pos.x, head_pos.z - source_pos.z) * 180.0f / PIf;
}
// Return the angle in degrees between the head and an object in the scene. The value is zero if you are looking right at it. The angle is negative if the object is to your right.
// Return the angle in degrees between the head and an object in the scene. The value is zero if you are looking right at it. The angle is negative if the object is to your right.
float angle_to(glm::vec3 head_pos, glm::vec3 source_pos, float render_yaw, float head_yaw) {
return atan2(head_pos.x - source_pos.x, head_pos.z - source_pos.z) * 180.0f / PIf + render_yaw + head_yaw;
}
// Helper function returns the positive angle in degrees between two 3D vectors
// Helper function returns the positive angle in degrees between two 3D vectors
float angleBetween(const glm::vec3& v1, const glm::vec3& v2) {
return acos((glm::dot(v1, v2)) / (glm::length(v1) * glm::length(v2))) * 180.f / PIf;
}
@ -92,7 +98,7 @@ glm::quat rotationBetween(const glm::vec3& v1, const glm::vec3& v2) {
axis = glm::normalize(glm::cross(v1, glm::vec3(0.0f, 1.0f, 0.0f)));
} else {
axis /= axisLength;
}
}
} else {
axis = glm::normalize(glm::cross(v1, v2));
}
@ -110,7 +116,7 @@ glm::vec3 safeEulerAngles(const glm::quat& q) {
atan2f(q.y * q.z + q.x * q.w, 0.5f - (q.x * q.x + q.y * q.y)),
asinf(sy),
atan2f(q.x * q.y + q.z * q.w, 0.5f - (q.y * q.y + q.z * q.z))));
} else {
// not a unique solution; x + z = atan2(-m21, m11)
return glm::degrees(glm::vec3(
@ -149,7 +155,7 @@ glm::quat safeMix(const glm::quat& q1, const glm::quat& q2, float proportion) {
float angle = acosf(cosa), sina = sinf(angle);
s0 = sinf((1.0f - proportion) * angle) / sina;
s1 = sinf(proportion * angle) / sina;
} else {
s0 = 1.0f - proportion;
s1 = proportion;
@ -179,7 +185,7 @@ glm::quat extractRotation(const glm::mat4& matrix, bool assumeOrthogonal) {
for (int i = 0; i < 10; i++) {
// store the results of the previous iteration
glm::mat3 previous = upper;
// compute average of the matrix with its inverse transpose
float sd00 = previous[1][1] * previous[2][2] - previous[2][1] * previous[1][2];
float sd10 = previous[0][1] * previous[2][2] - previous[2][1] * previous[0][2];
@ -211,13 +217,13 @@ glm::quat extractRotation(const glm::mat4& matrix, bool assumeOrthogonal) {
}
}
}
// now that we have a nice orthogonal matrix, we can extract the rotation quaternion
// using the method described in http://en.wikipedia.org/wiki/Rotation_matrix#Conversions
float x2 = fabs(1.0f + upper[0][0] - upper[1][1] - upper[2][2]);
float y2 = fabs(1.0f - upper[0][0] + upper[1][1] - upper[2][2]);
float z2 = fabs(1.0f - upper[0][0] - upper[1][1] + upper[2][2]);
float w2 = fabs(1.0f + upper[0][0] + upper[1][1] + upper[2][2]);
float w2 = fabs(1.0f + upper[0][0] + upper[1][1] + upper[2][2]);
return glm::normalize(glm::quat(0.5f * sqrtf(w2),
0.5f * sqrtf(x2) * (upper[1][2] >= upper[2][1] ? 1.0f : -1.0f),
0.5f * sqrtf(y2) * (upper[2][0] >= upper[0][2] ? 1.0f : -1.0f),
@ -255,14 +261,14 @@ void drawVector(glm::vec3 * vector) {
glVertex3f(0,0,0);
glVertex3f(0, 0, 1);
glEnd();
// Draw the vector itself
glBegin(GL_LINES);
glColor3f(1,1,1);
glVertex3f(0,0,0);
glVertex3f(vector->x, vector->y, vector->z);
glEnd();
// Draw spheres for magnitude
glPushMatrix();
glColor3f(1,0,0);
@ -284,10 +290,10 @@ void noiseTest(int w, int h) {
const float NOISE_SCALE = 10.0;
float xStep = (float) w / CELLS;
float yStep = (float) h / CELLS;
glBegin(GL_QUADS);
glBegin(GL_QUADS);
for (float x = 0; x < (float)w; x += xStep) {
for (float y = 0; y < (float)h; y += yStep) {
// Generate a vector varying between 0-1 corresponding to the screen location
// Generate a vector varying between 0-1 corresponding to the screen location
glm::vec2 position(NOISE_SCALE * x / (float) w, NOISE_SCALE * y / (float) h);
// Set the cell color using the noise value at that location
float color = glm::perlin(position);
@ -300,14 +306,14 @@ void noiseTest(int w, int h) {
}
glEnd();
}
void renderWorldBox() {
// Show edge of world
float red[] = {1, 0, 0};
float green[] = {0, 1, 0};
float blue[] = {0, 0, 1};
float gray[] = {0.5, 0.5, 0.5};
glDisable(GL_LIGHTING);
glLineWidth(1.0);
glBegin(GL_LINES);
@ -355,7 +361,7 @@ double diffclock(timeval *clock1,timeval *clock2)
{
double diffms = (clock2->tv_sec - clock1->tv_sec) * 1000.0;
diffms += (clock2->tv_usec - clock1->tv_usec) / 1000.0; // us to ms
return diffms;
}
@ -389,9 +395,9 @@ void drawtext(int x, int y, float scale, float rotate, float thick, int mono,
glRotated(rotate,0,0,1);
// glLineWidth(thick);
glScalef(scale / 0.10, scale / 0.10, 1.0);
textRenderer(mono)->draw(0, 0, string);
glPopMatrix();
}
@ -416,7 +422,7 @@ void drawvec3(int x, int y, float scale, float rotate, float thick, int mono, gl
else glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN, int(vectext[i]));
}
glPopMatrix();
}
}
void renderCollisionOverlay(int width, int height, float magnitude) {
const float MIN_VISIBLE_COLLISION = 0.01f;
@ -435,7 +441,7 @@ void renderMouseVoxelGrid(const float& mouseVoxelX, const float& mouseVoxelY, co
glm::vec3 origin = glm::vec3(mouseVoxelX, mouseVoxelY, mouseVoxelZ);
glLineWidth(3.0);
const int HALF_GRID_DIMENSIONS = 4;
glBegin(GL_LINES);
@ -463,7 +469,7 @@ void renderNudgeGrid(float voxelX, float voxelY, float voxelZ, float voxelS, flo
glm::vec3 origin = glm::vec3(voxelX, voxelY, voxelZ);
glLineWidth(1.0);
const int GRID_DIMENSIONS = 4;
const int GRID_SCALER = voxelS / voxelPrecision;
const int GRID_SEGMENTS = GRID_DIMENSIONS * GRID_SCALER;
@ -485,7 +491,7 @@ void renderNudgeGrid(float voxelX, float voxelY, float voxelZ, float voxelS, flo
glEnd();
glColor3f(1.0f,1.0f,1.0f);
glBegin(GL_POLYGON);//begin drawing of square
glVertex3f(voxelX, 0.0f, voxelZ);//first vertex
glVertex3f(voxelX + voxelS, 0.0f, voxelZ);//second vertex
@ -498,7 +504,7 @@ void renderNudgeGuide(float voxelX, float voxelY, float voxelZ, float voxelS) {
glm::vec3 origin = glm::vec3(voxelX, voxelY, voxelZ);
glLineWidth(3.0);
glBegin(GL_LINES);
glm::vec3 guideColor(1.0, 1.0, 1.0);
@ -526,21 +532,21 @@ void renderSphereOutline(glm::vec3 position, float radius, int numSides, glm::ve
glm::vec3 vectorToPosition(glm::normalize(position - cameraPosition));
glm::vec3 right = glm::cross(vectorToPosition, glm::vec3(0.0f, 1.0f, 0.0f));
glm::vec3 up = glm::cross(right, vectorToPosition);
glBegin(GL_LINE_STRIP);
glBegin(GL_LINE_STRIP);
for (int i=0; i<numSides+1; i++) {
float r = ((float)i / (float)numSides) * PIf * 2.0;
float s = radius * sin(r);
float c = radius * cos(r);
glVertex3f
(
position.x + right.x * s + up.x * c,
position.y + right.y * s + up.y * c,
position.z + right.z * s + up.z * c
);
position.x + right.x * s + up.x * c,
position.y + right.y * s + up.y * c,
position.z + right.z * s + up.z * c
);
}
glEnd();
}
@ -548,8 +554,8 @@ void renderSphereOutline(glm::vec3 position, float radius, int numSides, glm::ve
void renderCircle(glm::vec3 position, float radius, glm::vec3 surfaceNormal, int numSides) {
glm::vec3 perp1 = glm::vec3(surfaceNormal.y, surfaceNormal.z, surfaceNormal.x);
glm::vec3 perp2 = glm::vec3(surfaceNormal.z, surfaceNormal.x, surfaceNormal.y);
glBegin(GL_LINE_STRIP);
glBegin(GL_LINE_STRIP);
for (int i=0; i<numSides+1; i++) {
float r = ((float)i / (float)numSides) * PIf * 2.0;
@ -557,10 +563,10 @@ void renderCircle(glm::vec3 position, float radius, glm::vec3 surfaceNormal, int
float c = radius * cos(r);
glVertex3f
(
position.x + perp1.x * s + perp2.x * c,
position.y + perp1.y * s + perp2.y * c,
position.z + perp1.z * s + perp2.z * c
);
position.x + perp1.x * s + perp2.x * c,
position.y + perp1.y * s + perp2.y * c,
position.z + perp1.z * s + perp2.z * c
);
}
glEnd();
}
@ -570,7 +576,7 @@ void renderOrientationDirections(glm::vec3 position, const glm::quat& orientatio
glm::vec3 pRight = position + orientation * IDENTITY_RIGHT * size;
glm::vec3 pUp = position + orientation * IDENTITY_UP * size;
glm::vec3 pFront = position + orientation * IDENTITY_FRONT * size;
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_LINE_STRIP);
glVertex3f(position.x, position.y, position.z);
@ -653,11 +659,11 @@ void runTimingTests() {
elapsedMsecs = diffclock(&startTime, &endTime);
qDebug("vector math usecs: %f [%f msecs total for %d tests]",
1000.0f * elapsedMsecs / (float) numTests, elapsedMsecs, numTests);
// Vec3 test
glm::vec3 vecA(randVector()), vecB(randVector());
float result;
gettimeofday(&startTime, NULL);
for (int i = 1; i < numTests; i++) {
glm::vec3 temp = vecA-vecB;
@ -679,32 +685,32 @@ float loadSetting(QSettings* settings, const char* name, float defaultValue) {
bool rayIntersectsSphere(const glm::vec3& rayStarting, const glm::vec3& rayNormalizedDirection,
const glm::vec3& sphereCenter, float sphereRadius, float& distance) {
glm::vec3 relativeOrigin = rayStarting - sphereCenter;
// compute the b, c terms of the quadratic equation (a is dot(direction, direction), which is one)
float b = 2.0f * glm::dot(rayNormalizedDirection, relativeOrigin);
float c = glm::dot(relativeOrigin, relativeOrigin) - sphereRadius * sphereRadius;
// compute the radicand of the quadratic. if less than zero, there's no intersection
float radicand = b * b - 4.0f * c;
if (radicand < 0.0f) {
return false;
}
// compute the first solution of the quadratic
float root = sqrtf(radicand);
float firstSolution = -b - root;
if (firstSolution > 0.0f) {
distance = firstSolution / 2.0f;
distance = firstSolution / 2.0f;
return true; // origin is outside the sphere
}
// now try the second solution
float secondSolution = -b + root;
if (secondSolution > 0.0f) {
distance = 0.0f;
return true; // origin is inside the sphere
}
return false;
}

View file

@ -6,16 +6,11 @@
// Copyright (c) 2012 High Fidelity, Inc. All rights reserved.
//
#ifdef _WIN32
#define _timeval_
#define _USE_MATH_DEFINES
#endif
#include <cstring>
#include <cmath>
#include <iostream> // to load voxels from file
#include <fstream> // to load voxels from file
#include <pthread.h>
#include <OctalCode.h>
#include <PacketHeaders.h>
@ -74,9 +69,6 @@ VoxelSystem::VoxelSystem(float treeScale, int maxVoxels)
_tree = new VoxelTree();
_tree->getRoot()->setVoxelSystem(this);
pthread_mutex_init(&_bufferWriteLock, NULL);
pthread_mutex_init(&_treeLock, NULL);
pthread_mutex_init(&_freeIndexLock, NULL);
VoxelTreeElement::addDeleteHook(this);
VoxelTreeElement::addUpdateHook(this);
@ -188,10 +180,10 @@ glBufferIndex VoxelSystem::getNextBufferIndex() {
glBufferIndex output = GLBUFFER_INDEX_UNKNOWN;
// if there's a free index, use it...
if (_freeIndexes.size() > 0) {
pthread_mutex_lock(&_freeIndexLock);
_freeIndexLock.lock();
output = _freeIndexes.back();
_freeIndexes.pop_back();
pthread_mutex_unlock(&_freeIndexLock);
_freeIndexLock.unlock();
} else {
output = _voxelsInWriteArrays;
_voxelsInWriteArrays++;
@ -212,7 +204,7 @@ void VoxelSystem::freeBufferIndex(glBufferIndex index) {
// make sure the index isn't already in the free list..., this is a debugging measure only done if you've enabled audits
if (Menu::getInstance()->isOptionChecked(MenuOption::AutomaticallyAuditTree)) {
for (long i = 0; i < _freeIndexes.size(); i++) {
for (unsigned long i = 0; i < _freeIndexes.size(); i++) {
if (_freeIndexes[i] == index) {
printf("freeBufferIndex(glBufferIndex index)... index=%ld already in free list!", index);
inList = true;
@ -222,9 +214,9 @@ void VoxelSystem::freeBufferIndex(glBufferIndex index) {
}
if (!inList) {
// make the index available for next node that needs to be drawn
pthread_mutex_lock(&_freeIndexLock);
_freeIndexLock.lock();
_freeIndexes.push_back(index);
pthread_mutex_unlock(&_freeIndexLock);
_freeIndexLock.unlock();
// make the VBO slot "invisible" in case this slot is not used
const glm::vec3 startVertex(FLT_MAX, FLT_MAX, FLT_MAX);
@ -243,14 +235,14 @@ void VoxelSystem::clearFreeBufferIndexes() {
// clear out freeIndexes
{
PerformanceWarning warn(showWarnings,"clearFreeBufferIndexes() : pthread_mutex_lock(&_freeIndexLock)");
pthread_mutex_lock(&_freeIndexLock);
PerformanceWarning warn(showWarnings,"clearFreeBufferIndexes() : _freeIndexLock.lock()");
_freeIndexLock.lock();
}
{
PerformanceWarning warn(showWarnings,"clearFreeBufferIndexes() : _freeIndexes.clear()");
_freeIndexes.clear();
}
pthread_mutex_unlock(&_freeIndexLock);
_freeIndexLock.unlock();
}
VoxelSystem::~VoxelSystem() {
@ -259,9 +251,6 @@ VoxelSystem::~VoxelSystem() {
cleanupVoxelMemory();
delete _tree;
pthread_mutex_destroy(&_bufferWriteLock);
pthread_mutex_destroy(&_treeLock);
pthread_mutex_destroy(&_freeIndexLock);
}
void VoxelSystem::setMaxVoxels(int maxVoxels) {
@ -345,7 +334,7 @@ void VoxelSystem::setVoxelsAsPoints(bool voxelsAsPoints) {
void VoxelSystem::cleanupVoxelMemory() {
if (_initialized) {
pthread_mutex_lock(&_bufferWriteLock);
_bufferWriteLock.lock();
_initialized = false; // no longer initialized
if (_useVoxelShader) {
// these are used when in VoxelShader mode.
@ -383,7 +372,7 @@ void VoxelSystem::cleanupVoxelMemory() {
delete[] _writeVoxelDirtyArray;
delete[] _readVoxelDirtyArray;
_writeVoxelDirtyArray = _readVoxelDirtyArray = NULL;
pthread_mutex_unlock(&_bufferWriteLock);
_bufferWriteLock.unlock();
}
}
@ -392,7 +381,7 @@ void VoxelSystem::setupFaceIndices(GLuint& faceVBOID, GLubyte faceIdentityIndice
// populate the indicesArray
// this will not change given new voxels, so we can set it all up now
for (int n = 0; n < _maxVoxels; n++) {
for (unsigned long n = 0; n < _maxVoxels; n++) {
// fill the indices array
int voxelIndexOffset = n * INDICES_PER_FACE;
GLuint* currentIndicesPos = indicesArray + voxelIndexOffset;
@ -416,7 +405,7 @@ void VoxelSystem::setupFaceIndices(GLuint& faceVBOID, GLubyte faceIdentityIndice
}
void VoxelSystem::initVoxelMemory() {
pthread_mutex_lock(&_bufferWriteLock);
_bufferWriteLock.lock();
_memoryUsageRAM = 0;
_memoryUsageVBO = 0; // our VBO allocations as we know them
@ -431,7 +420,7 @@ void VoxelSystem::initVoxelMemory() {
// populate the indicesArray
// this will not change given new voxels, so we can set it all up now
for (int n = 0; n < _maxVoxels; n++) {
for (unsigned long n = 0; n < _maxVoxels; n++) {
indicesArray[n] = n;
}
@ -531,7 +520,7 @@ void VoxelSystem::initVoxelMemory() {
_initialized = true;
pthread_mutex_unlock(&_bufferWriteLock);
_bufferWriteLock.unlock();
}
void VoxelSystem::writeToSVOFile(const char* filename, VoxelTreeElement* element) const {
@ -685,7 +674,7 @@ void VoxelSystem::setupNewVoxelsForDrawing() {
}
// lock on the buffer write lock so we can't modify the data when the GPU is reading it
pthread_mutex_lock(&_bufferWriteLock);
_bufferWriteLock.lock();
if (_voxelsUpdated) {
_voxelsDirty=true;
@ -694,7 +683,7 @@ void VoxelSystem::setupNewVoxelsForDrawing() {
// copy the newly written data to the arrays designated for reading, only does something if _voxelsDirty && _voxelsUpdated
copyWrittenDataToReadArrays(didWriteFullVBO);
pthread_mutex_unlock(&_bufferWriteLock);
_bufferWriteLock.unlock();
uint64_t end = usecTimestampNow();
int elapsedmsec = (end - start) / 1000;
@ -725,8 +714,8 @@ void VoxelSystem::setupNewVoxelsForDrawingSingleNode(bool allowBailEarly) {
// lock on the buffer write lock so we can't modify the data when the GPU is reading it
{
PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings),
"setupNewVoxelsForDrawingSingleNode()... pthread_mutex_lock(&_bufferWriteLock);");
pthread_mutex_lock(&_bufferWriteLock);
"setupNewVoxelsForDrawingSingleNode()... _bufferWriteLock.lock();" );
_bufferWriteLock.lock();
}
_voxelsDirty = true; // if we got this far, then we can assume some voxels are dirty
@ -737,7 +726,7 @@ void VoxelSystem::setupNewVoxelsForDrawingSingleNode(bool allowBailEarly) {
// after...
_voxelsUpdated = 0;
pthread_mutex_unlock(&_bufferWriteLock);
_bufferWriteLock.unlock();
uint64_t end = usecTimestampNow();
int elapsedmsec = (end - start) / 1000;
@ -1604,13 +1593,13 @@ void VoxelSystem::falseColorizeBySource() {
};
// create a bunch of colors we'll use during colorization
foreach (const SharedNodePointer& node, NodeList::getInstance()->getNodeHash()) {
if (node->getType() == NODE_TYPE_VOXEL_SERVER) {
uint16_t nodeID = VoxelTreeElement::getSourceNodeUUIDKey(node->getUUID());
int groupColor = voxelServerCount % NUMBER_OF_COLOR_GROUPS;
args.colors[nodeID] = groupColors[groupColor];
if (groupColors[groupColor].red > 0) {
groupColors[groupColor].red = ((groupColors[groupColor].red - MIN_COLOR)/2) + MIN_COLOR;
}
@ -1620,7 +1609,7 @@ void VoxelSystem::falseColorizeBySource() {
if (groupColors[groupColor].blue > 0) {
groupColors[groupColor].blue = ((groupColors[groupColor].blue - MIN_COLOR)/2) + MIN_COLOR;
}
voxelServerCount++;
}
}
@ -2398,12 +2387,6 @@ void VoxelSystem::createLine(glm::vec3 point1, glm::vec3 point2, float unitSize,
setupNewVoxelsForDrawing();
};
void VoxelSystem::createSphere(float r,float xc, float yc, float zc, float s, bool solid,
creationMode mode, bool destructive, bool debug) {
_tree->createSphere(r, xc, yc, zc, s, solid, mode, destructive, debug);
setupNewVoxelsForDrawing();
};
void VoxelSystem::copySubTreeIntoNewTree(VoxelTreeElement* startNode, VoxelSystem* destination, bool rebaseToRoot) {
_tree->copySubTreeIntoNewTree(startNode, destination->_tree, rebaseToRoot);
destination->setupNewVoxelsForDrawing();
@ -2766,13 +2749,13 @@ unsigned long VoxelSystem::getVoxelMemoryUsageGPU() {
}
void VoxelSystem::lockTree() {
pthread_mutex_lock(&_treeLock);
_treeLock.lock();
_treeIsBusy = true;
}
void VoxelSystem::unlockTree() {
_treeIsBusy = false;
pthread_mutex_unlock(&_treeLock);
_treeLock.unlock();
}

View file

@ -97,8 +97,6 @@ public:
void createVoxel(float x, float y, float z, float s,
unsigned char red, unsigned char green, unsigned char blue, bool destructive = false);
void createLine(glm::vec3 point1, glm::vec3 point2, float unitSize, rgbColor color, bool destructive = false);
void createSphere(float r,float xc, float yc, float zc, float s, bool solid,
creationMode mode, bool destructive = false, bool debug = false);
void copySubTreeIntoNewTree(VoxelTreeElement* startNode, VoxelSystem* destinationTree, bool rebaseToRoot);
void copySubTreeIntoNewTree(VoxelTreeElement* startNode, VoxelTree* destinationTree, bool rebaseToRoot);
@ -151,7 +149,7 @@ public slots:
protected:
float _treeScale;
int _maxVoxels;
unsigned long _maxVoxels;
VoxelTree* _tree;
void setupNewVoxelsForDrawing();
@ -260,8 +258,8 @@ private:
GLuint _vboIndicesFront;
GLuint _vboIndicesBack;
pthread_mutex_t _bufferWriteLock;
pthread_mutex_t _treeLock;
QMutex _bufferWriteLock;
QMutex _treeLock;
ViewFrustum _lastKnownViewFrustum;
ViewFrustum _lastStableViewFrustum;
@ -287,7 +285,7 @@ private:
int _hookID;
std::vector<glBufferIndex> _freeIndexes;
pthread_mutex_t _freeIndexLock;
QMutex _freeIndexLock;
void freeBufferIndex(glBufferIndex index);
void clearFreeBufferIndexes();

View file

@ -33,17 +33,17 @@ using namespace std;
const bool BALLS_ON = false;
const glm::vec3 DEFAULT_UP_DIRECTION(0.0f, 1.0f, 0.0f);
const float YAW_MAG = 500.0;
const float MY_HAND_HOLDING_PULL = 0.2;
const float YOUR_HAND_HOLDING_PULL = 1.0;
const float YAW_MAG = 500.0f;
const float MY_HAND_HOLDING_PULL = 0.2f;
const float YOUR_HAND_HOLDING_PULL = 1.0f;
const float BODY_SPRING_DEFAULT_TIGHTNESS = 1000.0f;
const float BODY_SPRING_FORCE = 300.0f;
const float BODY_SPRING_DECAY = 16.0f;
const float COLLISION_RADIUS_SCALAR = 1.2; // pertains to avatar-to-avatar collisions
const float COLLISION_BALL_FORCE = 200.0; // pertains to avatar-to-avatar collisions
const float COLLISION_BODY_FORCE = 30.0; // pertains to avatar-to-avatar collisions
const float HEAD_ROTATION_SCALE = 0.70;
const float HEAD_ROLL_SCALE = 0.40;
const float COLLISION_RADIUS_SCALAR = 1.2f; // pertains to avatar-to-avatar collisions
const float COLLISION_BALL_FORCE = 200.0f; // pertains to avatar-to-avatar collisions
const float COLLISION_BODY_FORCE = 30.0f; // pertains to avatar-to-avatar collisions
const float HEAD_ROTATION_SCALE = 0.70f;
const float HEAD_ROLL_SCALE = 0.40f;
const float HEAD_MAX_PITCH = 45;
const float HEAD_MIN_PITCH = -45;
const float HEAD_MAX_YAW = 85;
@ -52,14 +52,14 @@ const float AVATAR_BRAKING_STRENGTH = 40.0f;
const float MOUSE_RAY_TOUCH_RANGE = 0.01f;
const float FLOATING_HEIGHT = 0.13f;
const bool USING_HEAD_LEAN = false;
const float LEAN_SENSITIVITY = 0.15;
const float LEAN_MAX = 0.45;
const float LEAN_AVERAGING = 10.0;
const float LEAN_SENSITIVITY = 0.15f;
const float LEAN_MAX = 0.45f;
const float LEAN_AVERAGING = 10.0f;
const float HEAD_RATE_MAX = 50.f;
const float SKIN_COLOR[] = {1.0, 0.84, 0.66};
const float DARK_SKIN_COLOR[] = {0.9, 0.78, 0.63};
const float SKIN_COLOR[] = {1.0f, 0.84f, 0.66f};
const float DARK_SKIN_COLOR[] = {0.9f, 0.78f, 0.63f};
const int NUM_BODY_CONE_SIDES = 9;
const float CHAT_MESSAGE_SCALE = 0.0015;
const float CHAT_MESSAGE_SCALE = 0.0015f;
const float CHAT_MESSAGE_HEIGHT = 0.1f;
void Avatar::sendAvatarURLsMessage(const QUrl& voxelURL) {
@ -248,7 +248,7 @@ void Avatar::render(bool forceRenderHead) {
glRotatef(glm::angle(chatRotation), chatAxis.x, chatAxis.y, chatAxis.z);
glColor3f(0, 0.8, 0);
glColor3f(0, 0.8f, 0);
glRotatef(180, 0, 1, 0);
glRotatef(180, 0, 0, 1);
glScalef(_scale * CHAT_MESSAGE_SCALE, _scale * CHAT_MESSAGE_SCALE, 1.0f);
@ -355,6 +355,55 @@ bool Avatar::findSpherePenetration(const glm::vec3& penetratorCenter, float pene
return false;
}
bool Avatar::findSphereCollision(const glm::vec3& sphereCenter, float sphereRadius, CollisionInfo& collision) {
// TODO: provide an early exit using bounding sphere of entire avatar
const HandData* handData = getHandData();
if (handData) {
int jointIndices[2] = { _skeletonModel.getLeftHandJointIndex(), _skeletonModel.getRightHandJointIndex() };
for (int i = 0; i < 2; i++) {
const PalmData* palm = handData->getPalm(i);
if (palm) {
// create a disk collision proxy where the hand is
glm::vec3 fingerAxis(0.f);
for (size_t f = 0; f < palm->getNumFingers(); ++f) {
const FingerData& finger = (palm->getFingers())[f];
if (finger.isActive()) {
// compute finger axis
glm::vec3 fingerTip = finger.getTipPosition();
glm::vec3 fingerRoot = finger.getRootPosition();
fingerAxis = glm::normalize(fingerTip - fingerRoot);
break;
}
}
glm::vec3 handPosition;
if (i == 0) {
_skeletonModel.getLeftHandPosition(handPosition);
}
else {
_skeletonModel.getRightHandPosition(handPosition);
}
glm::vec3 diskCenter = handPosition + HAND_PADDLE_OFFSET * fingerAxis;
glm::vec3 diskNormal = palm->getNormal();
// collide against the disk
if (findSphereDiskPenetration(sphereCenter, sphereRadius,
diskCenter, HAND_PADDLE_RADIUS, diskNormal, collision._penetration)) {
collision._addedVelocity = palm->getVelocity();
return true;
}
}
}
}
if (_skeletonModel.findSpherePenetration(sphereCenter, sphereRadius, collision._penetration)) {
collision._penetration /= (float)(TREE_SCALE);
collision._addedVelocity = getVelocity();
return true;
}
return false;
}
int Avatar::parseData(unsigned char* sourceBuffer, int numBytes) {
// change in position implies movement
glm::vec3 oldPosition = _position;

View file

@ -27,30 +27,30 @@ static const float SCALING_RATIO = .05f;
static const float SMOOTHING_RATIO = .05f; // 0 < ratio < 1
static const float RESCALING_TOLERANCE = .02f;
const float BODY_BALL_RADIUS_PELVIS = 0.07;
const float BODY_BALL_RADIUS_TORSO = 0.065;
const float BODY_BALL_RADIUS_CHEST = 0.08;
const float BODY_BALL_RADIUS_NECK_BASE = 0.03;
const float BODY_BALL_RADIUS_HEAD_BASE = 0.07;
const float BODY_BALL_RADIUS_LEFT_COLLAR = 0.04;
const float BODY_BALL_RADIUS_LEFT_SHOULDER = 0.03;
const float BODY_BALL_RADIUS_LEFT_ELBOW = 0.02;
const float BODY_BALL_RADIUS_LEFT_WRIST = 0.02;
const float BODY_BALL_RADIUS_LEFT_FINGERTIPS = 0.01;
const float BODY_BALL_RADIUS_RIGHT_COLLAR = 0.04;
const float BODY_BALL_RADIUS_RIGHT_SHOULDER = 0.03;
const float BODY_BALL_RADIUS_RIGHT_ELBOW = 0.02;
const float BODY_BALL_RADIUS_RIGHT_WRIST = 0.02;
const float BODY_BALL_RADIUS_RIGHT_FINGERTIPS = 0.01;
const float BODY_BALL_RADIUS_LEFT_HIP = 0.04;
const float BODY_BALL_RADIUS_LEFT_MID_THIGH = 0.03;
const float BODY_BALL_RADIUS_LEFT_KNEE = 0.025;
const float BODY_BALL_RADIUS_LEFT_HEEL = 0.025;
const float BODY_BALL_RADIUS_LEFT_TOES = 0.025;
const float BODY_BALL_RADIUS_RIGHT_HIP = 0.04;
const float BODY_BALL_RADIUS_RIGHT_KNEE = 0.025;
const float BODY_BALL_RADIUS_RIGHT_HEEL = 0.025;
const float BODY_BALL_RADIUS_RIGHT_TOES = 0.025;
const float BODY_BALL_RADIUS_PELVIS = 0.07f;
const float BODY_BALL_RADIUS_TORSO = 0.065f;
const float BODY_BALL_RADIUS_CHEST = 0.08f;
const float BODY_BALL_RADIUS_NECK_BASE = 0.03f;
const float BODY_BALL_RADIUS_HEAD_BASE = 0.07f;
const float BODY_BALL_RADIUS_LEFT_COLLAR = 0.04f;
const float BODY_BALL_RADIUS_LEFT_SHOULDER = 0.03f;
const float BODY_BALL_RADIUS_LEFT_ELBOW = 0.02f;
const float BODY_BALL_RADIUS_LEFT_WRIST = 0.02f;
const float BODY_BALL_RADIUS_LEFT_FINGERTIPS = 0.01f;
const float BODY_BALL_RADIUS_RIGHT_COLLAR = 0.04f;
const float BODY_BALL_RADIUS_RIGHT_SHOULDER = 0.03f;
const float BODY_BALL_RADIUS_RIGHT_ELBOW = 0.02f;
const float BODY_BALL_RADIUS_RIGHT_WRIST = 0.02f;
const float BODY_BALL_RADIUS_RIGHT_FINGERTIPS = 0.01f;
const float BODY_BALL_RADIUS_LEFT_HIP = 0.04f;
const float BODY_BALL_RADIUS_LEFT_MID_THIGH = 0.03f;
const float BODY_BALL_RADIUS_LEFT_KNEE = 0.025f;
const float BODY_BALL_RADIUS_LEFT_HEEL = 0.025f;
const float BODY_BALL_RADIUS_LEFT_TOES = 0.025f;
const float BODY_BALL_RADIUS_RIGHT_HIP = 0.04f;
const float BODY_BALL_RADIUS_RIGHT_KNEE = 0.025f;
const float BODY_BALL_RADIUS_RIGHT_HEEL = 0.025f;
const float BODY_BALL_RADIUS_RIGHT_TOES = 0.025f;
extern const bool usingBigSphereCollisionTest;
@ -59,12 +59,12 @@ extern const float CHAT_MESSAGE_HEIGHT;
enum AvatarBodyBallID {
BODY_BALL_NULL = -1,
BODY_BALL_PELVIS,
BODY_BALL_TORSO,
BODY_BALL_CHEST,
BODY_BALL_NECK_BASE,
BODY_BALL_HEAD_BASE,
BODY_BALL_HEAD_TOP,
BODY_BALL_PELVIS,
BODY_BALL_TORSO,
BODY_BALL_CHEST,
BODY_BALL_NECK_BASE,
BODY_BALL_HEAD_BASE,
BODY_BALL_HEAD_TOP,
BODY_BALL_LEFT_COLLAR,
BODY_BALL_LEFT_SHOULDER,
BODY_BALL_LEFT_ELBOW,
@ -89,11 +89,11 @@ enum AvatarBodyBallID {
enum DriveKeys {
FWD = 0,
BACK,
LEFT,
RIGHT,
LEFT,
RIGHT,
UP,
DOWN,
ROT_LEFT,
ROT_LEFT,
ROT_RIGHT,
ROT_UP,
ROT_DOWN,
@ -124,14 +124,14 @@ const glm::vec3 START_LOCATION(0.485f * TREE_SCALE, 0.f, 0.5f * TREE_SCALE);
class Avatar : public AvatarData {
Q_OBJECT
public:
static void sendAvatarURLsMessage(const QUrl& voxelURL);
Avatar(Node* owningNode = NULL);
~Avatar();
void deleteOrDeleteLater();
void init();
void simulate(float deltaTime, Transmitter* transmitter);
void render(bool forceRenderHead);
@ -167,10 +167,17 @@ public:
bool findSpherePenetration(const glm::vec3& penetratorCenter, float penetratorRadius,
glm::vec3& penetration, int skeletonSkipIndex = -1) const;
/// Checks for collision between the a sphere and the avatar.
/// \param collisionCenter the center of the penetration test sphere
/// \param collisionRadius the radius of the penetration test sphere
/// \param collision[out] the details of the collision point
/// \return whether or not the sphere collided
virtual bool findSphereCollision(const glm::vec3& sphereCenter, float sphereRadius, CollisionInfo& collision);
virtual int parseData(unsigned char* sourceBuffer, int numBytes);
static void renderJointConnectingCone(glm::vec3 position1, glm::vec3 position2, float radius1, float radius2);
public slots:
void setWantCollisionsOn(bool wantCollisionsOn) { _isCollisionsOn = wantCollisionsOn; }
void goHome();
@ -185,14 +192,14 @@ protected:
struct AvatarBall {
AvatarJointID parentJoint; /// the skeletal joint that serves as a reference for determining the position
glm::vec3 parentOffset; /// a 3D vector in the frame of reference of the parent skeletal joint
AvatarBodyBallID parentBall; /// the ball to which this ball is constrained for spring forces
AvatarBodyBallID parentBall; /// the ball to which this ball is constrained for spring forces
glm::vec3 position; /// the actual dynamic position of the ball at any given time
glm::quat rotation; /// the rotation of the ball
glm::quat rotation; /// the rotation of the ball
glm::vec3 velocity; /// the velocity of the ball
float springLength; /// the ideal length of the spring between this ball and its parentBall
float springLength; /// the ideal length of the spring between this ball and its parentBall
float jointTightness; /// how tightly the ball position attempts to stay at its ideal position (determined by parentOffset)
float radius; /// the radius of the ball
bool isCollidable; /// whether or not the ball responds to collisions
bool isCollidable; /// whether or not the ball responds to collisions
float touchForce; /// a scalar determining the amount that the cursor (or hand) is penetrating the ball
};
@ -231,13 +238,13 @@ private:
// privatize copy constructor and assignment operator to avoid copying
Avatar(const Avatar&);
Avatar& operator= (const Avatar&);
bool _initialized;
glm::vec3 _handHoldingPosition;
float _maxArmLength;
float _pelvisStandingHeight;
// private methods...
glm::vec3 calculateAverageEyePosition() { return _head.calculateAverageEyePosition(); } // get the position smack-dab between the eyes (for lookat)
float getBallRenderAlpha(int ball, bool forceRenderHead) const;

Some files were not shown because too many files have changed in this diff Show more