diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs | 140 |
1 files changed, 136 insertions, 4 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs index 3b0ccd7..6778ba5 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | ||
30 | using System.Collections.Specialized; | 31 | using System.Collections.Specialized; |
31 | using System.Drawing; | 32 | using System.Drawing; |
32 | using System.Drawing.Imaging; | 33 | using System.Drawing.Imaging; |
@@ -53,8 +54,8 @@ namespace OpenSim.Region.ClientStack.Linden | |||
53 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "UploadBakedTextureModule")] | 54 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "UploadBakedTextureModule")] |
54 | public class UploadBakedTextureModule : INonSharedRegionModule | 55 | public class UploadBakedTextureModule : INonSharedRegionModule |
55 | { | 56 | { |
56 | // private static readonly ILog m_log = | 57 | private static readonly ILog m_log = |
57 | // LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 58 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
58 | 59 | ||
59 | /// <summary> | 60 | /// <summary> |
60 | /// For historical reasons this is fixed, but there | 61 | /// For historical reasons this is fixed, but there |
@@ -64,31 +65,154 @@ namespace OpenSim.Region.ClientStack.Linden | |||
64 | private Scene m_scene; | 65 | private Scene m_scene; |
65 | private bool m_persistBakedTextures; | 66 | private bool m_persistBakedTextures; |
66 | 67 | ||
68 | private IBakedTextureModule m_BakedTextureModule; | ||
69 | |||
67 | public void Initialise(IConfigSource source) | 70 | public void Initialise(IConfigSource source) |
68 | { | 71 | { |
69 | IConfig appearanceConfig = source.Configs["Appearance"]; | 72 | IConfig appearanceConfig = source.Configs["Appearance"]; |
70 | if (appearanceConfig != null) | 73 | if (appearanceConfig != null) |
71 | m_persistBakedTextures = appearanceConfig.GetBoolean("PersistBakedTextures", m_persistBakedTextures); | 74 | m_persistBakedTextures = appearanceConfig.GetBoolean("PersistBakedTextures", m_persistBakedTextures); |
75 | |||
76 | |||
72 | } | 77 | } |
73 | 78 | ||
74 | public void AddRegion(Scene s) | 79 | public void AddRegion(Scene s) |
75 | { | 80 | { |
76 | m_scene = s; | 81 | m_scene = s; |
82 | |||
77 | } | 83 | } |
78 | 84 | ||
79 | public void RemoveRegion(Scene s) | 85 | public void RemoveRegion(Scene s) |
80 | { | 86 | { |
87 | s.EventManager.OnRegisterCaps -= RegisterCaps; | ||
88 | s.EventManager.OnNewPresence -= RegisterNewPresence; | ||
89 | s.EventManager.OnRemovePresence -= DeRegisterPresence; | ||
90 | m_BakedTextureModule = null; | ||
91 | m_scene = null; | ||
81 | } | 92 | } |
82 | 93 | ||
94 | |||
95 | |||
83 | public void RegionLoaded(Scene s) | 96 | public void RegionLoaded(Scene s) |
84 | { | 97 | { |
85 | m_scene.EventManager.OnRegisterCaps += RegisterCaps; | 98 | m_scene.EventManager.OnRegisterCaps += RegisterCaps; |
99 | m_scene.EventManager.OnNewPresence += RegisterNewPresence; | ||
100 | m_scene.EventManager.OnRemovePresence += DeRegisterPresence; | ||
101 | |||
102 | } | ||
103 | |||
104 | private void DeRegisterPresence(UUID agentId) | ||
105 | { | ||
106 | ScenePresence presence = null; | ||
107 | if (m_scene.TryGetScenePresence(agentId, out presence)) | ||
108 | { | ||
109 | presence.ControllingClient.OnSetAppearance -= CaptureAppearanceSettings; | ||
110 | } | ||
111 | |||
112 | } | ||
113 | |||
114 | private void RegisterNewPresence(ScenePresence presence) | ||
115 | { | ||
116 | presence.ControllingClient.OnSetAppearance += CaptureAppearanceSettings; | ||
117 | |||
118 | } | ||
119 | |||
120 | private void CaptureAppearanceSettings(IClientAPI remoteClient, Primitive.TextureEntry textureEntry, byte[] visualParams, Vector3 avSize, WearableCacheItem[] cacheItems) | ||
121 | { | ||
122 | m_BakedTextureModule = m_scene.RequestModuleInterface<IBakedTextureModule>(); | ||
123 | if (cacheItems.Length > 0) | ||
124 | { | ||
125 | m_log.Info("[Cacheitems]: " + cacheItems.Length); | ||
126 | for (int iter = 0; iter < cacheItems.Length; iter++) | ||
127 | { | ||
128 | m_log.Info("[Cacheitems] {" + iter + "/" + cacheItems[iter].TextureIndex + "}: c-" + cacheItems[iter].CacheId + ", t-" + | ||
129 | cacheItems[iter].TextureID); | ||
130 | } | ||
131 | |||
132 | ScenePresence p = null; | ||
133 | if (m_scene.TryGetScenePresence(remoteClient.AgentId, out p)) | ||
134 | { | ||
135 | |||
136 | WearableCacheItem[] existingitems = p.Appearance.WearableCacheItems; | ||
137 | if (existingitems == null) | ||
138 | { | ||
139 | if (m_BakedTextureModule != null) | ||
140 | { | ||
141 | WearableCacheItem[] savedcache = null; | ||
142 | try | ||
143 | { | ||
144 | if (p.Appearance.WearableCacheItemsDirty) | ||
145 | { | ||
146 | savedcache = m_BakedTextureModule.Get(p.UUID); | ||
147 | p.Appearance.WearableCacheItems = savedcache; | ||
148 | p.Appearance.WearableCacheItemsDirty = false; | ||
149 | } | ||
150 | |||
151 | } | ||
152 | catch (InvalidOperationException) | ||
153 | { | ||
154 | } | ||
155 | |||
156 | if (savedcache != null) | ||
157 | existingitems = savedcache; | ||
158 | } | ||
159 | } | ||
160 | // Existing items null means it's a fully new appearance | ||
161 | if (existingitems == null) | ||
162 | { | ||
163 | |||
164 | for (int iter = 0; iter < cacheItems.Length; iter++) | ||
165 | { | ||
166 | |||
167 | cacheItems[iter].TextureID = textureEntry.FaceTextures[cacheItems[iter].TextureIndex].TextureID; | ||
168 | if (m_scene.AssetService != null) | ||
169 | cacheItems[iter].TextureAsset = m_scene.AssetService.GetCached(cacheItems[iter].TextureID.ToString()); | ||
170 | |||
171 | |||
172 | } | ||
173 | } | ||
174 | else | ||
175 | |||
176 | |||
177 | { | ||
178 | // for each uploaded baked texture | ||
179 | for (int i = 0; i < cacheItems.Length; i++) | ||
180 | { | ||
181 | cacheItems[i].TextureID = | ||
182 | textureEntry.FaceTextures[cacheItems[i].TextureIndex].TextureID; | ||
183 | } | ||
184 | |||
185 | for (int i = 0; i < cacheItems.Length; i++) | ||
186 | { | ||
187 | if (cacheItems[i].TextureAsset == null) | ||
188 | { | ||
189 | cacheItems[i].TextureAsset = m_scene.AssetService.GetCached(cacheItems[i].TextureID.ToString()); | ||
190 | } | ||
191 | } | ||
192 | } | ||
193 | |||
194 | |||
195 | |||
196 | p.Appearance.WearableCacheItems = cacheItems; | ||
197 | |||
198 | |||
199 | |||
200 | if (m_BakedTextureModule != null) | ||
201 | { | ||
202 | m_BakedTextureModule.Store(remoteClient.AgentId, cacheItems); | ||
203 | p.Appearance.WearableCacheItemsDirty = true; | ||
204 | |||
205 | } | ||
206 | } | ||
207 | } | ||
86 | } | 208 | } |
87 | 209 | ||
88 | public void PostInitialise() | 210 | public void PostInitialise() |
89 | { | 211 | { |
90 | } | 212 | } |
91 | 213 | ||
214 | |||
215 | |||
92 | public void Close() { } | 216 | public void Close() { } |
93 | 217 | ||
94 | public string Name { get { return "UploadBakedTextureModule"; } } | 218 | public string Name { get { return "UploadBakedTextureModule"; } } |
@@ -100,15 +224,23 @@ namespace OpenSim.Region.ClientStack.Linden | |||
100 | 224 | ||
101 | public void RegisterCaps(UUID agentID, Caps caps) | 225 | public void RegisterCaps(UUID agentID, Caps caps) |
102 | { | 226 | { |
227 | UploadBakedTextureHandler avatarhandler = new UploadBakedTextureHandler( | ||
228 | caps, m_scene.AssetService, m_persistBakedTextures); | ||
229 | |||
230 | |||
231 | |||
103 | caps.RegisterHandler( | 232 | caps.RegisterHandler( |
104 | "UploadBakedTexture", | 233 | "UploadBakedTexture", |
105 | new RestStreamHandler( | 234 | new RestStreamHandler( |
106 | "POST", | 235 | "POST", |
107 | "/CAPS/" + caps.CapsObjectPath + m_uploadBakedTexturePath, | 236 | "/CAPS/" + caps.CapsObjectPath + m_uploadBakedTexturePath, |
108 | new UploadBakedTextureHandler( | 237 | avatarhandler.UploadBakedTexture, |
109 | caps, m_scene.AssetService, m_persistBakedTextures).UploadBakedTexture, | ||
110 | "UploadBakedTexture", | 238 | "UploadBakedTexture", |
111 | agentID.ToString())); | 239 | agentID.ToString())); |
240 | |||
241 | |||
242 | |||
243 | |||
112 | } | 244 | } |
113 | } | 245 | } |
114 | } \ No newline at end of file | 246 | } \ No newline at end of file |