public void OnAsyncLoad(WmoRoot root) { var indices = new List <ushort>(); var vertices = new List <WmoVertex>(); Data = root; var groups = root.Groups.Select(@group => new WmoGroupRender(@group, this)).ToList(); Groups = groups.AsReadOnly(); mBoundingBox = Data.BoundingBox; foreach (var group in Groups) { group.BaseIndex = indices.Count; group.BaseVertex = vertices.Count; indices.AddRange(group.Data.Indices); vertices.AddRange(group.Data.Vertices); } mVertices = vertices.ToArray(); mIndices = indices.Select(i => (uint)i).ToArray(); mAsyncLoaded = true; }
public WmoInstance(int uuid, Vector3 position, Vector3 rotation, WmoRootRender model) { ReferenceCount = 1; Uuid = uuid; BoundingBox = model.BoundingBox; mPosition = position; mRotation = rotation; mModel = model; mInstanceMatrix = Matrix.RotationYawPitchRoll(MathUtil.DegreesToRadians(rotation.Y), MathUtil.DegreesToRadians(rotation.X), MathUtil.DegreesToRadians(rotation.Z)) * Matrix.Translation(position); mRenderer = new WeakReference <WmoRootRender>(model); InstanceCorners = model.BoundingBox.GetCorners(); Vector3.TransformCoordinate(InstanceCorners, ref mInstanceMatrix, InstanceCorners); BoundingBox = BoundingBox.Transform(ref mInstanceMatrix); GroupBoxes = new BoundingBox[model.Groups.Count]; for (var i = 0; i < GroupBoxes.Length; ++i) { var group = model.Groups[i]; GroupBoxes[i] = group.BoundingBox.Transform(ref mInstanceMatrix); } Matrix.Invert(ref mInstanceMatrix, out mInverseInstanceMatrix); mInstanceMatrix = Matrix.Transpose(mInstanceMatrix); ModelRoot = model.Data; }
public void SetPosition(Vector3 position) { mPosition = position; mInstanceMatrix = Matrix.RotationYawPitchRoll(MathUtil.DegreesToRadians(mRotation.Y), MathUtil.DegreesToRadians(mRotation.X), MathUtil.DegreesToRadians(mRotation.Z)); mInstanceMatrix *= Matrix.Translation(mPosition); Matrix.Invert(ref mInstanceMatrix, out mInverseInstanceMatrix); BoundingBox = mModel.BoundingBox.Transform(ref mInstanceMatrix); GroupBoxes = new BoundingBox[mModel.Groups.Count]; for (var i = 0; i < GroupBoxes.Length; ++i) { var group = mModel.Groups[i]; GroupBoxes[i] = group.BoundingBox.Transform(ref mInstanceMatrix); } InstanceCorners = mModel.BoundingBox.GetCorners(); Vector3.TransformCoordinate(InstanceCorners, ref mInstanceMatrix, InstanceCorners); mInstanceMatrix = Matrix.Transpose(mInstanceMatrix); ModelRoot = mModel.Data; UpdateModelNameplate(); }
public void UpdatePosition(Vector3 position) { mPosition += position; mInstanceMatrix = Matrix.RotationYawPitchRoll(MathUtil.DegreesToRadians(mRotation.Y), MathUtil.DegreesToRadians(mRotation.X), MathUtil.DegreesToRadians(mRotation.Z)); //mRenderer = new WeakReference<WmoRootRender>(mModel); mInstanceMatrix *= Matrix.Translation(mPosition); Matrix.Invert(ref mInstanceMatrix, out mInverseInstanceMatrix); BoundingBox = mModel.BoundingBox.Transform(ref mInstanceMatrix); //here is the problem, after this line the bBox is f****d up GroupBoxes = new BoundingBox[mModel.Groups.Count]; for (var i = 0; i < GroupBoxes.Length; ++i) { var group = mModel.Groups[i]; GroupBoxes[i] = group.BoundingBox.Transform(ref mInstanceMatrix); } InstanceCorners = mModel.BoundingBox.GetCorners(); Vector3.TransformCoordinate(InstanceCorners, ref mInstanceMatrix, InstanceCorners); mInstanceMatrix = Matrix.Transpose(mInstanceMatrix); ModelRoot = mModel.Data; UpdateModelNameplate(); }
public void Rotate(float x, float y, float z) { mRotation.X += x; mRotation.Y += y; mRotation.Z += z; mInstanceMatrix = Matrix.RotationYawPitchRoll(MathUtil.DegreesToRadians(mRotation.Y), MathUtil.DegreesToRadians(mRotation.X), MathUtil.DegreesToRadians(mRotation.Z)); mInstanceMatrix *= Matrix.Translation(mPosition); //mRenderer = new WeakReference<WmoRootRender>(mModel); Matrix.Invert(ref mInstanceMatrix, out mInverseInstanceMatrix); BoundingBox = mModel.BoundingBox.Transform(ref mInstanceMatrix); GroupBoxes = new BoundingBox[mModel.Groups.Count]; for (var i = 0; i < GroupBoxes.Length; ++i) { var group = mModel.Groups[i]; GroupBoxes[i] = group.BoundingBox.Transform(ref mInstanceMatrix); } InstanceCorners = mModel.BoundingBox.GetCorners(); Vector3.TransformCoordinate(InstanceCorners, ref mInstanceMatrix, InstanceCorners); mInstanceMatrix = Matrix.Transpose(mInstanceMatrix); ModelRoot = mModel.Data; UpdateModelNameplate(); }
private void Dispose(bool disposing) { DestroyModelNameplate(); ModelRoot = null; mRenderer = null; }
public WmoMaterial(WmoRoot root, int shader, int texture1, int texture2, int texture3, int blendMode, uint flags, uint materialFlags) { Textures = new Graphics.Texture[0]; MaterialFlags = materialFlags; mTexture1 = texture1; mTexture2 = texture2; mTexture3 = texture3; ShaderType = shader; BlendMode = blendMode; Flags1 = flags; LoadTextures(root); }
private void LoadTextures(WmoRoot root) { switch (ShaderType) { case 11: case 12: case 7: Textures = new[] { root.GetTexture(mTexture1), root.GetTexture(mTexture2), root.GetTexture(mTexture3) }; break; case 5: case 6: case 8: case 9: case 13: case 15: case 3: Textures = new[] { root.GetTexture(mTexture1), root.GetTexture(mTexture2), }; break; default: Textures = new[] { root.GetTexture(mTexture1), }; break; } }