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); } }
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()); }
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()); }