/// <summary> /// Loads a Daggerfall flat (billboard). /// </summary> /// <param name="textureArchive">Texture archive index.</param> /// <param name="textureRecord">Texture record index.</param> /// <param name="textureFlags">Texture create flags.</param> /// <param name="material">Material.</param> /// <param name="startSize">Start size before scaling.</param> /// <param name="finalSize">Final size after scaling.</param> private void LoadDaggerfallFlat( int textureArchive, int textureRecord, MaterialManager.TextureCreateFlags textureFlags, out BaseMaterialEffect material, out Vector2 startSize, out Vector2 finalSize) { // Get path to texture file string path = Path.Combine( core.MaterialManager.Arena2Path, TextureFile.IndexToFileName(textureArchive)); // Get size and scale of this texture System.Drawing.Size size = TextureFile.QuickSize(path, textureRecord); System.Drawing.Size scale = TextureFile.QuickScale(path, textureRecord); // Set start size startSize.X = size.Width; startSize.Y = size.Height; // Apply scale int xChange = (int)(size.Width * (scale.Width / BlocksFile.ScaleDivisor)); int yChange = (int)(size.Height * (scale.Height / BlocksFile.ScaleDivisor)); finalSize.X = size.Width + xChange; finalSize.Y = size.Height + yChange; // Load material material = core.MaterialManager.CreateDaggerfallMaterialEffect( textureArchive, textureRecord, renderBillboards, MaterialManager.DefaultBillboardFlags); }
/// <summary> /// Add billboard to collection. /// </summary> /// <param name="archive">Texture archive.</param> /// <param name="record">Texture index.</param> /// <param name="position">Position relative to parent entity.</param> public void AddBillboard(int archive, int record, Vector3 position) { MaterialManager.TextureCreateFlags flags = MaterialManager.TextureCreateFlags.Dilate | MaterialManager.TextureCreateFlags.PreMultiplyAlpha | MaterialManager.TextureCreateFlags.MipMaps; // Load flat BaseMaterialEffect material; Vector2 startSize, finalSize; LoadDaggerfallFlat(archive, record, flags, out material, out startSize, out finalSize); // Calcuate final position Vector3 finalPosition = new Vector3(position.X, -position.Y + (finalSize.Y / 2) - 4, -position.Z); // Information about the billboard is packed into unused parts of the vertex format. // This allows us to send a huge static batch of billboards and correctly position, rotate, and scale // each one for the camera. for (int i = 0; i < 4; i++) { billboardVertices[i].Tangent = finalPosition; billboardVertices[i].Binormal = new Vector3(finalSize.X, finalSize.Y, 0); } // Add to batch staticGeometry.AddToBuilder(material.ID, billboardVertices, billboardIndices, Matrix.Identity); }