| 1 | // tAttribute.cpp  |
| 2 | //  |
| 3 | // All scene objects may have attributes. Attributes are extra data (that has a type) that the content author  |
| 4 | // attributed to the scene object.  |
| 5 | //  |
| 6 | // Copyright (c) 2006, 2017 Tristan Grimmer.  |
| 7 | // Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby  |
| 8 | // granted, provided that the above copyright notice and this permission notice appear in all copies.  |
| 9 | //  |
| 10 | // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL  |
| 11 | // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,  |
| 12 | // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN  |
| 13 | // AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR  |
| 14 | // PERFORMANCE OF THIS SOFTWARE.  |
| 15 |   |
| 16 | #include "Scene/tAttribute.h"  |
| 17 | namespace tScene  |
| 18 | {  |
| 19 |   |
| 20 |   |
| 21 | void tAttribute::Save(tChunkWriter& chunk) const  |
| 22 | {  |
| 23 | if (!IsValid())  |
| 24 | return;  |
| 25 |   |
| 26 | chunk.Begin(tChunkID::Scene_Attribute);  |
| 27 | {  |
| 28 | chunk.Begin(tChunkID::Scene_AttributeName);  |
| 29 | {  |
| 30 | chunk.Write(Name);  |
| 31 | }  |
| 32 | chunk.End();  |
| 33 |   |
| 34 | chunk.Begin(tChunkID::Scene_AttributeType);  |
| 35 | {  |
| 36 | chunk.Write(Type);  |
| 37 | }  |
| 38 | chunk.End();  |
| 39 |   |
| 40 | // Values must be switched on type so that endianness corrections are made.  |
| 41 | chunk.Begin(tChunkID::Scene_AttributeValue);  |
| 42 | {  |
| 43 | switch (Type)  |
| 44 | {  |
| 45 | case tType::Bool:  |
| 46 | chunk.Write(GetAsBool());  |
| 47 | break;  |
| 48 |   |
| 49 | case tType::Int:  |
| 50 | chunk.Write(GetAsInt());  |
| 51 | break;  |
| 52 |   |
| 53 | case tType::Colour:  |
| 54 | chunk.Write(GetAsColour());  |
| 55 | break;  |
| 56 |   |
| 57 | case tType::Float:  |
| 58 | chunk.Write(GetAsFloat());  |
| 59 | break;  |
| 60 | };  |
| 61 | }  |
| 62 | chunk.End();  |
| 63 | }  |
| 64 | chunk.End();  |
| 65 | }  |
| 66 |   |
| 67 |   |
| 68 | void tAttribute::Load(const tChunk& attribChunk)  |
| 69 | {  |
| 70 | tAssert(attribChunk.GetID() == tChunkID::Scene_Attribute);  |
| 71 | Clear();  |
| 72 |   |
| 73 | for (tChunk chunk = attribChunk.First(); chunk.IsValid(); chunk = chunk.Next())  |
| 74 | {  |
| 75 | switch (chunk.GetID())  |
| 76 | {  |
| 77 | case tChunkID::Scene_AttributeName:  |
| 78 | chunk.GetItem(Name);  |
| 79 | break;  |
| 80 |   |
| 81 | case tChunkID::Scene_AttributeType:  |
| 82 | chunk.GetItem(Type);  |
| 83 | break;  |
| 84 |   |
| 85 | case tChunkID::Scene_AttributeValue:  |
| 86 | tAssert(Type != tType::Invalid);  |
| 87 |   |
| 88 | // We switch on the type here so that the tChunk system can handle any endian issues.  |
| 89 | switch (Type)  |
| 90 | {  |
| 91 | case tType::Bool:  |
| 92 | {  |
| 93 | bool val;  |
| 94 | chunk.GetItem(val);  |
| 95 | Value = val ? 1 : 0;  |
| 96 | break;  |
| 97 | }  |
| 98 |   |
| 99 | case tType::Int:  |
| 100 | {  |
| 101 | int val;  |
| 102 | chunk.GetItem(val);  |
| 103 | Value = int(val);  |
| 104 | break;  |
| 105 | }  |
| 106 |   |
| 107 | case tType::Colour:  |
| 108 | {  |
| 109 | tColouri val;  |
| 110 | chunk.GetItem(val);  |
| 111 | Value = *((uint32*)(&val));  |
| 112 | break;  |
| 113 | }  |
| 114 |   |
| 115 | case tType::Float:  |
| 116 | {  |
| 117 | float val;  |
| 118 | chunk.GetItem(val);  |
| 119 | Value = *((uint32*)(&val));  |
| 120 | break;  |
| 121 | }  |
| 122 | }  |
| 123 | break;  |
| 124 | }  |
| 125 | }  |
| 126 | }  |
| 127 |   |
| 128 |   |
| 129 | bool tAttributes::Contains(const tAttribute& attrib) const  |
| 130 | {  |
| 131 | for (tItList<tAttribute>::Iter attr = Attributes.First(); attr; ++attr)  |
| 132 | {  |
| 133 | if (*attr == attrib)  |
| 134 | return true;  |
| 135 | }  |
| 136 |   |
| 137 | return false;  |
| 138 | }  |
| 139 |   |
| 140 |   |
| 141 | void tAttributes::Save(tChunkWriter& chunk) const  |
| 142 | {  |
| 143 | chunk.Begin(tChunkID::Scene_AttributeList);  |
| 144 | for (tItList<tAttribute>::Iter attr = Attributes.First(); attr; ++attr)  |
| 145 | attr->Save(chunk);  |
| 146 | chunk.End();  |
| 147 | }  |
| 148 |   |
| 149 |   |
| 150 | void tAttributes::Load(const tChunk& chunk)  |
| 151 | {  |
| 152 | Clear();  |
| 153 | tAssert(chunk.GetID() == tChunkID::Scene_AttributeList);  |
| 154 | for (tChunk attr = chunk.First(); attr.Valid(); attr = attr.Next())  |
| 155 | Attributes.Append(new tAttribute(attr));  |
| 156 | }  |
| 157 |   |
| 158 |   |
| 159 | bool tAttributes::operator==(const tAttributes& attribs) const  |
| 160 | {  |
| 161 | if (Count() != attribs.Count())  |
| 162 | return false;  |
| 163 |   |
| 164 | for (tItList<tAttribute>::Iter attr = Attributes.First(); attr; ++attr)  |
| 165 | {  |
| 166 | if (!attribs.Contains(*attr))  |
| 167 | return false;  |
| 168 | }  |
| 169 |   |
| 170 | return true;  |
| 171 | }  |
| 172 |   |
| 173 |   |
| 174 | tAttributes& tAttributes::operator=(const tAttributes& attribs)  |
| 175 | {  |
| 176 | if (this == &attribs)  |
| 177 | return *this;  |
| 178 |   |
| 179 | Clear();  |
| 180 | for (tItList<tAttribute>::Iter attr = attribs.Attributes.First(); attr; ++attr)  |
| 181 | Attributes.Append(new tAttribute(*attr));  |
| 182 |   |
| 183 | return *this;  |
| 184 | }  |
| 185 |   |
| 186 |   |
| 187 | }  |
| 188 | |