Beispiel #1
0
double cTerrainGen2D::BuildSteps(double width, const tParams& params, cRand& rand, std::vector<float>& out_data)
{
	double spacing_min = params[eParamsStepSpacingMin];
	double spacing_max = params[eParamsStepSpacingMax];
	double step_h0_min = params[eParamsStepHeight0Min];
	double step_h0_max = params[eParamsStepHeight0Max];
	double step_h1_min = params[eParamsStepHeight1Min];
	double step_h1_max = params[eParamsStepHeight1Max];

	double total_w = 0;
	while (total_w < width)
	{
		double min_h = 0;
		double max_h = 0;

		bool valid_h0 = (step_h0_min != 0 || step_h0_max != 0);
		bool valid_h1 = (step_h1_min != 0 || step_h1_max != 0);
		if (valid_h0 && valid_h1)
		{
			bool heads = rand.FlipCoin();
			min_h = (heads) ? step_h0_min : step_h1_min;
			max_h = (heads) ? step_h0_max : step_h1_max;
		}
		else if (valid_h0)
		{
			min_h = step_h0_min;
			max_h = step_h0_max;
		}
		else
		{
			min_h = step_h1_min;
			max_h = step_h1_max;
		}

		double w = rand.RandDouble(spacing_min, spacing_max);
		double h = rand.RandDouble(min_h, max_h);

		double curr_w = AddStep(w, h, out_data);
		total_w += curr_w;
	}

	return total_w;
}
Beispiel #2
0
double cTerrainGen2D::BuildCliffs(double width, const tParams& params, cRand& rand, std::vector<float>& out_data)
{
	double spacing_min = params[eParamsCliffSpacingMin];
	double spacing_max = params[eParamsCliffSpacingMax];
	double cliff_h0_min = params[eParamsCliffHeight0Min];
	double cliff_h0_max = params[eParamsCliffHeight0Max];
	double cliff_h1_min = params[eParamsCliffHeight1Min];
	double cliff_h1_max = params[eParamsCliffHeight1Max];
	int mini_count_max = static_cast<int>(params[eParamsCliffMiniCountMax]);

	double bump_h_min = params[eParamsBumpHeightMin];
	double bump_h_max = params[eParamsBumpHeightMax];

	const double delta_range = std::abs(params[eParamsSlopeDeltaRange]);
	const double delta_min = params[eParamsSlopeDeltaMin];
	const double delta_max = params[eParamsSlopeDeltaMax];

	int beg_idx = static_cast<int>(out_data.size());

	double total_w = 0;
	while (total_w < width)
	{
		double min_h = 0;
		double max_h = 0;

		bool valid_h0 = (cliff_h0_min != 0 || cliff_h0_max != 0);
		bool valid_h1 = (cliff_h1_min != 0 || cliff_h1_max != 0);
		if (valid_h0 && valid_h1)
		{
			bool heads = rand.FlipCoin();
			min_h = (heads) ? cliff_h0_min : cliff_h1_min;
			max_h = (heads) ? cliff_h0_max : cliff_h1_max;
		}
		else if (valid_h0)
		{
			min_h = cliff_h0_min;
			max_h = cliff_h0_max;
		}
		else
		{
			min_h = cliff_h1_min;
			max_h = cliff_h1_max;
		}

		double w = rand.RandDouble(spacing_min, spacing_max);
		double h = rand.RandDouble(min_h, max_h);

		double curr_w = 0;
		double curr_delta_h = 0;
		int num_mini = rand.RandInt(0, mini_count_max + 1);
		for (int i = 0; i < num_mini + 1; ++i)
		{
			const double mini_w = (i == 0) ? w : 0.1;
			double mini_h = rand.RandDouble(curr_delta_h, h);
			mini_h = (i == num_mini) ? h : mini_h;

			double dh = mini_h - curr_delta_h;
			curr_w += AddStep(mini_w, dh, out_data);

			curr_delta_h = mini_h;
		}

		total_w += curr_w;
	}

	int end_idx = static_cast<int>(out_data.size());
	OverlaySlopes(delta_range, delta_min, delta_max, 0, beg_idx, end_idx, rand, out_data);
	OverlayBumps(bump_h_min, bump_h_max, beg_idx, end_idx, rand, out_data);

	return total_w;
}
Beispiel #3
0
void SceneBuilder::AddStep(const RenderStepWrapper& step, ObjectHint hint)
{
    AddStep(step, std::vector<ObjectHint>{hint});
}