got particles sending from server to client and rendering

This commit is contained in:
ZappoMan 2013-12-09 13:29:44 -08:00
parent 2ca628fdf1
commit 2783770e2b
7 changed files with 78 additions and 22 deletions

View file

@ -204,7 +204,8 @@ 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};
nodeList->setNodeTypesOfInterest(nodeTypesOfInterest, sizeof(nodeTypesOfInterest));
QTimer* silentNodeTimer = new QTimer(this);
@ -1222,7 +1223,8 @@ void Application::wheelEvent(QWheelEvent* event) {
void Application::sendPingPackets() {
const char nodesToPing[] = {NODE_TYPE_VOXEL_SERVER, NODE_TYPE_AUDIO_MIXER, NODE_TYPE_AVATAR_MIXER};
const char nodesToPing[] = {NODE_TYPE_VOXEL_SERVER, NODE_TYPE_PARTICLE_SERVER,
NODE_TYPE_AUDIO_MIXER, NODE_TYPE_AVATAR_MIXER};
uint64_t currentTime = usecTimestampNow();
unsigned char pingPacket[numBytesForPacketHeader((unsigned char*) &PACKET_TYPE_PING) + sizeof(currentTime)];
@ -1791,6 +1793,9 @@ void Application::init() {
_voxels.setVoxelsAsPoints(Menu::getInstance()->isOptionChecked(MenuOption::VoxelsAsPoints));
_voxels.setDisableFastVoxelPipeline(false);
_voxels.init();
_particles.init();
_particles.setViewFrustum(getViewFrustum());
Avatar::sendAvatarURLsMessage(_myAvatar.getVoxels()->getVoxelURL());
@ -2587,17 +2592,18 @@ void Application::updateAvatar(float deltaTime) {
loadViewFrustum(_myCamera, _viewFrustum);
// Update my voxel servers with my current voxel query...
queryVoxels();
queryOctree(NODE_TYPE_VOXEL_SERVER, PACKET_TYPE_VOXEL_QUERY);
queryOctree(NODE_TYPE_PARTICLE_SERVER, PACKET_TYPE_PARTICLE_QUERY);
}
void Application::queryVoxels() {
void Application::queryOctree(NODE_TYPE serverType, PACKET_TYPE packetType) {
// if voxels are disabled, then don't send this at all...
if (!Menu::getInstance()->isOptionChecked(MenuOption::Voxels)) {
return;
}
bool wantExtraDebugging = Menu::getInstance()->isOptionChecked(MenuOption::ExtraDebugging);
bool wantExtraDebugging = true; // Menu::getInstance()->isOptionChecked(MenuOption::ExtraDebugging);
// These will be the same for all servers, so we can set them up once and then reuse for each server we send to.
_voxelQuery.setWantLowResMoving(!Menu::getInstance()->isOptionChecked(MenuOption::DisableLowRes));
@ -2626,10 +2632,21 @@ void Application::queryVoxels() {
int unknownJurisdictionServers = 0;
for (NodeList::iterator node = nodeList->begin(); node != nodeList->end(); node++) {
// only send to the NodeTypes that are NODE_TYPE_VOXEL_SERVER
if (node->getActiveSocket() != NULL && node->getType() == NODE_TYPE_VOXEL_SERVER) {
/**
qDebug() << "Query... " << *node << "\n";
qDebug(" node->getActiveSocket()=%p\n",node->getActiveSocket());
qDebug(" node->getType()=%c\n",node->getType());
qDebug(" serverType=%c\n",serverType);
/**/
// only send to the NodeTypes that are serverType
if (node->getActiveSocket() != NULL && node->getType() == serverType) {
totalServers++;
//qDebug("LINE:%d -- Servers: total %d, in view %d, unknown jurisdiction %d \n",
// __LINE__, totalServers, inViewServers, unknownJurisdictionServers);
// get the server bounds for this server
QUuid nodeUUID = node->getUUID();
@ -2656,7 +2673,15 @@ void Application::queryVoxels() {
}
}
}
//qDebug("LINE:%d -- Servers: total %d, in view %d, unknown jurisdiction %d \n",
// __LINE__, totalServers, inViewServers, unknownJurisdictionServers);
}
//qDebug("LINE:%d -- Servers: total %d, in view %d, unknown jurisdiction %d \n",
// __LINE__, totalServers, inViewServers, unknownJurisdictionServers);
if (wantExtraDebugging && unknownJurisdictionServers > 0) {
qDebug("Servers: total %d, in view %d, unknown jurisdiction %d \n",
@ -2684,8 +2709,8 @@ void Application::queryVoxels() {
}
for (NodeList::iterator node = nodeList->begin(); node != nodeList->end(); node++) {
// only send to the NodeTypes that are NODE_TYPE_VOXEL_SERVER
if (node->getActiveSocket() != NULL && node->getType() == NODE_TYPE_VOXEL_SERVER) {
// only send to the NodeTypes that are serverType
if (node->getActiveSocket() != NULL && node->getType() == serverType) {
// get the server bounds for this server
@ -2758,7 +2783,7 @@ void Application::queryVoxels() {
unsigned char* endOfVoxelQueryPacket = voxelQueryPacket;
// insert packet type/version and node UUID
endOfVoxelQueryPacket += populateTypeAndVersion(endOfVoxelQueryPacket, PACKET_TYPE_VOXEL_QUERY);
endOfVoxelQueryPacket += populateTypeAndVersion(endOfVoxelQueryPacket, packetType);
QByteArray ownerUUID = nodeList->getOwnerUUID().toRfc4122();
memcpy(endOfVoxelQueryPacket, ownerUUID.constData(), ownerUUID.size());
endOfVoxelQueryPacket += ownerUUID.size();
@ -2768,6 +2793,10 @@ void Application::queryVoxels() {
int packetLength = endOfVoxelQueryPacket - voxelQueryPacket;
//qDebug("LINE:%d -- nodeList->getNodeSocket().writeDatagram()... packetLength=%d \n",
// __LINE__, packetLength);
nodeList->getNodeSocket().writeDatagram((char*) voxelQueryPacket, packetLength,
node->getActiveSocket()->getAddress(), node->getActiveSocket()->getPort());
@ -3006,6 +3035,7 @@ void Application::displaySide(Camera& whichCamera, bool selfAvatarOnly) {
}
// render particles...
//printf("_particles.render()...\n");
_particles.render();
// restore default, white specular
@ -4221,11 +4251,7 @@ void* Application::networkReceive(void* args) {
Q_ARG(QByteArray, QByteArray((char*) app->_incomingPacket, bytesReceived)));
break;
case PACKET_TYPE_PARTICLE_DATA: {
app->_particles.processDatagram(QByteArray((char*) app->_incomingPacket, bytesReceived),
senderSockAddr);
break;
}
case PACKET_TYPE_PARTICLE_DATA:
case PACKET_TYPE_VOXEL_DATA:
case PACKET_TYPE_VOXEL_ERASE:
case PACKET_TYPE_OCTREE_STATS:
@ -4271,6 +4297,7 @@ void* Application::networkReceive(void* args) {
DataServerClient::processMessageFromDataServer(app->_incomingPacket, bytesReceived);
break;
default:
//printf("message: '%c' \n",app->_incomingPacket[0]);
NodeList::getInstance()->processNodeData(senderSockAddr, app->_incomingPacket, bytesReceived);
break;
}

View file

@ -285,7 +285,7 @@ private:
void updateAvatar(float deltaTime);
void updateAvatars(float deltaTime, glm::vec3 mouseRayOrigin, glm::vec3 mouseRayDirection);
void queryVoxels();
void queryOctree(NODE_TYPE serverType, PACKET_TYPE packetType);
void loadViewFrustum(Camera& camera, ViewFrustum& viewFrustum);
glm::vec3 getSunDirection();

View file

@ -27,11 +27,16 @@ void ParticleTreeRenderer::renderElement(OctreeElement* element) {
uint16_t numberOfParticles = particles.size();
glPointSize(20.0f);
glBegin(GL_POINTS);
for (uint16_t i = 0; i < numberOfParticles; i++) {
const Particle& particle = particles[i];
// render particle aspoints
glVertex3f(particle.getPosition().x, particle.getPosition().y, particle.getPosition().z);
glm::vec3 position = particle.getPosition() * (float)TREE_SCALE;
printf("glVertex3f(%f, %f, %f)\n", position.x, position.y, position.z);
glVertex3f(position.x, position.y, position.z);
}
glEnd();
}

View file

@ -58,7 +58,10 @@ void VoxelPacketProcessor::processPacket(const HifiSockAddr& senderSockAddr, uns
Node* voxelServer = NodeList::getInstance()->nodeWithAddress(senderSockAddr);
if (voxelServer && *voxelServer->getActiveSocket() == senderSockAddr) {
if (packetData[0] == PACKET_TYPE_ENVIRONMENT_DATA) {
if (packetData[0] == PACKET_TYPE_PARTICLE_DATA) {
//printf("VoxelPacketProcessor::processPacket().... got PACKET_TYPE_PARTICLE_DATA\n");
app->_particles.processDatagram(QByteArray((char*) packetData, messageLength), senderSockAddr);
} else if (packetData[0] == PACKET_TYPE_ENVIRONMENT_DATA) {
app->_environment.parseData(senderSockAddr, packetData, messageLength);
} else {
app->_voxels.setDataSourceUUID(voxelServer->getUUID());

View file

@ -15,6 +15,12 @@
#include "OctreeRenderer.h"
OctreeRenderer::OctreeRenderer() {
_tree = NULL;
_viewFrustum = NULL;
}
void OctreeRenderer::init() {
_tree = createTree();
}
OctreeRenderer::~OctreeRenderer() {
@ -22,6 +28,8 @@ OctreeRenderer::~OctreeRenderer() {
void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const HifiSockAddr& senderSockAddr) {
bool showTimingDetails = false; // Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings);
bool extraDebugging = false; // Menu::getInstance()->isOptionChecked(MenuOption::ExtraDebugging)
PerformanceWarning warn(showTimingDetails, "OctreeRenderer::processDatagram()",showTimingDetails);
@ -55,6 +63,14 @@ void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const Hifi
OCTREE_PACKET_INTERNAL_SECTION_SIZE sectionLength = 0;
int dataBytes = packetLength - OCTREE_PACKET_HEADER_SIZE;
if (extraDebugging) {
qDebug("OctreeRenderer::processDatagram() ... Got Packet Section"
" color:%s compressed:%s sequence: %u flight:%d usec size:%d data:%d"
"\n",
debug::valueOf(packetIsColored), debug::valueOf(packetIsCompressed),
sequence, flightTime, packetLength, dataBytes);
}
int subsection = 1;
while (dataBytes > 0) {
@ -102,9 +118,6 @@ void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const Hifi
//Application::getInstance()->getBandwidthMeter()->inputStream(BandwidthMeter::VOXELS).updateValue(numBytes);
}
void OctreeRenderer::init() {
}
class RenderArgs {
public:
OctreeRenderer* _renderer;
@ -125,5 +138,7 @@ bool OctreeRenderer::renderOperation(OctreeElement* element, void* extraData) {
void OctreeRenderer::render() {
RenderArgs args = { this, _viewFrustum };
_tree->recurseTreeWithOperation(renderOperation, &args);
if (_tree) {
_tree->recurseTreeWithOperation(renderOperation, &args);
}
}

View file

@ -42,6 +42,8 @@ bool Particle::appendParticleData(OctreePacketData* packetData) const {
bool success = packetData->appendValue(getID());
printf("Particle::appendParticleData()... getID()=%d\n", getID());
if (success) {
success = packetData->appendValue(getLastUpdated());
}

View file

@ -41,9 +41,13 @@ ParticleTreeElement* ParticleTreeElement::addChildAtIndex(int index) {
bool ParticleTreeElement::appendElementData(OctreePacketData* packetData) const {
bool success = true; // assume the best...
// write our particles out...
uint16_t numberOfParticles = _particles.size();
success = packetData->appendValue(numberOfParticles);
printf("ParticleTreeElement::appendElementData()... numberOfParticles=%d\n",numberOfParticles);
if (success) {
for (uint16_t i = 0; i < numberOfParticles; i++) {