Esempio n. 1
0
void Net::ReadData(const mxArray *mx_data) {
  LayerInput *firstlayer = static_cast<LayerInput*>(layers_[0]);
  std::vector<size_t> data_dim = mexGetDimensions(mx_data);
  size_t mapsize1, mapsize2;
  if (kMapsOrder == kMatlabOrder) {
    mapsize1 = data_dim[0];
    mapsize2 = data_dim[1];
  } else {
    mapsize1 = data_dim[1];
    mapsize2 = data_dim[0];
  }  
  mexAssert(mapsize1 == firstlayer->mapsize_[0] && 
            mapsize2 == firstlayer->mapsize_[1],
    "Data and the first layer must have equal sizes");  
  size_t outputmaps = 1;
  if (data_dim.size() > 2) {
    outputmaps = data_dim[2];
  }
  mexAssert(outputmaps == firstlayer->outputmaps_,
    "Data's 3rd dimension must be equal to the outputmaps on the input layer");
  size_t samples_num = 1;  
  if (data_dim.size() > 3) {
    samples_num = data_dim[3];
  }  
  ftype *data_ptr = mexGetPointer(mx_data);  
  // transposed array
  data_.attach(data_ptr, samples_num, mapsize1 * mapsize2 * outputmaps, 1, true);  
  if (firstlayer->norm_ > 0) {    
    MatCPU norm_data(data_.size1(), data_.size2());
    norm_data.reorder(true, false);
    norm_data = data_;
    norm_data.Normalize(firstlayer->norm_);        
    Swap(data_, norm_data);
  }
}
Esempio n. 2
0
void cMeshUtil::BuildDiskMesh(int slices, std::unique_ptr<cDrawMesh>& out_mesh)
{
	const float r = 1;
	const int num_verts = 2 + slices;
	const int pos_size = 3;
	const int norm_size = 3;
	const int coord_size = 2;

	std::vector<float> pos_data(num_verts * pos_size);
	std::vector<float> norm_data(num_verts * norm_size);
	std::vector<float> coord_data(num_verts * coord_size);
	std::vector<int> idx_data(num_verts);

	pos_data[0] = 0;
	pos_data[1] = 0;
	pos_data[2] = 0;
	norm_data[0] = 0;
	norm_data[1] = 0;
	norm_data[2] = 1;
	coord_data[0] = 0;
	coord_data[1] = 0;

	for (int i = 0; i <= slices; ++i)
	{
		float theta = (i * 2 * M_PI) / slices;
		int pos_offset = (i + 1) * pos_size;
		int norm_offset = (i + 1) * norm_size;
		int coord_offset = (i + 1) * coord_size;

		pos_data[pos_offset + 0] = std::cos(theta);
		pos_data[pos_offset + 1] = std::sin(theta);
		pos_data[pos_offset + 2] = 0;
		norm_data[norm_offset + 0] = 0;
		norm_data[norm_offset + 1] = 0;
		norm_data[norm_offset + 2] = 1;
		coord_data[coord_offset + 0] = 0;
		coord_data[coord_offset + 1] = 0;
	}

	for (int i = 0; i < static_cast<int>(idx_data.size()); ++i)
	{
		idx_data[i] = i;
	}

	out_mesh = std::unique_ptr<cDrawMesh>(new cDrawMesh());
	BuildDrawMesh(pos_data.data(), static_cast<int>(pos_data.size()),
					norm_data.data(), static_cast<int>(norm_data.size()),
					coord_data.data(), static_cast<int>(coord_data.size()),
					idx_data.data(), static_cast<int>(idx_data.size()), out_mesh.get());
}
Esempio n. 3
0
void cMeshUtil::BuildCylinder(int slices, std::unique_ptr<cDrawMesh>& out_mesh)
{
	const float r = 1.f;
	const float h = 1.f;
	const int num_verts = 12 * slices;
	const int pos_size = 3;
	const int norm_size = 3;
	const int coord_size = 2;

	std::vector<float> pos_data(num_verts * pos_size);
	std::vector<float> norm_data(num_verts * norm_size);
	std::vector<float> coord_data(num_verts * coord_size);
	std::vector<int> idx_data(num_verts);
	
	for (int i = 0; i < slices; ++i)
	{
		double theta0 = (i * 2 * M_PI) / slices;
		double theta1 = ((i + 1) * 2 * M_PI) / slices;

		double x0 = r * std::cos(theta0);
		double z0 = r * std::sin(-theta0);
		double u0 = static_cast<float>(i) / slices;

		double x1 = r * std::cos(theta1);
		double z1 = r * std::sin(-theta1);
		double u1 = static_cast<float>(i + 1) / slices;

		tVector n0 = tVector(x0, 0, z0, 0).normalized();
		tVector n1 = tVector(x1, 0, z1, 0).normalized();

		int pos_offset = i * 12 * pos_size;
		int norm_offset = i * 12 * norm_size;
		int coord_offset = i * 12 * coord_size;

		pos_data[pos_offset] = x0;
		pos_data[pos_offset + 1] = -0.5 * h;
		pos_data[pos_offset + 2] = z0;
		pos_data[pos_offset + 3] = x1;
		pos_data[pos_offset + 4] = -0.5 * h;
		pos_data[pos_offset + 5] = z1;
		pos_data[pos_offset + 6] = x1;
		pos_data[pos_offset + 7] = 0.5 * h;
		pos_data[pos_offset + 8] = z1;
		pos_data[pos_offset + 9] = x1;
		pos_data[pos_offset + 10] = 0.5 * h;
		pos_data[pos_offset + 11] = z1;
		pos_data[pos_offset + 12] = x0;
		pos_data[pos_offset + 13] = 0.5 * h;
		pos_data[pos_offset + 14] = z0;
		pos_data[pos_offset + 15] = x0;
		pos_data[pos_offset + 16] = -0.5 * h;
		pos_data[pos_offset + 17] = z0;

		norm_data[norm_offset] = n0[0];
		norm_data[norm_offset + 1] = n0[1];
		norm_data[norm_offset + 2] = n0[2];
		norm_data[norm_offset + 3] = n1[0];
		norm_data[norm_offset + 4] = n1[1];
		norm_data[norm_offset + 5] = n1[2];
		norm_data[norm_offset + 6] = n1[0];
		norm_data[norm_offset + 7] = n1[1];
		norm_data[norm_offset + 8] = n1[2];
		norm_data[norm_offset + 9] = n1[0];
		norm_data[norm_offset + 10] = n1[1];
		norm_data[norm_offset + 11] = n1[2];
		norm_data[norm_offset + 12] = n1[0];
		norm_data[norm_offset + 13] = n1[1];
		norm_data[norm_offset + 14] = n1[2];
		norm_data[norm_offset + 15] = n0[0];
		norm_data[norm_offset + 16] = n0[1];
		norm_data[norm_offset + 17] = n0[2];

		coord_data[coord_offset] = u0;
		coord_data[coord_offset + 1] = 0.f;
		coord_data[coord_offset + 2] = u1;
		coord_data[coord_offset + 3] = 0.f;
		coord_data[coord_offset + 4] = u1;
		coord_data[coord_offset + 5] = 1;
		coord_data[coord_offset + 6] = u1;
		coord_data[coord_offset + 7] = 1.f;
		coord_data[coord_offset + 8] = u0;
		coord_data[coord_offset + 9] = 1.f;
		coord_data[coord_offset + 10] = u0;
		coord_data[coord_offset + 11] = 0.f;

		pos_data[pos_offset + 18] = x0;
		pos_data[pos_offset + 19] = 0.5 * h;
		pos_data[pos_offset + 20] = z0;
		pos_data[pos_offset + 21] = x1;
		pos_data[pos_offset + 22] = 0.5 * h;
		pos_data[pos_offset + 23] = z1;
		pos_data[pos_offset + 24] = 0.f;
		pos_data[pos_offset + 25] = 0.5 * h;
		pos_data[pos_offset + 26] = 0.f;
		pos_data[pos_offset + 27] = 0.f;
		pos_data[pos_offset + 28] = -0.5 * h;
		pos_data[pos_offset + 29] = 0.f;
		pos_data[pos_offset + 30] = x1;
		pos_data[pos_offset + 31] = -0.5 * h;
		pos_data[pos_offset + 32] = z1;
		pos_data[pos_offset + 33] = x0;
		pos_data[pos_offset + 34] = -0.5 * h;
		pos_data[pos_offset + 35] = z0;

		norm_data[norm_offset + 18] = 0.f;
		norm_data[norm_offset + 19] = 1.f;
		norm_data[norm_offset + 20] = 0.f;
		norm_data[norm_offset + 21] = 0.f;
		norm_data[norm_offset + 22] = 1.f;
		norm_data[norm_offset + 23] = 0.f;
		norm_data[norm_offset + 24] = 0.f;
		norm_data[norm_offset + 25] = 1.f;
		norm_data[norm_offset + 26] = 0.f;
		norm_data[norm_offset + 27] = 0.f;
		norm_data[norm_offset + 28] = -1.f;
		norm_data[norm_offset + 29] = 0.f;
		norm_data[norm_offset + 30] = 0.f;
		norm_data[norm_offset + 31] = -1.f;
		norm_data[norm_offset + 32] = 0.f;
		norm_data[norm_offset + 33] = 0.f;
		norm_data[norm_offset + 34] = -1.f;
		norm_data[norm_offset + 35] = 0.f;

		coord_data[coord_offset + 12] = u0;
		coord_data[coord_offset + 13] = 1.f;
		coord_data[coord_offset + 14] = u1;
		coord_data[coord_offset + 15] = 1.f;
		coord_data[coord_offset + 16] = u1;
		coord_data[coord_offset + 17] = 1.f;
		coord_data[coord_offset + 18] = u0;
		coord_data[coord_offset + 19] = 0.f;
		coord_data[coord_offset + 20] = u1;
		coord_data[coord_offset + 21] = 0.f;
		coord_data[coord_offset + 22] = u0;
		coord_data[coord_offset + 23] = 0.f;
	}

	for (int i = 0; i < static_cast<int>(idx_data.size()); ++i)
	{
		idx_data[i] = i;
	}

	out_mesh = std::unique_ptr<cDrawMesh>(new cDrawMesh());
	BuildDrawMesh(pos_data.data(), static_cast<int>(pos_data.size()),
				norm_data.data(), static_cast<int>(norm_data.size()),
				coord_data.data(), static_cast<int>(coord_data.size()),
				idx_data.data(), static_cast<int>(idx_data.size()), out_mesh.get());
}