/// <summary> /// Wall texture rendering routine /// </summary> public void DrawTexturedWall(Graphics g, Map.Wall wall, bool transparent, bool beingSelected) { ThingDb.Wall tt = ThingDb.Walls[wall.matId]; try { int actualVari = (int)wall.Variation * 2; // для обычных стен все данные берутся отсюда ThingDb.Wall.WallRenderInfo wri = tt.RenderNormal[(int)wall.Facing][actualVari]; // если стену можно сломать if (wall.Destructable) { wri = tt.RenderBreakable[(int)wall.Facing][actualVari]; } // если стена содержит окошко if (wall.Window) { switch (wall.Facing) { case WallFacing.NORTH: wri = tt.RenderNormal[11][actualVari]; break; case WallFacing.WEST: wri = tt.RenderNormal[12][actualVari]; break; } } // достаем картинку Bitmap bitmap = VideoBag.GetBitmap(wri.SpriteIndex); BitmapShader shader = null; // тонируем если стена необычная /*if (wall.Destructable || wall.Secret || transparent || beingSelected || mapView.picking) * { * shader = new BitmapShader(bitmap); * shader.LockBitmap(); * if (wall.Destructable) * shader.ColorShade(ColorLayout.WallsBreakable, 0.30F); * if (wall.Secret) * shader.ColorShade(ColorLayout.WallsSecret, 0.40F); * if (wall.Secret_WallState == 4) * shader.MakeSemitransparent(135); * if (beingSelected) * { * Color selCol = Color.GhostWhite; * if (MapInterface.CurrentMode == EditMode.WALL_PLACE && !mapView.picking) * selCol = ColorLayout.Removing; * * if (MapInterface.CurrentMode == EditMode.WALL_CHANGE && !mapView.picking) * selCol = Color.Purple; * * * shader.ColorGradWaves(selCol, 4F, Environment.TickCount); * * } * * * * if (transparent) * shader.MakeSemitransparent(); * bitmap = shader.UnlockBitmap(); * }*/ // допускается что стена одновременно и секретная, и разрушаемая, и с окном int x, y; if (bitmap != null) { x = 23 * wall.Location.X; y = 23 * wall.Location.Y; // коррекция координат int offX = (0 - wri.unknown1) - videoBagProvider.DrawOffsets[wri.SpriteIndex][0]; int offY = wri.unknown2 - videoBagProvider.DrawOffsets[wri.SpriteIndex][1]; x -= offX + 50; y -= offY + 72; // собственно рисуем g.DrawImage(bitmap, x, y, bitmap.Width, bitmap.Height); // сразу чистим память если картинка не кэшируется if (shader != null) { bitmap.Dispose(); } } } catch (Exception) { } }
private void UpdateBtnImages(object sender, EventArgs e) { if (videoBag == null) { return; } if (numWallVariMax.Value < numWallVari.Value) { numWallVariMax.Value = numWallVari.Value; } ThingDb.Wall wall = ThingDb.Walls[GetSelWallTypeIndex()]; // в движке Нокса зачем-то так int vari = (int)numWallVari.Value * 2; ThingDb.Wall.WallRenderInfo[] ria; Bitmap bitmap; int sprite; Button wallButton; byte material = GetSelWallTypeIndex(); ria = wall.RenderNormal[0]; int hoho = ria.Length; hoho = (hoho / 2) - 1; numWallVariMax.Maximum = 30; if (numWallVariMax.Value < numWallVari.Value) { numWallVariMax.Value = numWallVari.Value; } // для каждого направления добавляем картинку if (WallSelectButtons != null) { for (int facing = 0; facing < 13; facing++) { //ria = wall.RenderBreakable[facing]; ria = wall.RenderNormal[facing]; wallButton = WallSelectButtons[facing]; if (ria.Length > vari) { sprite = ria[vari].SpriteIndex; // если включена опция Fast preview (помогает понять направления стен) подменяем картинку if (checkBlackWalls.Checked) { sprite = ThingDb.Walls[blackWallIndex].RenderNormal[facing][0].SpriteIndex; } // достаем картинку и включаем кнопку если такая стена существует bitmap = videoBag.GetBitmap(sprite); if (checkBlackWalls.Checked) { var shader = new render.BitmapShader(bitmap); shader.LockBitmap(); shader.ColorShade(Color.Salmon, 0.25F); bitmap = shader.UnlockBitmap(); } wallButton.BackgroundImage = bitmap; wallButton.Enabled = true; wallButton.BackColor = btnColorGoodWall; numWallVari.Maximum = hoho; numWallVariMax.Maximum = hoho; numWallVariMax.Value = (sender.GetType().Name == "ComboBox") ? hoho : numWallVariMax.Value; } else { if (facing == 0) { numWallVari.Value--; numWallVari.Maximum = numWallVari.Value; numWallVariMax.Maximum = numWallVari.Value; return; } // значит что стены с такими парамиетрами не существует wallButton.BackgroundImage = null; wallButton.Enabled = false; wallButton.BackColor = btnColorBadWall; } } } }