Esempio n. 1
0
/* encode contiguous floating-point block */
uint
_t2(zfp_encode_block, Scalar, DIMS)(zfp_stream* zfp, const Scalar* fblock)
{
  /* compute maximum exponent */
  int emax = _t1(exponent_block, Scalar)(fblock, BLOCK_SIZE);
  int maxprec = precision(emax, zfp->maxprec, zfp->minexp, DIMS);
  uint e = maxprec ? emax + EBIAS : 0;
  /* encode block only if biased exponent is nonzero */
  if (e) {
    cache_align_(Int iblock[BLOCK_SIZE]);
    /* encode common exponent; LSB indicates that exponent is nonzero */
    int ebits = EBITS + 1;
    stream_write_bits(zfp->stream, 2 * e + 1, ebits);
    /* perform forward block-floating-point transform */
    _t1(fwd_cast, Scalar)(iblock, fblock, BLOCK_SIZE, emax);
    /* encode integer block */
    return ebits + _t2(encode_block, Int, DIMS)(zfp->stream, zfp->minbits - ebits, zfp->maxbits - ebits, maxprec, iblock);
  }
  else {
    /* write single zero-bit to indicate that all values are zero */
    stream_write_bit(zfp->stream, 0);
    if (zfp->minbits > 1) {
      stream_pad(zfp->stream, zfp->minbits - 1);
      return zfp->minbits;
    }
    else
      return 1;
  }
}
Esempio n. 2
0
/* forward block-floating-point transform to signed integers */
static void
_t1(fwd_cast, Scalar)(Int* iblock, const Scalar* fblock, uint n, int emax)
{
  /* compute power-of-two scale factor s */
  Scalar s = _t1(quantize, Scalar)(1, emax);
  /* compute p-bit int y = s*x where x is floating and |y| <= 2^(p-2) - 1 */
  do
    *iblock++ = (Int)(s * *fblock++);
  while (--n);
}
Esempio n. 3
0
/* compute maximum floating-point exponent in block of n values */
static int
_t1(exponent_block, Scalar)(const Scalar* p, uint n)
{
  Scalar max = 0;
  do {
    Scalar f = FABS(*p++);
    if (max < f)
      max = f;
  } while (--n);
  return _t1(exponent, Scalar)(max);
}
Esempio n. 4
0
void Settings::refresh()
{        
    // Read ini file    
    this->iniPath = AppFunc::getAppSavePath() + QLatin1String("/vpn.ini");

    QSettings sett (this->iniPath, QSettings::IniFormat);

    // Die Settings einlesen    
    this->noBallonMessage = (sett.value(QLatin1String("connect/noballon"), QLatin1String("0")).toString() == QLatin1String("1") ? true : false);
    this->popUpDialogValue = (sett.value(QLatin1String("connect/popup"), QLatin1String("1")).toString() == QLatin1String("1") ? true : false);
    this->showSplashScreenValue = (sett.value(QLatin1String("connect/splash"), QLatin1String("1")).toString() == QLatin1String("1") ? true : false);
    this->autoReconnect = (sett.value(QLatin1String("connect/autoreconnect"), QLatin1String("0")).toString() == QLatin1String("1") ? true : false);
    this->useNoInteract = (sett.value(QLatin1String("connect/nointeract"), QLatin1String("0")).toString() == QLatin1String("1") ? true : false);

    // Start config
    this->startCommandConfig = (sett.value(QLatin1String("start/auto"), QLatin1String("0")).toString() == QLatin1String("1") ? true : false);
    this->commandConfigPath = sett.value(QLatin1String("start/path"), QLatin1String("")).toString();

    this->delayConfigVal = sett.value(QLatin1String("start/delay"), QLatin1String("0")).toString();

    this->cryptKey = sett.value(QLatin1String("self/key"), QLatin1String("")).toString();
    if (!this->cryptKey.isEmpty()) {        
        Crypt crypt;
        this->cryptKey = QString(crypt.cryptToPlainTextExt(this->cryptKey.toAscii()));        
    } else {
        // Neuen Key erzeugen
        qsrand(QDateTime::currentDateTime().toTime_t());
        QString _t1 (QString::number((qrand() % 1500) + 1));
        QString _t2 (QString::number((qrand() % 2500) + 1));
        QString key (QLatin1String("S3m!BHF") + _t1 + QLatin1String("83$%§kd") + _t2 + QString::number(QDateTime::currentDateTime().toTime_t()) + _t1);

        Crypt crypt;
        key = QString(crypt.cryptPlainTextExt(key.toAscii()));

        sett.setValue(QLatin1String("self/key"), key);
        this->cryptKey = key;
    }
}
Esempio n. 5
0
	ECBody& ECScene::loadHeightMap(
	      std::string FilePath,
	      const chrono::ChVector<>& Scale) {
		Ogre::TexturePtr l_tex = Ogre::TextureManager::getSingleton().load(FilePath, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);

		if (l_tex->getFormat() != Ogre::PF_L16 && l_tex->getFormat() != Ogre::PF_L8) {
			l_tex->unload();
			l_tex = Ogre::TextureManager::getSingleton().load(FilePath, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::TEX_TYPE_2D, -1, 1.0f, false, Ogre::PF_L8);
		}

		Ogre::HardwarePixelBufferSharedPtr l_pixels = l_tex->getBuffer();
		size_t l_byte_size = l_pixels->getSizeInBytes();
		Ogre::PixelFormat l_format = l_tex->getFormat();

		assert(l_format == Ogre::PF_L16 || l_format == Ogre::PF_L8); // Garuntee grayscale

		size_t l_vertex_count = l_pixels->getHeight() * l_pixels->getWidth();
		std::vector<Ogre::Real> l_vertex_heights;
		Ogre::PixelBox l_temp_pixel_buffer(l_tex->getWidth(), l_tex->getHeight(), l_tex->getDepth(), l_format);
		void* l_pPixels = nullptr;
		bool catfish = l_tex->isLoaded();

		
		l_pPixels = new unsigned char[l_byte_size];


		//l_pixels->lock(l_temp_pixel_buffer, Ogre::HardwareBuffer::HBL_NORMAL);

		//Ogre::PixelBox const &pixel_box = l_pixels->getCurrentLock();
		//l_pixels->blitToMemory(pixel_box);
		//l_pixels->unlock();
		//l_pPixels = pixel_box.data;

		

		memcpy(l_pPixels, l_pixels->lock(Ogre::HardwareBuffer::HBL_NORMAL), l_byte_size);

		double l_height_w = l_format == Ogre::PF_L16 ? (double)USHRT_MAX : (double)UCHAR_MAX;

		for (unsigned int i = 0; i < l_vertex_count; i++) { // Fill vector with normalized heights
			if (l_format == Ogre::PF_L8) {
				l_vertex_heights.push_back( (Ogre::Real) ( ( (double)( (unsigned char*)l_pPixels )[i] ) / l_height_w ) );
			}
			else {
				l_vertex_heights.push_back( (Ogre::Real) ( ( (double)( (unsigned short*)l_pPixels )[i] ) / l_height_w ) );
			}
		}

		delete[] l_pPixels;

		std::vector<Ogre::Vector3> l_vertices;
		l_vertices.resize(l_vertex_count);

		typedef struct {
			unsigned int a;
			unsigned int b;
			unsigned int c;
		} triangle_index_set;

		std::vector<triangle_index_set> l_indices;
		unsigned int l_square_width = l_pixels->getWidth() - 1;
		unsigned int l_square_height = l_pixels->getHeight() - 1;
		unsigned int l_square_count = l_square_width * l_square_height;
		l_indices.resize(l_square_count * 2);

		std::vector<Ogre::Vector3> l_triangle_normals;
		l_triangle_normals.resize(l_square_count * 2);

		std::vector<Ogre::Vector3> l_vertex_normals;
		l_vertex_normals.resize(l_vertex_count);

		for (unsigned int i = 0; i < l_vertex_count; i++) { // Fill vertices

			unsigned int l_w = (i % l_pixels->getWidth());
			unsigned int l_h = (i / l_pixels->getWidth());

			Ogre::Real l_wa = (Ogre::Real)l_w - (Ogre::Real)(l_pixels->getWidth()) / 2.0;
			Ogre::Real l_ha = (Ogre::Real)l_h - (Ogre::Real)(l_pixels->getHeight()) / 2.0;

			l_vertices[i] = Ogre::Vector3(l_wa, std::abs(l_vertex_heights[i]), l_ha);
		}

		for (unsigned int i = 0; i < l_square_count * 2; i += 2) { // Fill indices
			unsigned int l_triangle_width = l_square_width * 2;
			unsigned int l_iteration_y_position = i / l_triangle_width;
			unsigned int l_triangle_to_pixel = (i + (2 * l_iteration_y_position)) / 2;

			l_indices[i + 0].a = l_triangle_to_pixel;
			l_indices[i + 0].b = l_triangle_to_pixel + l_pixels->getWidth();
			l_indices[i + 0].c = l_triangle_to_pixel + 1;
			l_indices[i + 1].a = l_triangle_to_pixel + 1;
			l_indices[i + 1].b = l_triangle_to_pixel + l_pixels->getWidth();
			l_indices[i + 1].c = l_triangle_to_pixel + l_pixels->getWidth() + 1;
		}

		for (unsigned int i = 0; i < l_triangle_normals.size(); i++) { // Calculate normals of all triangles
			Ogre::Vector3 _t1(l_vertices[l_indices[i].a]);
			Ogre::Vector3 _t2(l_vertices[l_indices[i].b]);
			Ogre::Vector3 _t3(l_vertices[l_indices[i].c]);
			Ogre::Vector3 _ret = (_t1 - _t2).crossProduct(_t1 - _t3);
			_ret.normalise();
			l_triangle_normals[i] = _ret;
		}

		//!!!!
		//	This algorithm takes ungodly long single-threaded in larger heightmaps.
		//!!!!
		{ // Calculate normals of all vertices
			typedef struct __thread_set_t {
				size_t _start;
				size_t _end;
				std::thread _thread;
			} __thread_set;

			size_t _thread_count = std::thread::hardware_concurrency();

			std::function<void(size_t, size_t)> _worker_thread = [&](size_t start, size_t end) {
				Ogre::Vector3 _ret(0, 0, 0);
				for (unsigned int i = start; i < end; i++) {
					for (unsigned int j = 0; j < l_indices.size(); j++) {
						if (l_indices[j].a == i || l_indices[j].b == i || l_indices[j].c == i) {
							_ret = _ret + l_triangle_normals[j];
						}
					}
					_ret.normalise();
					l_vertex_normals[i] = _ret;
				}
			};

			std::vector<__thread_set*> threads;

			for (unsigned int i = 0; i < _thread_count; i++) {
				__thread_set* pthread = new __thread_set;

				if (i == 0) {
					pthread->_start = 0;
					pthread->_end = l_vertex_count / _thread_count;
				}
				else {
					pthread->_start = threads[i - 1]->_end + 1;
					pthread->_end = (l_vertex_count / _thread_count) * (i + 1);
				}

				if (i == _thread_count) {
					pthread->_end = l_vertex_count;
				}

				pthread->_thread = std::thread(_worker_thread, pthread->_start, pthread->_end);
				threads.push_back(pthread);
			}

			for (unsigned int i = 0; i < threads.size(); i++) {
				threads[i]->_thread.join();
				delete threads[i];
				threads[i] = nullptr;
			}

		}

		/*for (unsigned int i = 0; i < l_vertex_normals.size(); i++) {
			Ogre::Vector3 _ret(0, 0, 0);
			for (unsigned int j = 0; j < l_indices.size(); j++) {
				if (l_indices[j].a == i || l_indices[j].b == i || l_indices[j].c == i) {
					_ret = _ret + l_triangle_normals[j];
				}
			}
			_ret.normalise();
			l_vertex_normals[i] = _ret;
		}*/

		Ogre::ManualObject* terrain_object = m_pSceneManager->createManualObject("");

		terrain_object->begin("lambert1", Ogre::RenderOperation::OT_TRIANGLE_LIST);

		for (unsigned int i = 0; i < l_vertex_count; i++) {
			Ogre::Real _x = (Ogre::Real)(i % l_tex->getWidth());
			Ogre::Real _y = (Ogre::Real)(i / l_tex->getWidth());

			terrain_object->position(l_vertices[i]);
			terrain_object->normal(l_vertex_normals[i]);
			terrain_object->colour(Ogre::ColourValue(0.5, 0.5, 0.5));
			terrain_object->textureCoord(_x/(Ogre::Real)l_tex->getWidth(), _y/(Ogre::Real)l_tex->getHeight());
		}

		for (unsigned int i = 0; i < l_indices.size(); i++) {
			terrain_object->index(l_indices[i].a);
			terrain_object->index(l_indices[i].b);
			terrain_object->index(l_indices[i].c);
		}

		terrain_object->end();

		//terrain_object->getSection(0)->getMaterial()->getTechnique(0)->getPass(0)->createTextureUnitState("white.png");
		//terrain_object->getSection(0)->getMaterial()->getTechnique(0)->getPass(0)->setLightingEnabled(true);

		ECBody& _ret = createBody();

		_ret.setMesh(terrain_object, Scale);

		chrono::geometry::ChTriangleMeshConnected l_triangle_mesh;

		for (unsigned int i = 0; i < l_indices.size(); i++) {
			l_triangle_mesh.addTriangle(
				chrono::ChVector<>(									// Vertex 0
				(double)l_vertices[l_indices[i].a].x,					// Index a.x
				(double)l_vertices[l_indices[i].a].y,					// Index a.y
				(double)l_vertices[l_indices[i].a].z					// Index a.z
				) * Scale,
				chrono::ChVector<>(									// Vertex 1
				(double)l_vertices[l_indices[i].b].x,					// Index b.x
				(double)l_vertices[l_indices[i].b].y,					// Index b.y
				(double)l_vertices[l_indices[i].b].z					// Index b.z
				) * Scale,
				chrono::ChVector<>(									// Vertex 2
				(double)l_vertices[l_indices[i].c].x,					// Index c.x
				(double)l_vertices[l_indices[i].c].y,					// Index c.y
				(double)l_vertices[l_indices[i].c].z					// Index c.z
				) * Scale
				);
		}

		_ret->GetCollisionModel()->ClearModel();
		_ret->GetCollisionModel()->AddTriangleMesh(l_triangle_mesh, true, false, chrono::ChVector<>(), chrono::QUNIT);
		_ret->GetCollisionModel()->BuildModel();
		_ret->SetCollide(true);
		_ret->SetBodyFixed(true);

		return _ret;
	}