-=-=-=-=-=-=-=-=-=-=-=-=-=-
3D Physics:
-Fixed "Bounce" parameter in 3D
-Fixed bug affecting Area (sometims it would not detect properly)
-Vehicle Body has seen heavy work
-Added Query API for doing space queries in 3D. Needs some docs though.
-Added JOINTS! Adapted Bullet Joints: and created easy gizmos for setting them up:
-PinJoint
-HingeJoint (with motor)
-SliderJoint
-ConeTwistJoint
-Generic6DOFJoint
-Added OBJECT PICKING! based on the new query API. Any physics object now (Area or Body) has the following signals and virtual functions:
-input_event (mouse or multitouch input over the body)
-mouse_enter (mouse entered the body area)
-mouse_exit (mouse exited body area)
For Area it needs to be activated manually, as it isn't by default (ray goes thru).
Other:
-Begun working on Windows 8 (RT) port. Compiles but does not work yet.
-Added TheoraPlayer library for improved to-texture and portable video support.
-Fixed a few bugs in the renderer, collada importer, collada exporter, etc.
126 lines
No EOL
3.4 KiB
C++
126 lines
No EOL
3.4 KiB
C++
/************************************************************************************
|
|
This source file is part of the Theora Video Playback Library
|
|
For latest info, see http://libtheoraplayer.googlecode.com
|
|
*************************************************************************************
|
|
Copyright (c) 2008-2014 Kresimir Spes (kspes@cateia.com)
|
|
This program is free software; you can redistribute it and/or modify it under
|
|
the terms of the BSD license: http://opensource.org/licenses/BSD-3-Clause
|
|
*************************************************************************************/
|
|
#include <stdlib.h>
|
|
#include "TheoraAudioPacketQueue.h"
|
|
#include "TheoraAudioInterface.h"
|
|
|
|
TheoraAudioPacketQueue::TheoraAudioPacketQueue()
|
|
{
|
|
mTheoraAudioPacketQueue = NULL;
|
|
}
|
|
|
|
TheoraAudioPacketQueue::~TheoraAudioPacketQueue()
|
|
{
|
|
destroyAllAudioPackets();
|
|
}
|
|
|
|
float TheoraAudioPacketQueue::getAudioPacketQueueLength()
|
|
{
|
|
float len = 0;
|
|
for (TheoraAudioPacket* p = mTheoraAudioPacketQueue; p != NULL; p = p->next)
|
|
len += p->numSamples;
|
|
|
|
return len / (mAudioFrequency * mNumAudioChannels);
|
|
}
|
|
|
|
void TheoraAudioPacketQueue::_addAudioPacket(float* data, int numSamples)
|
|
{
|
|
TheoraAudioPacket* packet = new TheoraAudioPacket;
|
|
packet->pcm = data;
|
|
packet->numSamples = numSamples;
|
|
packet->next = NULL;
|
|
|
|
|
|
if (mTheoraAudioPacketQueue == NULL) mTheoraAudioPacketQueue = packet;
|
|
else
|
|
{
|
|
TheoraAudioPacket* last = mTheoraAudioPacketQueue;
|
|
for (TheoraAudioPacket* p = last; p != NULL; p = p->next)
|
|
last = p;
|
|
last->next = packet;
|
|
}
|
|
}
|
|
|
|
void TheoraAudioPacketQueue::addAudioPacket(float** buffer, int numSamples, float gain)
|
|
{
|
|
float* data = new float[numSamples * mNumAudioChannels];
|
|
float* dataptr = data;
|
|
int i;
|
|
unsigned int j;
|
|
|
|
if (gain < 1.0f)
|
|
{
|
|
// apply gain, let's attenuate the samples
|
|
for (i = 0; i < numSamples; ++i)
|
|
for (j = 0; j < mNumAudioChannels; j++, ++dataptr)
|
|
*dataptr = buffer[i][j] * gain;
|
|
}
|
|
else
|
|
{
|
|
// do a simple copy, faster then the above method, when gain is 1.0f
|
|
for (i = 0; i < numSamples; ++i)
|
|
for (j = 0; j < mNumAudioChannels; j++, ++dataptr)
|
|
*dataptr = buffer[j][i];
|
|
}
|
|
|
|
_addAudioPacket(data, numSamples * mNumAudioChannels);
|
|
}
|
|
|
|
void TheoraAudioPacketQueue::addAudioPacket(float* buffer, int numSamples, float gain)
|
|
{
|
|
float* data = new float[numSamples * mNumAudioChannels];
|
|
float* dataptr = data;
|
|
int i, numFloats = numSamples * mNumAudioChannels;
|
|
|
|
if (gain < 1.0f)
|
|
{
|
|
// apply gain, let's attenuate the samples
|
|
for (i = 0; i < numFloats; ++i, dataptr++)
|
|
*dataptr = buffer[i] * gain;
|
|
}
|
|
else
|
|
{
|
|
// do a simple copy, faster then the above method, when gain is 1.0f
|
|
for (i = 0; i < numFloats; ++i, dataptr++)
|
|
*dataptr = buffer[i];
|
|
}
|
|
|
|
_addAudioPacket(data, numFloats);
|
|
}
|
|
|
|
TheoraAudioPacket* TheoraAudioPacketQueue::popAudioPacket()
|
|
{
|
|
if (mTheoraAudioPacketQueue == NULL) return NULL;
|
|
TheoraAudioPacket* p = mTheoraAudioPacketQueue;
|
|
mTheoraAudioPacketQueue = mTheoraAudioPacketQueue->next;
|
|
return p;
|
|
}
|
|
|
|
void TheoraAudioPacketQueue::destroyAudioPacket(TheoraAudioPacket* p)
|
|
{
|
|
if (p == NULL) return;
|
|
delete [] p->pcm;
|
|
delete p;
|
|
}
|
|
|
|
void TheoraAudioPacketQueue::destroyAllAudioPackets()
|
|
{
|
|
for (TheoraAudioPacket* p = popAudioPacket(); p != NULL; p = popAudioPacket())
|
|
destroyAudioPacket(p);
|
|
}
|
|
|
|
void TheoraAudioPacketQueue::flushAudioPackets(TheoraAudioInterface* audioInterface)
|
|
{
|
|
|
|
for (TheoraAudioPacket* p = popAudioPacket(); p != NULL; p = popAudioPacket())
|
|
{
|
|
audioInterface->insertData(p->pcm, p->numSamples);
|
|
destroyAudioPacket(p);
|
|
}
|
|
} |