> ・PlantedMtVoxelを使わず、既存のMountainVoxelに木を持たせるようにする
> ・描画速度の問題に対応するため、オプションで樹木描画をON/OFF出来るようにする
ということで、結構修正個所が多岐にわたりました。
以下にdiffを示します。よろしくお願いします。
※ForestVoxelはMountainVoxelに統合したため、ForestVoxel.csは不要になります
Index: ForestBuilder.cs
===================================================================
RCS file: /cvsroot/freetrain/FreeTrain/plugins/org.kohsuke.freetrain.land.forest/src/ForestBuilder.cs,v
retrieving revision 1.5
diff -u -r1.5 ForestBuilder.cs
--- ForestBuilder.cs 26 Jun 2003 15:02:34 -0000 1.5
+++ ForestBuilder.cs 26 Jul 2003 02:41:05 -0000
@@ -9,6 +9,7 @@
using freetrain.controllers;
using freetrain.framework.graphics;
using freetrain.framework.plugin;
+using freetrain.world.terrain;
using freetrain.views;
namespace freetrain.world.land.forest
@@ -66,6 +67,18 @@
private static readonly Random rnd = new Random();
+ private static new bool canBeBuilt(Location loc)
+ {
+ if( World.world.getGroundLevel(loc) != loc.z )
+ {
+ return false;
+ }
+ else if(!World.world.isReusable(loc))
+ {
+ return (World.world[loc] is MountainVoxel );
+ }
+ else return true;
+ }
/// <summary>
/// Gets the land that should be used to fill (x,y) within [x1,y1]-[x2,y2] (inclusive).
@@ -75,11 +88,19 @@
for( int y=y1; y<=y2; y++ ) {
Location loc = new Location(x,y,z);
- if( ForestVoxel.canBeBuilt(loc) ) {
+ if( canBeBuilt(loc) )
+ {
byte[] patterns = createRandomTrees();
- if( patterns.Length!=0 )
- new ForestVoxel( loc, this, patterns );
- }
+ if( patterns.Length!=0 )
+ {
+ MountainVoxel v;
+ if( World.world[loc] is MountainVoxel )
+ v = (MountainVoxel)World.world[loc];
+ else
+ v = new MountainVoxel( loc, 0,0,0,0 );
+ v.setTrees(ground, sprites, patterns,price);
+ }
+ }
}
}
}
Index: Bulldozer.cs
===================================================================
RCS file: /cvsroot/freetrain/FreeTrain/core/contributions/land/Bulldozer.cs,v
retrieving revision 1.3
diff -u -r1.3 Bulldozer.cs
--- Bulldozer.cs 27 Mar 2003 01:56:12 -0000 1.3
+++ Bulldozer.cs 26 Jul 2003 02:46:56 -0000
@@ -9,6 +9,7 @@
using freetrain.framework;
using freetrain.views;
using freetrain.world;
+using freetrain.world.terrain;
using freetrain.world.land;
namespace freetrain.contributions.land
@@ -34,6 +35,11 @@
for( int y=loc1.y; y<=loc2.y; y++ ) {
if( World.world.isReusable(x,y,z) && World.world[x,y,z]!=null )
World.world.remove(x,y,z);
+ else if(World.world[x,y,z] is MountainVoxel)
+ {
+ MountainVoxel v = (MountainVoxel)World.world[x,y,z];
+ v.removeTrees();
+ }
}
}
}
Index: MountainVoxel.cs
===================================================================
RCS file: /cvsroot/freetrain/FreeTrain/core/world/terrain/MountainVoxel.cs,v
retrieving revision 1.23
diff -u -r1.23 MountainVoxel.cs
--- MountainVoxel.cs 9 May 2003 01:34:06 -0000 1.23
+++ MountainVoxel.cs 26 Jul 2003 02:35:02 -0000
@@ -14,7 +14,13 @@
[Serializable]
public class MountainVoxel : AbstractVoxelImpl, Entity
{
- public MountainVoxel( Location loc, byte hNE, byte hSE, byte hSW, byte hNW ) : base(loc) {
+ private Sprite[] patterns;
+ private Sprite ground;
+ private byte[] indices;
+ private int treePrice;
+
+ public MountainVoxel( Location loc, byte hNE, byte hSE, byte hSW, byte hNW ) : base(loc)
+ {
Debug.Assert( 0<=hNE && hNE<=4 );
Debug.Assert( 0<=hSE && hSE<=4 );
@@ -137,7 +143,7 @@
public event EventHandler onEntityRemoved;
- public int entityValue { get { return 0; } }
+ public int entityValue { get { return 0 + treePrice; } }
#endregion
@@ -154,22 +160,38 @@
}
}
- public override void draw( DrawContext display, Point pt, int heightCutDiff ) {
+ public override void draw( DrawContext display, Point pt, int heightCutDiff )
+ {
+ drawGround(display,pt,heightCutDiff);
+ if( patterns != null && !Core.options.hideTrees)
+ drawTrees(display,pt,heightCutDiff);
+ }
+
+ private void drawGround(DrawContext display, Point pt, int heightCutDiff )
+ {
Point basePt = pt;
World world = World.world;
- if( heightCutDiff==0 ) {
+ if( heightCutDiff==0 )
+ {
ResourceUtil.emptyChip.drawShape( display.surface, pt,
isUnderWater ? waterColors[3] : currentMountainColors[3] );
return;
}
+ if( isFlattened )
+ {
+ if( ground != null )
+ ground.draw( display.surface, pt );
+ return;
+ }
+
pt.Y -= getHeight(0)*4; // apply offset
// compute target colors
Color[] dstColors = new Color[]{
- selectColor(),
- mapColor(isUnderWater?Color.Navy:currentMountainColors[0]) };
+ selectColor(),
+ mapColor(isUnderWater?Color.Navy:currentMountainColors[0]) };
int tdiff = (getHeight(0)-getHeight(2)+4);
int umax = Math.Min(tdiff+2,6);
@@ -180,10 +202,12 @@
int ldiff = (getHeight(0)-getHeight(3)+2);
bool vflip;
- if( ldiff < tdiff-ldiff ) {
+ if( ldiff < tdiff-ldiff )
+ {
vflip = true;
ldiff = tdiff-ldiff;
- } else
+ }
+ else
vflip = false;
int lidx = (umax-ldiff);
@@ -195,18 +219,20 @@
// left cliff
Location neighbor = location+Direction.WEST;
if(!(world[neighbor] is MountainVoxel)
- && getHeight(2)+getHeight(3)>0
- && world.getGroundLevel(neighbor) <= world.getGroundLevel(location) )
+ && getHeight(2)+getHeight(3)>0
+ && world.getGroundLevel(neighbor) <= world.getGroundLevel(location) )
cliff[0,getHeight(3),getHeight(2)].draw( display.surface, basePt );
}
// right half
int rdiff = (getHeight(0)-getHeight(1)+2);
- if( rdiff < tdiff-rdiff ) {
+ if( rdiff < tdiff-rdiff )
+ {
vflip = true;
rdiff = tdiff-rdiff;
- } else
+ }
+ else
vflip = false;
int ridx = (umax-rdiff);
@@ -220,13 +246,29 @@
// right cliff
Location neighbor = location+Direction.SOUTH;
if(!(world[neighbor] is MountainVoxel)
- && getHeight(2)+getHeight(1)>0
- && world.getGroundLevel(neighbor) <= world.getGroundLevel(location) )
+ && getHeight(2)+getHeight(1)>0
+ && world.getGroundLevel(neighbor) <= world.getGroundLevel(location) )
cliff[1,getHeight(2),getHeight(1)].draw( display.surface, basePt );
}
+ }
+ private void drawTrees(DrawContext display, Point pt, int heightCutDiff)
+ {
+ int h = getHeight(Direction.NORTHEAST)-getHeight(Direction.SOUTHWEST);
+ //int w = getHeight(Direction.NORTHWEST)-getHeight(Direction.SOUTHEAST);
+ if( h > 0)
+ {
+ for( int i=0; i<indices.Length; i+=3 )
+ patterns[ indices[i+2] ].draw( display.surface,
+ new Point( pt.X+indices[i+0], pt.Y+indices[i+1]*(h+4)/4-8 ) );
+ }
+ else
+ {
+ for( int i=0; i<indices.Length; i+=3 )
+ patterns[ indices[i+2] ].draw( display.surface,
+ new Point( pt.X+indices[i+0], pt.Y+indices[i+1]*(h+4)/4+2 ) );
+ }
}
-
private static readonly Color[] srcColors = new Color[]{ Color.White, Color.Black };
@@ -329,7 +371,32 @@
public static MountainVoxel get( Location loc ) {
return World.world[loc] as MountainVoxel;
}
+
+ public void setTrees(Sprite ground, Sprite[] trees, byte[] indices, int price)
+ {
+ this.ground = ground;
+ patterns = trees;
+ this.indices = indices;
+ treePrice = price;
+ }
+ public void removeTrees()
+ {
+ ground = null;
+ patterns = null;
+ indices = null;
+ treePrice = 0;
+ }
+
+ public bool hasTrees
+ {
+ get {return patterns!=null; }
+ }
+
+ public void flatten()
+ {
+ heightData=0;
+ }
#region cliff
private static Sprite[,,] cliff = new Sprite[2/*0:S,1:W*/,5/*lHeight*/,5/*rHeight*/];
-------------以下は表示設定オプション関連----------------
Index: GlobalOptions.cs
===================================================================
RCS file: /cvsroot/freetrain/FreeTrain/core/framework/GlobalOptions.cs,v
retrieving revision 1.6
diff -u -r1.6 GlobalOptions.cs
--- GlobalOptions.cs 30 Dec 2002 17:10:40 -0000 1.6
+++ GlobalOptions.cs 26 Jul 2003 02:30:29 -0000
@@ -57,7 +57,28 @@
}
}
- public new GlobalOptions load() {
+ /// <summary>
+ /// If false, draw trees.
+ /// If true, speed up drawing by ignore drawing trees.
+ /// </summary>
+ private bool _hideTrees = false;
+
+ public bool hideTrees
+ {
+ get
+ {
+ return _hideTrees;
+ }
+ set
+ {
+ if( _hideTrees!=value && world.World.world!=null )
+ world.World.world.onAllVoxelUpdated(); // redraw
+ _hideTrees = value;
+ }
+ }
+
+ public new GlobalOptions load()
+ {
return (GlobalOptions)base.load();
}
Index: ConfigDialog.cs
===================================================================
RCS file: /cvsroot/freetrain/FreeTrain/core/framework/ConfigDialog.cs,v
retrieving revision 1.4
diff -u -r1.4 ConfigDialog.cs
--- ConfigDialog.cs 25 Dec 2002 02:02:42 -0000 1.4
+++ ConfigDialog.cs 26 Jul 2003 02:30:30 -0000
@@ -3,6 +3,7 @@
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
+using freetrain.world;
namespace freetrain.framework
{
@@ -20,6 +21,7 @@
private System.Windows.Forms.TrackBar msgStatusLength;
private System.Windows.Forms.CheckBox drawStationNames;
private System.Windows.Forms.CheckBox showBoundingBox;
+ private System.Windows.Forms.CheckBox hideTrees;
private readonly GlobalOptions opts;
@@ -34,6 +36,7 @@
msgStatusLength.Value = opts.messageDisplayTime;
drawStationNames.Checked = opts.drawStationNames;
showBoundingBox.Checked = opts.drawBoundingBox;
+ hideTrees.Checked = opts.hideTrees;
}
protected override void Dispose( bool disposing ) {
@@ -59,6 +62,7 @@
this.radioMsgBox = new System.Windows.Forms.RadioButton();
this.drawStationNames = new System.Windows.Forms.CheckBox();
this.showBoundingBox = new System.Windows.Forms.CheckBox();
+ this.hideTrees = new System.Windows.Forms.CheckBox();
this.groupBox1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.msgStatusLength)).BeginInit();
this.SuspendLayout();
@@ -110,7 +114,7 @@
this.msgStatusLength.Location = new System.Drawing.Point(160, 32);
this.msgStatusLength.Minimum = 1;
this.msgStatusLength.Name = "msgStatusLength";
- this.msgStatusLength.Size = new System.Drawing.Size(224, 45);
+ this.msgStatusLength.Size = new System.Drawing.Size(224, 42);
this.msgStatusLength.TabIndex = 2;
this.msgStatusLength.Value = 1;
//
@@ -152,6 +156,15 @@
this.showBoundingBox.TabIndex = 4;
this.showBoundingBox.Text = "描画範囲を表示(デバッグ)";
//
+ // hideTrees
+ //
+ this.hideTrees.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.hideTrees.Location = new System.Drawing.Point(24, 152);
+ this.hideTrees.Name = "hideTrees";
+ this.hideTrees.Size = new System.Drawing.Size(168, 16);
+ this.hideTrees.TabIndex = 4;
+ this.hideTrees.Text = "樹木の描画を省略";
+ //
// ConfigDialog
//
this.AcceptButton = this.buttonOK;
@@ -163,7 +176,8 @@
this.drawStationNames,
this.groupBox1,
this.buttonCancel,
- this.buttonOK});
+ this.buttonOK,
+ this.hideTrees});
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
@@ -187,9 +201,11 @@
opts.messageDisplayTime = msgStatusLength.Value;
opts.drawStationNames = drawStationNames.Checked;
opts.drawBoundingBox = showBoundingBox.Checked;
+ opts.hideTrees = hideTrees.Checked;
opts.save();
Close();
}
+
}
}
_______________________________________________
FreeTrain-general mailing list
FreeTrain-general@lists.sourceforge.jp
http://lists.sourceforge.jp/mailman/listinfo/freetrain-general