// // Copyright (c) 2008-2016 the Urho3D project. // // 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // #include "../Precompiled.h" #include "../Core/Context.h" #include "../Graphics/Camera.h" #include "../Graphics/Material.h" #include "../Graphics/Texture2D.h" #include "../Scene/Scene.h" #include "../Atomic2D/Drawable2D.h" #include "../Atomic2D/Renderer2D.h" #include "../DebugNew.h" namespace Atomic { // ATOMIC BEGIN // defined in header // const float PIXEL_SIZE = 0.01f; // ATOMIC END SourceBatch2D::SourceBatch2D() : distance_(0.0f), drawOrder_(0) { } Drawable2D::Drawable2D(Context* context) : Drawable(context, DRAWABLE_GEOMETRY2D), layer_(0), orderInLayer_(0), sourceBatchesDirty_(true) { } Drawable2D::~Drawable2D() { if (renderer_) renderer_->RemoveDrawable(this); } void Drawable2D::RegisterObject(Context* context) { ATOMIC_ACCESSOR_ATTRIBUTE("Layer", GetLayer, SetLayer, int, 0, AM_DEFAULT); ATOMIC_ACCESSOR_ATTRIBUTE("Order in Layer", GetOrderInLayer, SetOrderInLayer, int, 0, AM_DEFAULT); ATOMIC_ATTRIBUTE("View Mask", int, viewMask_, DEFAULT_VIEWMASK, AM_DEFAULT); } void Drawable2D::OnSetEnabled() { bool enabled = IsEnabledEffective(); if (enabled && renderer_) renderer_->AddDrawable(this); else if (!enabled && renderer_) renderer_->RemoveDrawable(this); } void Drawable2D::SetLayer(int layer) { if (layer == layer_) return; layer_ = layer; OnDrawOrderChanged(); MarkNetworkUpdate(); } void Drawable2D::SetOrderInLayer(int orderInLayer) { if (orderInLayer == orderInLayer_) return; orderInLayer_ = orderInLayer; OnDrawOrderChanged(); MarkNetworkUpdate(); } const Vector& Drawable2D::GetSourceBatches() { if (sourceBatchesDirty_) UpdateSourceBatches(); return sourceBatches_; } void Drawable2D::OnSceneSet(Scene* scene) { // Do not call Drawable::OnSceneSet(node), as 2D drawable components should not be added to the octree // but are instead rendered through Renderer2D if (scene) { renderer_ = scene->GetOrCreateComponent(); if (IsEnabledEffective()) renderer_->AddDrawable(this); } else { if (renderer_) renderer_->RemoveDrawable(this); } } void Drawable2D::OnMarkedDirty(Node* node) { Drawable::OnMarkedDirty(node); sourceBatchesDirty_ = true; } }