private bool Draw3DStretched(SpriteBatch3D spriteBatch, Vector3 drawPosition, MouseOverList mouseOverList, Map map) { // this is an isometric stretched tile and needs a specialized draw routine. m_vertexBufferAlternate[0].Position = drawPosition + m_vertex0_yOffset; m_vertexBufferAlternate[1].Position = drawPosition + m_vertex1_yOffset; m_vertexBufferAlternate[2].Position = drawPosition + m_vertex2_yOffset; m_vertexBufferAlternate[3].Position = drawPosition + m_vertex3_yOffset; if (!spriteBatch.DrawSprite(DrawTexture, m_vertexBufferAlternate, s_Technique)) return false; if ((mouseOverList.PickType & PickType) == PickType) { if (mouseOverList.IsMouseInObjectIsometric(m_vertexBufferAlternate)) { MouseOverItem item = new MouseOverItem(DrawTexture, m_vertexBufferAlternate[0].Position, Entity); item.Vertices = new Vector3[4] { m_vertexBufferAlternate[0].Position, m_vertexBufferAlternate[1].Position, m_vertexBufferAlternate[2].Position, m_vertexBufferAlternate[3].Position }; mouseOverList.Add2DItem(item); } } return true; }
public virtual bool Draw(SpriteBatch3D spriteBatch, Vector3 drawPosition, MouseOverList mouseOverList, Map map, bool roofHideFlag) { VertexPositionNormalTextureHue[] vertexBuffer; if (Rotation != 0) { float w = DrawArea.Width / 2f; float h = DrawArea.Height / 2f; Vector3 center = drawPosition - new Vector3(DrawArea.X - IsometricRenderer.TILE_SIZE_INTEGER + w, DrawArea.Y + h, 0); float sinx = (float)Math.Sin(Rotation) * w; float cosx = (float)Math.Cos(Rotation) * w; float siny = (float)Math.Sin(Rotation) * -h; float cosy = (float)Math.Cos(Rotation) * -h; // 2 0 // |\ | // | \| // 3 1 vertexBuffer = VertexPositionNormalTextureHue.PolyBufferFlipped; vertexBuffer[0].Position = center; vertexBuffer[0].Position.X += cosx - -siny; vertexBuffer[0].Position.Y -= sinx + -cosy; vertexBuffer[1].Position = center; vertexBuffer[1].Position.X += cosx - siny; vertexBuffer[1].Position.Y += -sinx + -cosy; vertexBuffer[2].Position = center; vertexBuffer[2].Position.X += -cosx - -siny; vertexBuffer[2].Position.Y += sinx + cosy; vertexBuffer[3].Position = center; vertexBuffer[3].Position.X += -cosx - siny; vertexBuffer[3].Position.Y += sinx + -cosy; } else { if (DrawFlip) { // 2 0 // |\ | // | \| // 3 1 vertexBuffer = VertexPositionNormalTextureHue.PolyBufferFlipped; vertexBuffer[0].Position = drawPosition; vertexBuffer[0].Position.X += DrawArea.X + IsometricRenderer.TILE_SIZE_FLOAT; vertexBuffer[0].Position.Y -= DrawArea.Y; vertexBuffer[0].TextureCoordinate.Y = 0; vertexBuffer[1].Position = vertexBuffer[0].Position; vertexBuffer[1].Position.Y += DrawArea.Height; vertexBuffer[2].Position = vertexBuffer[0].Position; vertexBuffer[2].Position.X -= DrawArea.Width; vertexBuffer[2].TextureCoordinate.Y = 0; vertexBuffer[3].Position = vertexBuffer[1].Position; vertexBuffer[3].Position.X -= DrawArea.Width; /*if (m_YClipLine != 0) { if (m_YClipLine > vertexBuffer[3].Position.Y) return false; else if (m_YClipLine > vertexBuffer[0].Position.Y) { float uvStart = (m_YClipLine - vertexBuffer[0].Position.Y) / DrawTexture.Height; vertexBuffer[0].Position.Y = vertexBuffer[2].Position.Y = m_YClipLine; vertexBuffer[0].TextureCoordinate.Y = vertexBuffer[2].TextureCoordinate.Y = uvStart; } }*/ } else { // 0---1 // / // / // 2---3 vertexBuffer = VertexPositionNormalTextureHue.PolyBuffer; vertexBuffer[0].Position = drawPosition; vertexBuffer[0].Position.X -= DrawArea.X; vertexBuffer[0].Position.Y -= DrawArea.Y; vertexBuffer[0].TextureCoordinate.Y = 0; vertexBuffer[1].Position = vertexBuffer[0].Position; vertexBuffer[1].Position.X += DrawArea.Width; vertexBuffer[1].TextureCoordinate.Y = 0; vertexBuffer[2].Position = vertexBuffer[0].Position; vertexBuffer[2].Position.Y += DrawArea.Height; vertexBuffer[3].Position = vertexBuffer[1].Position; vertexBuffer[3].Position.Y += DrawArea.Height; /*if (m_YClipLine != 0) { if (m_YClipLine >= vertexBuffer[3].Position.Y) return false; else if (m_YClipLine > vertexBuffer[0].Position.Y) { float uvStart = (m_YClipLine - vertexBuffer[0].Position.Y) / DrawTexture.Height; vertexBuffer[0].Position.Y = vertexBuffer[1].Position.Y = m_YClipLine; vertexBuffer[0].TextureCoordinate.Y = vertexBuffer[1].TextureCoordinate.Y = uvStart; } }*/ } } if (vertexBuffer[0].Hue != HueVector) vertexBuffer[0].Hue = vertexBuffer[1].Hue = vertexBuffer[2].Hue = vertexBuffer[3].Hue = HueVector; if (!spriteBatch.DrawSprite(DrawTexture, vertexBuffer, s_Technique)) { // the vertex buffer was not on screen, return false (did not draw) return false; } Pick(mouseOverList, vertexBuffer); if (IsShadowCastingView) { spriteBatch.DrawShadow(DrawTexture, vertexBuffer, new Vector2( drawPosition.X + IsometricRenderer.TILE_SIZE_FLOAT_HALF, drawPosition.Y + (Entity.Position.Offset.X + Entity.Position.Offset.Y) * IsometricRenderer.TILE_SIZE_FLOAT_HALF - ((Entity.Position.Z_offset + Entity.Z) * 4) + IsometricRenderer.TILE_SIZE_FLOAT_HALF), DrawFlip, DrawShadowZDepth); } return true; }
bool Draw3DStretched(SpriteBatch3D spriteBatch, Vector3 drawPosition, MouseOverList mouseOver, Map map) { // this is an isometric stretched tile and needs a specialized draw routine. m_vertexBufferAlternate[0].Position = drawPosition + m_vertex0_yOffset; m_vertexBufferAlternate[1].Position = drawPosition + m_vertex1_yOffset; m_vertexBufferAlternate[2].Position = drawPosition + m_vertex2_yOffset; m_vertexBufferAlternate[3].Position = drawPosition + m_vertex3_yOffset; if (!spriteBatch.DrawSprite(DrawTexture, m_vertexBufferAlternate, Technique)) { return false; } if ((mouseOver.PickType & PickType) == PickType) { if (mouseOver.IsMouseInObjectIsometric(m_vertexBufferAlternate)) { mouseOver.AddItem(Entity, m_vertexBufferAlternate[0].Position); } } return true; }