mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-16 15:54:25 +02:00
got particles sending from server to client and rendering
This commit is contained in:
parent
2ca628fdf1
commit
2783770e2b
7 changed files with 78 additions and 22 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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++) {
|
||||
|
|
Loading…
Reference in a new issue