void Drawable::SetZoneMask(unsigned mask) { zoneMask_ = mask; // Mark dirty to reset cached zone OnMarkedDirty(node_); MarkNetworkUpdate(); }
void Text3D::MarkTextDirty() { textDirty_ = true; OnMarkedDirty(node_); MarkNetworkUpdate(); }
void Zone::OnSetEnabled() { // When a Zone is disabled, clear the cached zone from all drawables inside bounding box before removing from octree if (!IsEnabledEffective()) OnMarkedDirty(node_); Drawable::OnSetEnabled(); }
void Drawable2D::SetPixelsPerUnit(float pixelsPerUnit) { pixelsPerUnit_ = Max(1.0f, pixelsPerUnit); verticesDirty_ = true; geometryDirty_ = true; OnMarkedDirty(node_); MarkNetworkUpdate(); }
void StaticModelGroup::UpdateNumTransforms() { worldTransforms_.Resize(instanceNodes_.Size()); numWorldTransforms_ = 0; // Correct amount will be during world bounding box update nodeIDsDirty_ = true; OnMarkedDirty(GetNode()); MarkNetworkUpdate(); }
void Zone::OnSetAttribute(const AttributeInfo& attr, const Variant& src) { Component::OnSetAttribute(attr, src); // If bounding box or priority changes, dirty the drawable as applicable if ((attr.offset_ >= offsetof(Zone, boundingBox_) && attr.offset_ < (offsetof(Zone, boundingBox_) + sizeof(BoundingBox))) || attr.offset_ == offsetof(Zone, priority_)) OnMarkedDirty(node_); }
void Text3D::SetFaceCamera(bool enable) { if (enable != faceCamera_) { faceCamera_ = enable; // Bounding box must be recalculated OnMarkedDirty(node_); } }
void Text3D::SetFaceCameraMode(FaceCameraMode mode) { if (mode != faceCameraMode_) { faceCameraMode_ = mode; // Bounding box must be recalculated OnMarkedDirty(node_); } }
void Drawable2D::SetZValue(float zValue) { if (zValue == zValue_) return; zValue_ = zValue; verticesDirty_ = true; geometryDirty_ = true; OnMarkedDirty(node_); MarkNetworkUpdate(); }
void Text3D::SetFixedScreenSize(bool enable) { if (enable != fixedScreenSize_) { fixedScreenSize_ = enable; // Bounding box must be recalculated OnMarkedDirty(node_); MarkNetworkUpdate(); } }
void Drawable2D::SetSprite(Sprite2D* sprite) { if (sprite == sprite_) return; sprite_ = sprite; verticesDirty_ = true; geometryDirty_ = true; UpdateMaterial(); OnMarkedDirty(node_); MarkNetworkUpdate(); }
void StaticModelGroup::RemoveInstanceNode(Node* node) { if (!node) return; WeakPtr<Node> instanceWeak(node); node->RemoveListener(this); instanceNodes_.Remove(instanceWeak); UpdateNodeIDs(); OnMarkedDirty(GetNode()); MarkNetworkUpdate(); }
void StaticModelGroup::RemoveAllInstanceNodes() { for (unsigned i = 0; i < instanceNodes_.Size(); ++i) { Node* node = instanceNodes_[i]; if (node) node->RemoveListener(this); } instanceNodes_.Clear(); UpdateNodeIDs(); OnMarkedDirty(GetNode()); MarkNetworkUpdate(); }
void Drawable2D::SetTexture(Texture2D* texture) { if (texture == texture_) return; texture_ = texture; verticesDirty_ = true; material_ = 0; if (renderer_) renderer_->MarkMaterialDirty(this); OnMarkedDirty(node_); MarkNetworkUpdate(); }
void StaticModelGroup::AddInstanceNode(Node* node) { if (!node) return; WeakPtr<Node> instanceWeak(node); if (instanceNodes_.Contains(instanceWeak)) return; // Add as a listener for the instance node, so that we know to dirty the transforms when the node moves or is enabled/disabled node->AddListener(this); instanceNodes_.Push(instanceWeak); UpdateNodeIDs(); OnMarkedDirty(GetNode()); MarkNetworkUpdate(); }
void StaticModelGroup::ApplyAttributes() { if (!nodeIDsDirty_) return; // Remove all old instance nodes before searching for new. Can not call RemoveAllInstances() as that would modify // the ID list on its own for (unsigned i = 0; i < instanceNodes_.Size(); ++i) { Node* node = instanceNodes_[i]; if (node) node->RemoveListener(this); } instanceNodes_.Clear(); Scene* scene = GetScene(); if (scene) { // The first index stores the number of IDs redundantly. This is for editing for (unsigned i = 1; i < nodeIDsAttr_.Size(); ++i) { Node* node = scene->GetNode(nodeIDsAttr_[i].GetUInt()); if (node) { WeakPtr<Node> instanceWeak(node); node->AddListener(this); instanceNodes_.Push(instanceWeak); } } } worldTransforms_.Resize(instanceNodes_.Size()); nodeIDsDirty_ = false; OnMarkedDirty(GetNode()); }
void StaticModelGroup::ApplyAttributes() { if (!nodesDirty_) return; // Remove all old instance nodes before searching for new for (unsigned i = 0; i < instanceNodes_.Size(); ++i) { Node* node = instanceNodes_[i]; if (node) node->RemoveListener(this); } instanceNodes_.Clear(); Scene* scene = GetScene(); if (scene) { // The first index stores the number of IDs redundantly. This is for editing for (unsigned i = 1; i < nodeIDsAttr_.Size(); ++i) { Node* node = scene->GetNode(nodeIDsAttr_[i].GetUInt()); if (node) { WeakPtr<Node> instanceWeak(node); node->AddListener(this); instanceNodes_.Push(instanceWeak); } } } worldTransforms_.Resize(instanceNodes_.Size()); numWorldTransforms_ = 0; // Correct amount will be found during world bounding box update nodesDirty_ = false; OnMarkedDirty(GetNode()); }
void Light::SetRange(float range) { range_ = Max(range, 0.0f); OnMarkedDirty(node_); MarkNetworkUpdate(); }
void TerrainPatch::SetBoundingBox(const BoundingBox& box) { boundingBox_ = box; OnMarkedDirty(node_); }
void CustomGeometry::Commit() { ATOMIC_PROFILE(CommitCustomGeometry); unsigned totalVertices = 0; boundingBox_.Clear(); for (unsigned i = 0; i < vertices_.Size(); ++i) { totalVertices += vertices_[i].Size(); for (unsigned j = 0; j < vertices_[i].Size(); ++j) boundingBox_.Merge(vertices_[i][j].position_); } // Make sure world-space bounding box will be updated OnMarkedDirty(node_); // Resize (recreate) the vertex buffer only if necessary if (vertexBuffer_->GetVertexCount() != totalVertices || vertexBuffer_->GetElementMask() != elementMask_ || vertexBuffer_->IsDynamic() != dynamic_) vertexBuffer_->SetSize(totalVertices, elementMask_, dynamic_); if (totalVertices) { unsigned char* dest = (unsigned char*)vertexBuffer_->Lock(0, totalVertices, true); if (dest) { unsigned vertexStart = 0; for (unsigned i = 0; i < vertices_.Size(); ++i) { unsigned vertexCount = 0; for (unsigned j = 0; j < vertices_[i].Size(); ++j) { *((Vector3*)dest) = vertices_[i][j].position_; dest += sizeof(Vector3); if (elementMask_ & MASK_NORMAL) { *((Vector3*)dest) = vertices_[i][j].normal_; dest += sizeof(Vector3); } if (elementMask_ & MASK_COLOR) { *((unsigned*)dest) = vertices_[i][j].color_; dest += sizeof(unsigned); } if (elementMask_ & MASK_TEXCOORD1) { *((Vector2*)dest) = vertices_[i][j].texCoord_; dest += sizeof(Vector2); } if (elementMask_ & MASK_TANGENT) { *((Vector4*)dest) = vertices_[i][j].tangent_; dest += sizeof(Vector4); } ++vertexCount; } geometries_[i]->SetVertexBuffer(0, vertexBuffer_); geometries_[i]->SetDrawRange(primitiveTypes_[i], 0, 0, vertexStart, vertexCount); vertexStart += vertexCount; } vertexBuffer_->Unlock(); } else ATOMIC_LOGERROR("Failed to lock custom geometry vertex buffer"); } else { for (unsigned i = 0; i < geometries_.Size(); ++i) { geometries_[i]->SetVertexBuffer(0, vertexBuffer_); geometries_[i]->SetDrawRange(primitiveTypes_[i], 0, 0, 0, 0); } } vertexBuffer_->ClearDataLost(); }
void Light::SetFov(float fov) { fov_ = Clamp(fov, 0.0f, M_MAX_FOV); OnMarkedDirty(node_); MarkNetworkUpdate(); }
void Zone::SetBoundingBox(const BoundingBox& box) { boundingBox_ = box; OnMarkedDirty(node_); MarkNetworkUpdate(); }
void Light::SetAspectRatio(float aspectRatio) { aspectRatio_ = Max(aspectRatio, M_EPSILON); OnMarkedDirty(node_); MarkNetworkUpdate(); }
void Light::SetLightType(LightType type) { lightType_ = type; OnMarkedDirty(node_); MarkNetworkUpdate(); }
void StaticModel::SetBoundingBox(const BoundingBox& box) { boundingBox_ = box; OnMarkedDirty(node_); }