| 13 |
using System.Windows.Media.Imaging; |
using System.Windows.Media.Imaging; |
| 14 |
using OpenMetaverse.Imaging; |
using OpenMetaverse.Imaging; |
| 15 |
using Material = System.Windows.Media.Media3D.Material; |
using Material = System.Windows.Media.Media3D.Material; |
| 16 |
|
using System.Runtime.InteropServices; |
| 17 |
|
|
| 18 |
|
|
| 19 |
namespace Xenki.DefaultRenderer |
namespace Xenki.DefaultRenderer |
| 20 |
{ |
{ |
| 21 |
|
|
| 22 |
class DefaultRenderer : IRenderer |
class DefaultRenderer : IRenderer |
| 23 |
{ |
{ |
| 24 |
private readonly Viewport3D m_viewport; |
private readonly Viewport3D m_viewport; |
| 26 |
private CameraControl m_cameracontrol; |
private CameraControl m_cameracontrol; |
| 27 |
private IRendering m_mesher; |
private IRendering m_mesher; |
| 28 |
private DefaultTexture m_textureManager; |
private DefaultTexture m_textureManager; |
| 29 |
private DefaultDataControl m_primitiveData; |
private DefaultPrimControl m_primitiveData; |
|
|
|
|
//public ITextureManage TextureManager |
|
|
//{ |
|
|
// set { m_textureManager = value; } |
|
|
//} |
|
| 30 |
|
|
| 31 |
private bool Broken; |
private bool Broken; |
| 32 |
|
|
| 35 |
private ModelVisual3D m_terrain; |
private ModelVisual3D m_terrain; |
| 36 |
|
|
| 37 |
private readonly DiffuseMaterial m_terrainMaterial; |
private readonly DiffuseMaterial m_terrainMaterial; |
| 38 |
private string textureImageFolderPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "texture"); |
private string textureImageFolderPath = Mainform.TextureTempFolder; |
| 39 |
private GridClient m_gridclient; |
|
| 40 |
|
public static DependencyProperty dep = DependencyProperty.Register("ID", typeof(uint), typeof(Visual3D)); |
| 41 |
|
|
| 42 |
|
private int EnvirementCircleLength = 100; |
| 43 |
|
|
| 44 |
private GridClient gridClient; |
private GridClient gridClient; |
| 45 |
|
|
| 46 |
public GridClient GridClient |
public GridClient Gridclient |
| 47 |
{ |
{ |
| 48 |
get { return gridClient; } |
get { return gridClient; } |
| 49 |
set |
set |
| 50 |
{ |
{ |
| 51 |
gridClient = value; |
gridClient = value; |
| 52 |
|
|
| 53 |
|
m_textureManager = DefaultTexture.SingleTextureManager(); |
| 54 |
|
m_textureManager.GridClient = Gridclient; |
| 55 |
|
m_textureManager.OnDownloadFinished = OnTextureDownloaded; |
| 56 |
|
m_textureManager.StartDownload(); |
| 57 |
} |
} |
| 58 |
} |
} |
| 59 |
|
|
| 60 |
|
|
| 61 |
public DefaultRenderer(Viewport3D m_viewport) |
public DefaultRenderer(Viewport3D m_viewport) |
| 62 |
{ |
{ |
| 63 |
// Viewport |
// Viewport |
| 65 |
// m_viewport.ClipToBounds = false; |
// m_viewport.ClipToBounds = false; |
| 66 |
m_viewport.IsHitTestVisible = true; |
m_viewport.IsHitTestVisible = true; |
| 67 |
|
|
|
//setup data store control |
|
|
m_primitiveData = DefaultDataControl.SingleSceneDataManager(); |
|
|
m_textureManager = DefaultTexture.SingleTextureManager(); |
|
|
m_textureManager.GridClient = GridClient; |
|
|
m_textureManager.OnDownloadFinished = OnTextureDownloaded; |
|
|
m_textureManager.StartDownload(); |
|
| 68 |
|
|
| 69 |
|
//setup data store control |
| 70 |
|
m_primitiveData = DefaultPrimControl.SingleSceneDataManager(); |
| 71 |
|
|
| 72 |
// Camera Issues |
// Camera Issues |
| 73 |
Point3D CameraPos = new Point3D(0,0,50); |
Point3D CameraPos = new Point3D(0,0,50); |
| 78 |
|
|
| 79 |
m_camera.Position = CameraPos; |
m_camera.Position = CameraPos; |
| 80 |
m_camera.LookDirection = new Vector3D(CameraLook.X - m_camera.Position.X, CameraLook.Y - m_camera.Position.Y, CameraLook.Z - m_camera.Position.Z); |
m_camera.LookDirection = new Vector3D(CameraLook.X - m_camera.Position.X, CameraLook.Y - m_camera.Position.Y, CameraLook.Z - m_camera.Position.Z); |
|
|
|
| 81 |
m_camera.FarPlaneDistance = 1024; |
m_camera.FarPlaneDistance = 1024; |
| 82 |
m_camera.NearPlaneDistance = 0.01; |
m_camera.NearPlaneDistance = 0.01; |
| 83 |
m_viewport.Camera = m_camera; |
m_viewport.Camera = m_camera; |
| 86 |
m_cameracontrol = new CameraControl(m_camera,m_primitiveData); |
m_cameracontrol = new CameraControl(m_camera,m_primitiveData); |
| 87 |
m_cameracontrol.EventSource = m_viewport; |
m_cameracontrol.EventSource = m_viewport; |
| 88 |
|
|
| 89 |
|
m_cameracontrol.OncameraPositionChanged += new CameraPositionChanged(m_cameracontrol_cameraPositionChanged); |
| 90 |
|
|
| 91 |
GradientBrush terGrad = new RadialGradientBrush(Colors.ForestGreen, Colors.SandyBrown); |
GradientBrush terGrad = new RadialGradientBrush(Colors.ForestGreen, Colors.SandyBrown); |
| 92 |
m_terrainMaterial = new DiffuseMaterial( |
m_terrainMaterial = new DiffuseMaterial( |
| 93 |
terGrad); |
terGrad); |
| 113 |
{ |
{ |
| 114 |
for(int y=0;y<256;y++) |
for(int y=0;y<256;y++) |
| 115 |
{ |
{ |
| 116 |
m_heightmap[x, y] = 10.0; |
m_heightmap[x, y] = 0.0; |
| 117 |
} |
} |
| 118 |
} |
} |
| 119 |
|
|
| 128 |
// material)); |
// material)); |
| 129 |
} |
} |
| 130 |
|
|
| 131 |
|
|
| 132 |
|
|
| 133 |
public IRendering Mesher |
public IRendering Mesher |
| 134 |
{ |
{ |
| 135 |
set { m_mesher = value; } |
set { m_mesher = value; } |
| 153 |
new System.Windows.Forms.MethodInvoker |
new System.Windows.Forms.MethodInvoker |
| 154 |
(delegate |
(delegate |
| 155 |
{ |
{ |
|
// lock (m_primitiveData.PrimModelsInScene) |
|
|
{ |
|
| 156 |
try |
try |
| 157 |
{ |
{ |
| 158 |
bool WaitParentIn = true; |
bool WaitParentIn = true; |
| 159 |
if (data.ParentID == 0) |
if (data.ParentID == 0) |
| 160 |
{ |
{ |
|
//m_primitiveData.AddModelsParentPositions(id, data.Position); |
|
|
// test = true; |
|
| 161 |
WaitParentIn = false; |
WaitParentIn = false; |
| 162 |
} |
} |
| 163 |
else |
else |
| 164 |
{ |
{ |
| 165 |
if (m_primitiveData.PrimModelsInScene.ContainsKey(data.ParentID)) |
if (m_primitiveData.PrimModelsInScene.ContainsKey(data.ParentID)) |
| 166 |
WaitParentIn = false; |
WaitParentIn = false; |
|
/* |
|
|
Vector3 vec = m_primitiveData.GetModelsParentPosition(data.ParentID); |
|
|
if (vec != new Vector3()) |
|
|
{ |
|
|
if (test) |
|
|
{ |
|
|
OpenMetaverse.Quaternion qqq = m_primitiveData.GetParentRotation(data.ParentID); |
|
|
data.Position *= qqq; |
|
|
} |
|
|
test = false; |
|
|
data.Position += vec; |
|
|
//data.Position *= m_primitiveData.PrimModelsInScene[data.ParentID].Rotation ; |
|
|
m_primitiveData.AddModelsParentPositions(id, data.Position); |
|
|
|
|
|
WaitParentIn = false; |
|
|
} |
|
|
*/ |
|
| 167 |
} |
} |
| 168 |
|
|
| 169 |
if (WaitParentIn == false) |
if (WaitParentIn == false) |
| 170 |
{ |
{ |
|
|
|
| 171 |
if (m_primitiveData.SceneContainVisual(data.LocalID)) |
if (m_primitiveData.SceneContainVisual(data.LocalID)) |
| 172 |
{ |
{ |
| 173 |
m_viewport.Children.Remove(m_primitiveData.GetVisualInScene(data.LocalID)); |
|
| 174 |
|
Visual3D v = m_primitiveData.GetVisualInScene(data.LocalID); |
| 175 |
|
m_viewport.Children.Remove(v); |
| 176 |
|
|
| 177 |
m_primitiveData.RemoveVisualInScene(data.LocalID); |
m_primitiveData.RemoveVisualInScene(data.LocalID); |
| 178 |
|
m_primitiveData.RemovePrimtivePrimData(data.LocalID); |
| 179 |
|
v = null; |
| 180 |
} |
} |
| 181 |
|
|
| 182 |
ModelVisual3D model = CreateModel(data); |
ModelVisual3D model = CreateModel(data); |
| 183 |
|
|
| 184 |
m_primitiveData.AddNewPrimitive(data.LocalID, model, data.ParentID); |
m_primitiveData.AddNewPrimitive(data.LocalID, model, data.ParentID); |
| 185 |
m_primitiveData.AddNewPrimitivePrimData(data); |
//if(Point3D.Subtract(m_camera.Position, new Point3D( data.Position.X,data.Position.Y,data.Position.Z)).Length<= EnvirementCircleLength) |
|
m_primitiveData.RemoveWaitingParentPrimitive(data.LocalID); |
|
|
|
|
| 186 |
m_viewport.Children.Add(model); |
m_viewport.Children.Add(model); |
| 187 |
|
|
| 188 |
List<Primitive> waiting = m_primitiveData.GetModelsWaitingParent(data.LocalID); |
IEnumerator<Primitive> waiting = m_primitiveData.GetModelsWaitingParent(data.LocalID); |
| 189 |
|
|
| 190 |
foreach (Primitive child in waiting) |
while(waiting.MoveNext()) |
| 191 |
{ |
{ |
| 192 |
//Vector3 vec = m_primitiveData.GetModelsParentPosition(data.ParentID); |
AddPrimitive(waiting.Current.LocalID, waiting.Current); |
|
|
|
|
//if (vec != new Vector3()) |
|
|
//{ |
|
|
// OpenMetaverse.Quaternion qqq = m_primitiveData.GetParentRotation(child.ParentID); |
|
|
// child.Position *= qqq; |
|
|
// child.Position += data.Position; |
|
|
// //data.Position *= m_primitiveData.PrimModelsInScene[data.ParentID].Rotation ; |
|
|
// m_primitiveData.AddModelsParentPositions(child.LocalID, child.Position); |
|
|
//} |
|
|
|
|
|
//ModelVisual3D childmodel = CreateModel(child); |
|
|
//m_viewport.Children.Add(childmodel); |
|
|
|
|
|
//m_primitiveData.AddNewPrimitive(child.LocalID, childmodel, child.ParentID); |
|
|
//m_primitiveData.AddNewPrimitivePrimData(child); |
|
|
//m_primitiveData.RemoveWaitingParentPrimitive(child.LocalID); |
|
|
|
|
|
AddPrimitive(child.LocalID, child); |
|
| 193 |
} |
} |
| 194 |
waiting.Clear(); |
|
| 195 |
|
waiting.Dispose(); |
| 196 |
waiting = null; |
waiting = null; |
| 197 |
model = null; |
model = null; |
| 198 |
} |
} |
| 205 |
MessageBox.Show(e.ToString()); |
MessageBox.Show(e.ToString()); |
| 206 |
Broken = true; |
Broken = true; |
| 207 |
} |
} |
| 208 |
} |
|
| 209 |
} |
} |
| 210 |
) |
) |
| 211 |
); |
); |
| 260 |
|
|
| 261 |
return model; |
return model; |
| 262 |
} |
} |
| 263 |
|
GeometryModel3D triangleModel; |
| 264 |
|
SimpleMesh basic; |
| 265 |
|
MeshGeometry3D mesh; |
| 266 |
|
ModelVisual3D model; |
| 267 |
|
|
| 268 |
private ModelVisual3D CreateModel(Primitive data) |
private ModelVisual3D CreateModel(Primitive data) |
| 269 |
{ |
{ |
| 270 |
SimpleMesh basic = m_mesher.GenerateSimpleMesh(data, DetailLevel.Medium); |
return CreateModel_Vertices(data); |
| 271 |
MeshGeometry3D mesh = new MeshGeometry3D(); |
//return CreateModelFromFaced(data); |
| 272 |
|
} |
| 273 |
|
|
| 274 |
GeometryModel3D triangleModel = new GeometryModel3D(); |
private ModelVisual3D CreateModel_Vertices(Primitive data) |
| 275 |
|
{ |
| 276 |
|
|
| 277 |
|
basic = m_mesher.GenerateSimpleMesh(data, DetailLevel.Medium); |
| 278 |
|
|
| 279 |
lock(m_primitiveData.PrimModelsInScene) |
lock(m_primitiveData.PrimModelsInScene) |
| 280 |
if (m_primitiveData.PrimModelsInScene.ContainsKey(data.ParentID)) |
if (m_primitiveData.PrimModelsInScene.ContainsKey(data.ParentID)) |
| 281 |
{ |
{ |
| 282 |
//OpenMetaverse.Quaternion rotate = m_primitiveData.GetParentPosition(data.ParentID); |
Primitive parent = m_primitiveData.PrimModelsInScene[data.ParentID]; |
| 283 |
//if (m_primitiveData.PrimModelsInScene.ContainsKey(m_primitiveData.PrimModelsInScene[data.ParentID].ParentID)) |
data.Position *= parent.Rotation; |
| 284 |
// data.Position *= m_primitiveData.PrimModelsInScene[m_primitiveData.PrimModelsInScene[data.ParentID].ParentID].Rotation; |
data.Position += parent.Position; |
|
//else |
|
|
//data.Position *= m_primitiveData.PrimModelsInScene[data.ParentID].Rotation; |
|
|
data.Position += m_primitiveData.PrimModelsInScene[data.ParentID].Position; |
|
| 285 |
} |
} |
| 286 |
|
|
| 287 |
// Translation |
mesh = new MeshGeometry3D(); |
| 288 |
TranslateTransform3D tt = new TranslateTransform3D( |
triangleModel = new GeometryModel3D(); |
|
new Vector3D(data.Position.X, data.Position.Y, data.Position.Z) |
|
|
); |
|
|
|
|
|
Quaternion rot = new Quaternion(data.Rotation.X, data.Rotation.Y, data.Rotation.Z, data.Rotation.W); |
|
|
|
|
|
RotateTransform3D rt = new RotateTransform3D( |
|
|
new AxisAngleRotation3D(rot.Axis, rot.Angle) |
|
|
); |
|
|
|
|
|
// Scale |
|
|
ScaleTransform3D st = new ScaleTransform3D( |
|
|
new Vector3D(data.Scale.X, data.Scale.Y, data.Scale.Z)); |
|
|
|
|
| 289 |
foreach (Vertex v in basic.Vertices) |
foreach (Vertex v in basic.Vertices) |
| 290 |
{ |
{ |
| 291 |
Point3D d = new Point3D( |
Vector3 pos = v.Position; |
|
v.Position.X, |
|
|
v.Position.Y, |
|
|
v.Position.Z); |
|
| 292 |
|
|
| 293 |
//Scale |
pos *= data.Scale; |
| 294 |
d = st.Transform(d); |
pos *= data.Rotation;//there's something wrong about rotation |
| 295 |
// Rotate |
pos += data.Position; |
|
d = rt.Transform(d); |
|
|
// Move |
|
|
d = tt.Transform(d); |
|
| 296 |
|
|
| 297 |
|
Point3D d = new Point3D(pos.X, pos.Y, pos.Z); |
| 298 |
mesh.Positions.Add(d); |
mesh.Positions.Add(d); |
| 299 |
|
|
| 300 |
// These normals dont appear to be working for some reason, |
// These normals dont appear to be working for some reason, |
| 312 |
mesh.TriangleIndices.Add(ind); |
mesh.TriangleIndices.Add(ind); |
| 313 |
} |
} |
| 314 |
|
|
| 315 |
triangleModel = PatchTexture(data, mesh, triangleModel); |
if (data.Textures != null && data.Textures.DefaultTexture != null && |
| 316 |
|
data.Textures.DefaultTexture.TextureID != null) |
| 317 |
ModelVisual3D model = new ModelVisual3D(); |
triangleModel = PatchTexture(data.Textures.DefaultTexture, data.LocalID, mesh, triangleModel); |
| 318 |
|
else |
| 319 |
|
{ |
| 320 |
|
triangleModel = new GeometryModel3D( |
| 321 |
|
mesh, new DiffuseMaterial(new SolidColorBrush(Colors.CadetBlue))); |
| 322 |
|
} |
| 323 |
|
model = new ModelVisual3D(); |
| 324 |
model.Content = triangleModel; |
model.Content = triangleModel; |
| 325 |
|
model.SetValue(dep, data.LocalID); |
| 326 |
|
|
| 327 |
|
m_primitiveData.AddNewPrimitivePrimData(data); |
| 328 |
|
m_primitiveData.RemoveWaitingParentPrimitive(data.LocalID); |
| 329 |
|
|
| 330 |
return model; |
return model; |
| 331 |
} |
} |
| 332 |
|
|
| 333 |
private GeometryModel3D PatchTexture(Primitive data, MeshGeometry3D mesh, GeometryModel3D triangleModel) |
|
| 334 |
|
private GeometryModel3D PatchTexture(OpenMetaverse.Primitive.TextureEntryFace DefaultTexture, uint LocalID, MeshGeometry3D mesh, GeometryModel3D triangleModel) |
| 335 |
{ |
{ |
| 336 |
Color col = Colors.YellowGreen; |
Color col = Colors.YellowGreen; |
| 337 |
|
|
| 338 |
if (data.Textures != null && |
if (DefaultTexture != null) |
|
data.Textures.DefaultTexture != null && |
|
|
data.Textures.DefaultTexture.TextureID != null) |
|
| 339 |
{ |
{ |
| 340 |
Material m = m_primitiveData.GetMaterialFromCache(data.Textures.DefaultTexture.TextureID); |
Material m = m_primitiveData.GetMaterialFromCache(DefaultTexture.TextureID); |
| 341 |
if (m != null) |
if (m != null) |
| 342 |
{ |
{ |
| 343 |
triangleModel = new GeometryModel3D(mesh, m); |
triangleModel = new GeometryModel3D(mesh, m); |
| 344 |
// |
|
| 345 |
m_primitiveData.RemoveUnAttachedTexture(data.LocalID); |
m_primitiveData.RemoveUnAttachedTexture(LocalID); |
| 346 |
} |
} |
| 347 |
else |
else |
| 348 |
{ |
{ |
| 349 |
//ImageDownload image = m_textureManager.RetireveTextureData(data.Textures.DefaultTexture.TextureID); |
string bitmapPath = System.IO.Path.Combine(textureImageFolderPath, DefaultTexture.TextureID.ToString() + ".jpg"); |
|
// if (OpenJPEG.DecodeToImage(image.AssetData, out managedimg, out img)) |
|
|
//{ |
|
|
// System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(img); |
|
|
// ImageSourceConverter converter = new ImageSourceConverter(); |
|
|
// ImageSource imagesource = (BitmapImage) converter.ConvertFrom(bitmap); |
|
|
// ImageBrush brush = new ImageBrush(imagesource); |
|
|
// m = new DiffuseMaterial(brush); |
|
|
// triangleModel = new GeometryModel3D( |
|
|
// mesh, m); |
|
|
// // |
|
|
// m_primitiveData.RemoveUnAttachedTexture(data.LocalID); |
|
|
|
|
|
// if (m != null) |
|
|
// m_primitiveData.AddNewMaterial2Cache(data.Textures.DefaultTexture.TextureID, m); |
|
|
//} |
|
|
string bitmapPath = System.IO.Path.Combine(textureImageFolderPath, data.Textures.DefaultTexture.TextureID.ToString() + ".jpg"); |
|
| 350 |
|
|
| 351 |
if (File.Exists(bitmapPath)) |
if (File.Exists(bitmapPath)) |
| 352 |
{ |
{ |
| 355 |
m = new DiffuseMaterial(brush); |
m = new DiffuseMaterial(brush); |
| 356 |
|
|
| 357 |
triangleModel = new GeometryModel3D(mesh, m); |
triangleModel = new GeometryModel3D(mesh, m); |
| 358 |
// |
|
| 359 |
m_primitiveData.RemoveUnAttachedTexture(data.LocalID); |
m_primitiveData.RemoveUnAttachedTexture(LocalID); |
| 360 |
|
|
| 361 |
if (m != null) |
if (m != null) |
| 362 |
m_primitiveData.AddNewMaterial2Cache(data.Textures.DefaultTexture.TextureID, m); |
m_primitiveData.AddNewMaterial2Cache(DefaultTexture.TextureID, m); |
| 363 |
|
|
| 364 |
imagesource = null; |
imagesource = null; |
| 365 |
brush = null; |
brush = null; |
| 367 |
} |
} |
| 368 |
else |
else |
| 369 |
{ |
{ |
| 370 |
col = Color.FromScRgb(data.Textures.DefaultTexture.RGBA.A, |
col = Color.FromScRgb(DefaultTexture.RGBA.A, |
| 371 |
data.Textures.DefaultTexture.RGBA.R, |
DefaultTexture.RGBA.R, |
| 372 |
data.Textures.DefaultTexture.RGBA.G, |
DefaultTexture.RGBA.G, |
| 373 |
data.Textures.DefaultTexture.RGBA.B); |
DefaultTexture.RGBA.B); |
| 374 |
|
|
| 375 |
triangleModel = new GeometryModel3D( |
triangleModel = new GeometryModel3D( |
| 376 |
mesh, new DiffuseMaterial(new SolidColorBrush(col))); |
mesh, new DiffuseMaterial(new SolidColorBrush(col))); |
| 377 |
|
|
| 378 |
m_primitiveData.AddUnAttachedTexture(data.LocalID, data.Textures.DefaultTexture.TextureID); |
m_textureManager.RequestTexture(DefaultTexture.TextureID); |
| 379 |
|
m_primitiveData.AddNeedTextureModel(LocalID, DefaultTexture.TextureID); |
| 380 |
} |
} |
| 381 |
} |
} |
| 382 |
} |
} |
| 383 |
else |
else |
| 384 |
{ |
{ |
|
col = Color.FromScRgb(data.Textures.DefaultTexture.RGBA.A, |
|
|
data.Textures.DefaultTexture.RGBA.R, |
|
|
data.Textures.DefaultTexture.RGBA.G, |
|
|
data.Textures.DefaultTexture.RGBA.B); |
|
|
|
|
| 385 |
triangleModel = new GeometryModel3D( |
triangleModel = new GeometryModel3D( |
| 386 |
mesh, new DiffuseMaterial(new SolidColorBrush(col))); |
mesh, new DiffuseMaterial(new SolidColorBrush(col))); |
|
|
|
|
//ADD the visual to the needUpdateTexute list.when the texture downloaded update it. |
|
|
m_primitiveData.AddUnAttachedTexture(data.LocalID, data.Textures.DefaultTexture.TextureID); |
|
| 387 |
} |
} |
| 388 |
return triangleModel; |
return triangleModel; |
| 389 |
} |
} |
| 411 |
|
|
| 412 |
ModelVisual3D CreateModelFromFaced(Primitive data) |
ModelVisual3D CreateModelFromFaced(Primitive data) |
| 413 |
{ |
{ |
|
|
|
| 414 |
FacetedMesh faceMesh = m_mesher.GenerateFacetedMesh(data, DetailLevel.Medium); |
FacetedMesh faceMesh = m_mesher.GenerateFacetedMesh(data, DetailLevel.Medium); |
| 415 |
|
|
| 416 |
lock (m_primitiveData.PrimModelsInScene) |
lock (m_primitiveData.PrimModelsInScene) |
| 472 |
double x = (v.Position.Length() == float.Parse("0")) ? 0 : (v.Position.X / v.Position.Length()); |
double x = (v.Position.Length() == float.Parse("0")) ? 0 : (v.Position.X / v.Position.Length()); |
| 473 |
double y = (v.Position.Length() == float.Parse("0")) ? 0 : (v.Position.Y / v.Position.Length()); |
double y = (v.Position.Length() == float.Parse("0")) ? 0 : (v.Position.Y / v.Position.Length()); |
| 474 |
|
|
| 475 |
//mesh.TextureCoordinates.Add(new Point( x,y)); |
mesh.TextureCoordinates.Add(new Point( x,y)); |
| 476 |
} |
} |
| 477 |
//mesh.TextureCoordinates.Add(new Point(0, 0)); |
//mesh.TextureCoordinates.Add(new Point(0, 0)); |
| 478 |
//mesh.TextureCoordinates.Add(new Point(1, 0)); |
//mesh.TextureCoordinates.Add(new Point(1, 0)); |
| 488 |
{ |
{ |
| 489 |
visual = new ModelVisual3D(); |
visual = new ModelVisual3D(); |
| 490 |
|
|
| 491 |
Material m = m_primitiveData.GetMaterialFromCache(data.Textures.DefaultTexture.TextureID); |
Material m = m_primitiveData.GetMaterialFromCache(face.TextureFace.TextureID); |
| 492 |
if (m != null) |
if (m != null) |
| 493 |
{ |
{ |
| 494 |
triangleModel = new GeometryModel3D(mesh, m); |
triangleModel = new GeometryModel3D(mesh, m); |
| 497 |
} |
} |
| 498 |
else |
else |
| 499 |
{ |
{ |
| 500 |
string bitmapPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "texture\\" + face.TextureFace.TextureID.ToString() + ".jpg"); |
string bitmapPath = System.IO.Path.Combine(textureImageFolderPath , face.TextureFace.TextureID.ToString() + ".jpg"); |
| 501 |
if (File.Exists(bitmapPath) == false) |
if (File.Exists(bitmapPath) == false) |
| 502 |
{ |
{ |
| 503 |
//ADD the visual to the needUpdateTexute list.when the texture downloaded update it. |
//ADD the visual to the needUpdateTexute list.when the texture downloaded update it. |
| 504 |
m_primitiveData.AddUnAttachedTexture(data.LocalID, face.TextureFace.TextureID); |
m_primitiveData.AddNeedTextureModel(data.LocalID, face.TextureFace.TextureID); |
| 505 |
|
|
| 506 |
col = Color.FromScRgb(face.TextureFace.RGBA.A, |
col = Color.FromScRgb(face.TextureFace.RGBA.A, |
| 507 |
face.TextureFace.RGBA.R, |
face.TextureFace.RGBA.R, |
| 537 |
|
|
| 538 |
} |
} |
| 539 |
} |
} |
| 540 |
|
model.SetValue(dep, data.LocalID); |
| 541 |
return model; |
return model; |
| 542 |
|
|
| 543 |
|
|
| 547 |
|
|
| 548 |
public void UpdatePrimTexture(UUID textureID) |
public void UpdatePrimTexture(UUID textureID) |
| 549 |
{ |
{ |
| 550 |
List<Primitive> NeedUpdateVisuals = m_primitiveData.GetVisualByTextureID(textureID); |
IEnumerator<Primitive> NeedUpdateVisuals = m_primitiveData.GetVisualByTextureID(textureID); |
| 551 |
|
|
| 552 |
foreach (Primitive visual in NeedUpdateVisuals) |
while(NeedUpdateVisuals.MoveNext()) |
| 553 |
{ |
{ |
| 554 |
//m_primitiveData.RemoveUnAttachedTexture(visual.LocalID); |
UpdatePrimTexture(NeedUpdateVisuals.Current.LocalID,NeedUpdateVisuals.Current.Textures.DefaultTexture); |
|
RemovePrimitive(visual.LocalID); |
|
|
AddPrimitive(visual.LocalID, visual); |
|
| 555 |
} |
} |
| 556 |
|
NeedUpdateVisuals.Dispose(); |
|
NeedUpdateVisuals.Clear(); |
|
| 557 |
NeedUpdateVisuals = null; |
NeedUpdateVisuals = null; |
|
|
|
| 558 |
} |
} |
| 559 |
|
|
| 560 |
public void RemovePrimitive(uint id) |
private void UpdatePrimTexture(uint id,OpenMetaverse.Primitive.TextureEntryFace DefaultTexture) |
| 561 |
{ |
{ |
| 562 |
m_viewport.Dispatcher.Invoke( |
m_viewport.Dispatcher.Invoke( |
| 563 |
DispatcherPriority.Normal, |
DispatcherPriority.Normal, |
| 564 |
new System.Windows.Forms.MethodInvoker |
new System.Windows.Forms.MethodInvoker |
| 565 |
(delegate |
(delegate |
| 566 |
{ |
{ |
| 567 |
|
Visual3D v = m_primitiveData.GetVisualInScene(id); |
| 568 |
|
ModelVisual3D visual = v as ModelVisual3D; |
| 569 |
|
GeometryModel3D tringle = visual.Content as GeometryModel3D; |
| 570 |
|
tringle = PatchTexture(DefaultTexture, id, tringle.Geometry as MeshGeometry3D, tringle); |
| 571 |
|
|
| 572 |
{ |
visual.Content = tringle; |
| 573 |
|
|
| 574 |
|
} |
| 575 |
|
) |
| 576 |
|
); |
| 577 |
|
} |
| 578 |
|
|
| 579 |
|
public void RemovePrimitive(uint id) |
| 580 |
|
{ |
| 581 |
|
m_viewport.Dispatcher.Invoke( |
| 582 |
|
DispatcherPriority.Normal, |
| 583 |
|
new System.Windows.Forms.MethodInvoker |
| 584 |
|
(delegate |
| 585 |
|
{ |
| 586 |
// Remove from scene and models list |
// Remove from scene and models list |
| 587 |
m_viewport.Children.Remove(m_primitiveData.GetVisualInScene(id)); |
Visual3D v = m_primitiveData.GetVisualInScene(id); |
| 588 |
|
m_viewport.Children.Remove(v); |
| 589 |
|
v = null; |
| 590 |
|
|
| 591 |
m_primitiveData.RemoveVisualInScene(id); |
m_primitiveData.RemoveVisualInScene(id); |
| 592 |
m_primitiveData.RemovePrimtivePrimData(id); |
m_primitiveData.RemovePrimtivePrimData(id); |
| 593 |
} |
} |
|
} |
|
| 594 |
) |
) |
| 595 |
); |
); |
| 596 |
} |
} |
| 610 |
(delegate |
(delegate |
| 611 |
{ |
{ |
| 612 |
m_viewport.Children.Remove(m_terrain); |
m_viewport.Children.Remove(m_terrain); |
| 613 |
|
|
| 614 |
|
m_terrain = null; |
| 615 |
|
|
| 616 |
m_terrain = CreateTerrain(map); |
m_terrain = CreateTerrain(map); |
| 617 |
m_viewport.Children.Add(m_terrain); |
m_viewport.Children.Add(m_terrain); |
| 618 |
} |
} |
| 619 |
) |
) |
| 620 |
); |
); |
| 621 |
} |
} |
| 622 |
|
|
| 623 |
|
void m_cameracontrol_cameraPositionChanged(Point3D oldpos, Point3D newpos) |
| 624 |
|
{ |
| 625 |
|
ShowModelAround(newpos, this.EnvirementCircleLength); |
| 626 |
|
} |
| 627 |
|
|
| 628 |
|
private void ShowModelAround(Point3D center, int radius) |
| 629 |
|
{ |
| 630 |
|
IEnumerator<Primitive> modelsAround = GetModelsAround(center, radius); |
| 631 |
|
|
| 632 |
|
while (modelsAround.MoveNext()) |
| 633 |
|
{ |
| 634 |
|
AddPrimitive(modelsAround.Current.LocalID, modelsAround.Current); |
| 635 |
|
} |
| 636 |
|
} |
| 637 |
|
|
| 638 |
|
private IEnumerator<Primitive> GetModelsAround(Point3D center, int radius) |
| 639 |
|
{ |
| 640 |
|
throw new NotImplementedException(); |
| 641 |
|
} |
| 642 |
} |
} |
| 643 |
|
|
| 644 |
} |
} |