DialogObjectEdit::DialogObjectEdit(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::DialogObjectEdit)
{
	ui->setupUi(this);
	fillObjectGraphicsList();
	if (dataExchanger->editModeNPC == 1) {
		std::cout << "DialogObjectEdit::DialogObjectEdit - editing existing Obj, id: " << dataExchanger->selectedNPC << std::endl;
		loadObjectData(dataExchanger->selectedNPC);
	} else {
		std::cout << "DialogObjectEdit::DialogObjectEdit - adding new Obj, id: " << dataExchanger->selectedNPC << std::endl;
	}
	QObject::connect(ui->npcPreviewAreaWidget, SIGNAL(clickedIn()), this, SLOT(setObjectFrame()));
}
Example #2
0
static EERIE_3DSCENE * ScnToEerie(const char * adr, size_t size, const res::path & fic) {
	
	(void)size; // TODO use size
	
	LogDebug("Loading Scene " << fic);
	
	size_t pos = 0;
	
	EERIE_3DSCENE * seerie = allocStructZero<EERIE_3DSCENE>();
	Clear3DScene(seerie);
	
	const TSCN_HEADER * psth = reinterpret_cast<const TSCN_HEADER *>(adr + pos);
	pos += sizeof(TSCN_HEADER);
	
	LogDebug("SCNtoEERIE " << fic << " Version " << psth->version << " Nb Textures " << psth->nb_maps);
	
	if(psth->version < 3008 || psth->version > 3024) {
		LogError << "ScnToEerie: invalid version in " << fic << ": found " << psth->version
		         << " expected 3008 to 3024";
		free(seerie);
		return NULL;
	}
	
	seerie->nbtex = psth->nb_maps;
	
	const res::path temp = "graph/obj3d/textures";
	
	if(psth->type_write == 0) {
		
		seerie->texturecontainer = allocStructZero<TextureContainer *>(psth->nb_maps); 
		
		for(long i = 0; i < psth->nb_maps; i++) {
			
			const THEO_TEXTURE * tt = reinterpret_cast<const THEO_TEXTURE *>(adr + pos);
			pos += sizeof(THEO_TEXTURE);
			
			res::path mapsname = temp / res::path::load(util::loadString(tt->texture_name)).remove_ext();
			seerie->texturecontainer[i] = TextureContainer::Load(mapsname, TextureContainer::Level);
		}
		
	} else {
		
		if((psth->type_write & SAVE_MAP_BMP) || (psth->type_write & SAVE_MAP_TGA)) {
			
			seerie->texturecontainer = allocStructZero<TextureContainer *>(psth->nb_maps);
			
			for(long i = 0; i < psth->nb_maps; i++) {
				
				res::path name;
				if(psth->version >= 3019) {
					const THEO_SAVE_MAPS_IN_3019 * tsmi3019 = reinterpret_cast<const THEO_SAVE_MAPS_IN_3019 *>(adr + pos);
					pos += sizeof(THEO_SAVE_MAPS_IN_3019);
					name = res::path::load(util::loadString(tsmi3019->texture_name)).remove_ext();
				} else {
					const THEO_SAVE_MAPS_IN * tsmi = reinterpret_cast<const THEO_SAVE_MAPS_IN *>(adr + pos);
					pos += sizeof(THEO_SAVE_MAPS_IN);
					name = res::path::load(util::loadString(tsmi->texture_name)).remove_ext();
				}
				
				if(!name.empty()) {
					seerie->texturecontainer[i] = TextureContainer::Load(temp / name, TextureContainer::Level);
				}
			}
		}
	}
	
	// read objects
	pos = psth->object_seek;
	
	s32 nbo = *reinterpret_cast<const s32 *>(adr + pos);
	pos += sizeof(s32);
	
	seerie->nbobj = nbo;
	seerie->objs = allocStructZero<EERIE_3DOBJ *>(nbo);
	
	seerie->point0 = Vec3f(-999999999999.f);
	
	long id = 0;
	
	for(long i = 0; i < nbo; i++) {
		
		const TSCN_OBJHEADER * ptoh = reinterpret_cast<const TSCN_OBJHEADER *>(adr + pos);
		pos += sizeof(TSCN_OBJHEADER);
		
		seerie->objs[id] = new EERIE_3DOBJ(); 
		// TODO most is done in the constructor already
		seerie->objs[id]->clear();
		
		seerie->objs[id]->texturecontainer.resize(seerie->nbtex);
		std::copy(seerie->texturecontainer, seerie->texturecontainer + seerie->nbtex, seerie->objs[id]->texturecontainer.begin());
		
		long objVersion;
		if(psth->version < 3013) {
			objVersion = 3004;
		} else if(psth->version < 3015) {
			objVersion = 3005;
		} else if(psth->version < 3019) {
			objVersion = 3006;
		} else if(psth->version < 3023) {
			objVersion = 3008;
		} else {
			objVersion = 3011;
		}
		loadObjectData(seerie->objs[id], adr, &pos, objVersion);
		
		seerie->cub.xmin = std::min(seerie->cub.xmin, seerie->objs[id]->cub.xmin + seerie->objs[id]->pos.x);
		seerie->cub.xmax = std::max(seerie->cub.xmax, seerie->objs[id]->cub.xmax + seerie->objs[id]->pos.x);
		seerie->cub.ymin = std::min(seerie->cub.ymin, seerie->objs[id]->cub.ymin + seerie->objs[id]->pos.y);
		seerie->cub.ymax = std::max(seerie->cub.ymax, seerie->objs[id]->cub.ymax + seerie->objs[id]->pos.y);
		seerie->cub.zmin = std::min(seerie->cub.zmin, seerie->objs[id]->cub.zmin + seerie->objs[id]->pos.z);
		seerie->cub.zmax = std::max(seerie->cub.zmax, seerie->objs[id]->cub.zmax + seerie->objs[id]->pos.z);
		
		std::string name = boost::to_lower_copy(util::loadString(ptoh->object_name));
		if(name == "map_origin") {
			seerie->point0 = seerie->objs[id]->point0 + seerie->objs[id]->pos;
			delete seerie->objs[id];
			seerie->nbobj--;
			id--;
		} else {
			seerie->objs[id]->name = name;
		}
		
		id++;
		
		pos = ptoh->next_obj;
	}
	
	pos = psth->light_seek; // ambient
	
	pos += sizeof(SavedColor); // ignore ambient color
	
	s32 nbl = *reinterpret_cast<const s32 *>(adr + pos);
	pos += sizeof(s32);
	
	seerie->light = NULL; 
	seerie->nblight = nbl;
	
	for(long i = 0; i < nbl; i++) {
		
		TSCN_LIGHT_3024 sl3024;
		const TSCN_LIGHT_3024 * tsl3024;
		
		if(psth->version >= 3024) {
			tsl3024 = reinterpret_cast<const TSCN_LIGHT_3024 *>(adr + pos);
			pos += sizeof(TSCN_LIGHT_3024);
		} else if(psth->version >= 3019) {
			const TSCN_LIGHT_3019 * tsl3019 = reinterpret_cast<const TSCN_LIGHT_3019 *>(adr + pos);
			pos += sizeof(TSCN_LIGHT_3019);
			memset(&sl3024, 0, sizeof(TSCN_LIGHT_3024));
			sl3024.red = tsl3019->red;
			sl3024.green = tsl3019->green;
			sl3024.blue = tsl3019->blue;
			sl3024.pos = tsl3019->pos;
			sl3024.hotspot = tsl3019->hotspot;
			sl3024.falloff = tsl3019->falloff;
			sl3024.intensity = tsl3019->intensity;
			tsl3024 = &sl3024;
		} else {
			const TSCN_LIGHT * tsl = reinterpret_cast<const TSCN_LIGHT *>(adr + pos);
			pos += sizeof(TSCN_LIGHT);
			memset(&sl3024, 0, sizeof(TSCN_LIGHT_3024));
			sl3024.red = tsl->red;
			sl3024.green = tsl->green;
			sl3024.blue = tsl->blue;
			sl3024.pos = tsl->pos;
			sl3024.hotspot = tsl->hotspot;
			sl3024.falloff = tsl->falloff;
			sl3024.intensity = tsl->intensity;
			tsl3024 = &sl3024;
		}
		
		EERIE_LIGHT light;
		
		light.rgb.r = (float)tsl3024->red * ( 1.0f / 255 );
		light.rgb.g = (float)tsl3024->green * ( 1.0f / 255 );
		light.rgb.b = (float)tsl3024->blue * ( 1.0f / 255 );
		light.pos = tsl3024->pos.toVec3();
		light.fallstart = (float)tsl3024->hotspot;
		light.fallend = (float)tsl3024->falloff;
		
		float t = light.fallend - light.fallstart;
		if(t < 150.f) {
			light.fallend += 150.f - t;
		}
		
		light.intensity = (float)tsl3024->intensity;
		light.exist = 1;
		light.treat = 1;
		light.m_isIgnitionLight = false;
		EERIE_LIGHT_GlobalAdd(&light);
	}
	
	return seerie;
}
Example #3
0
// Converts a Theo Object to an EERIE object
static EERIE_3DOBJ * TheoToEerie(const char * adr, long size, const res::path & texpath, const res::path & fic) {
	
	LogWarning << "TheoToEerie " << fic;
	
	if(!adr)
		return NULL;
	
	res::path txpath = texpath.empty() ? "graph/obj3d/textures" : texpath;
	
	if(size < 10) {
		return NULL;
	}
	
	size_t pos = 0;
	
	const THEO_HEADER * pth = reinterpret_cast<const THEO_HEADER *>(adr + pos);
	pos += sizeof(THEO_HEADER);
	
	if(pth->version < 3003 || pth->version > 3011) {
		LogError << "TheoToEerie: invalid version in " << fic << ": found " << pth->version
		         << " expected 3004 to 3011";
		return NULL;
	}
	
	EERIE_3DOBJ * eerie = new EERIE_3DOBJ;
	eerie->clear();
	
	eerie->file = fic;
	
	if(pth->type_write == 0) {
		// read the texture
		
		LogError <<  "WARNING object " << fic << " SAVE MAP IN OBJECT = INVALID... Using Dummy Textures...";
		
		eerie->texturecontainer.resize(pth->nb_maps);
		for(long i = 0; i < pth->nb_maps; i++) {
			pos += sizeof(THEO_TEXTURE);
			eerie->texturecontainer[i] = GetAnyTexture();
		}
		
	} else {
		
		if((pth->type_write & SAVE_MAP_BMP) || (pth->type_write & SAVE_MAP_TGA)) {
			
			eerie->texturecontainer.resize(pth->nb_maps);
			for(long i = 0; i < pth->nb_maps; i++) {
				
				res::path name;
				if(pth->version >= 3008) {
					const THEO_SAVE_MAPS_IN_3019 * tsmi3019 = reinterpret_cast<const THEO_SAVE_MAPS_IN_3019 *>(adr + pos);
					pos += sizeof(THEO_SAVE_MAPS_IN_3019);
					name = res::path::load(util::loadString(tsmi3019->texture_name)).remove_ext();
				} else {
					const THEO_SAVE_MAPS_IN * tsmi = reinterpret_cast<const THEO_SAVE_MAPS_IN *>(adr + pos);
					pos += sizeof(THEO_SAVE_MAPS_IN);
					name = res::path::load(util::loadString(tsmi->texture_name)).remove_ext();
				}
				
				if(!name.empty()) {
					eerie->texturecontainer[i] = TextureContainer::Load(txpath / name, TextureContainer::Level);
				}
			}
		}
	}
	
	pos = pth->object_seek;
	loadObjectData(eerie, adr, &pos, pth->version);
	eerie->angle = Anglef::ZERO;
	eerie->pos = Vec3f_ZERO;

	// NORMALS CALCULATIONS

	//Compute Faces Areas
	for(size_t i = 0; i < eerie->facelist.size(); i++) {
		const Vec3f & p0 = eerie->vertexlist[eerie->facelist[i].vid[0]].v;
		const Vec3f & p1 = eerie->vertexlist[eerie->facelist[i].vid[1]].v;
		const Vec3f & p2 = eerie->vertexlist[eerie->facelist[i].vid[2]].v;
		eerie->facelist[i].temp = glm::distance((p0 + p1) * .5f, p2) * glm::distance(p0, p1) * .5f;
	}

	for(size_t i = 0; i < eerie->facelist.size(); i++) {
		CalcObjFaceNormal(
		    &eerie->vertexlist[eerie->facelist[i].vid[0]].v,
		    &eerie->vertexlist[eerie->facelist[i].vid[1]].v,
		    &eerie->vertexlist[eerie->facelist[i].vid[2]].v,
		    &eerie->facelist[i]
		);
		float area = eerie->facelist[i].temp;

		for(long j = 0; j < 3; j++) {
			float mod = area * area;
			Vec3f nrml = eerie->facelist[i].norm * mod;
			float count = mod;

			for(size_t i2 = 0; i2 < eerie->facelist.size(); i2++) {
				if(i != i2) {
					float area2 = eerie->facelist[i].temp;

					for(long j2 = 0; j2 < 3; j2++) {
						if(closerThan(eerie->vertexlist[eerie->facelist[i2].vid[j2]].v, eerie->vertexlist[eerie->facelist[i].vid[j]].v, .1f)) {
							mod = (area2 * area2);
							nrml += eerie->facelist[i2].norm * mod;
							count += mod; 
						}
					}
				}
			}

			count = 1.f / count;
			eerie->vertexlist[eerie->facelist[i].vid[j]].vert.p = nrml * count;
		}
	}

	for(size_t i = 0; i < eerie->facelist.size(); i++) {
		for(long j = 0; j < 3; j++) {
			eerie->vertexlist[eerie->facelist[i].vid[j]].norm = eerie->vertexlist[eerie->facelist[i].vid[j]].vert.p;
		}
	}

	// Apply Normals Spherical correction for NPC head
	long neck_orgn = GetGroupOriginByName(eerie, "neck");
	long head_idx = EERIE_OBJECT_GetGroup(eerie, "head");

	if(head_idx >= 0 && neck_orgn >= 0) {
		VertexGroup & headGroup = eerie->grouplist[head_idx];
		
		Vec3f center = Vec3f_ZERO;
		Vec3f origin = eerie->vertexlist[neck_orgn].v;
		float count = (float)headGroup.indexes.size();

		if(count > 0.f) {
			for(size_t idx = 0 ; idx < headGroup.indexes.size(); idx++) {
				center += eerie->vertexlist[ headGroup.indexes[idx] ].v;
			}
			
			center = (center * (1.f / count) + origin + origin) * (1.0f / 3);
			float max_threshold = glm::distance(origin, center);
			
			for(size_t i = 0; i < headGroup.indexes.size(); i++) {
				EERIE_VERTEX * ev = &eerie->vertexlist[headGroup.indexes[i]];
				float d = glm::distance(ev->v, origin);
				float factor = 1.f;

				if(d < max_threshold) {
					factor = d / max_threshold;
				}

				float ifactor = 1.f - factor;
				Vec3f fakenorm;
				fakenorm = ev->v - center;
				fakenorm = glm::normalize(fakenorm);
				ev->norm = ev->norm * ifactor + fakenorm * factor;
				ev->norm = glm::normalize(ev->norm);
			}
		}
	}

	// NORMALS CALCULATIONS END
	//***********************************************************
	
	eerie->m_skeleton = NULL;
	EERIE_CreateCedricData(eerie);
	return eerie;
}
static int HostStatsFetchData(void)
{
  DWORD o;
  PPERF_OBJECT_TYPE objPtr = NULL;
  DWORD res;
  DWORD oldBufferSize = BufferSize;
  const char * qstr;
  qstr = LEVEL1_QUERY_STRING;

  while ((res = RegQueryValueEx(HKEY_PERFORMANCE_DATA, qstr,
				NULL, NULL,
				(LPBYTE)PerfData,
				&BufferSize)) == ERROR_MORE_DATA) {
    oldBufferSize += 4096;
    BufferSize = oldBufferSize;
    PerfData = (PPERF_DATA_BLOCK)realloc(PerfData, BufferSize);
    }
  if (res != ERROR_SUCCESS) {
    fprintf(stderr,
        "Can't get Windows performance data. RegQueryValueEx returned %ld, errorno \"%d\"\n",
        GetLastError(),
	res);
    return -1;
    }
#ifdef NTDBG
  fprintf(stderr, "buffersize is %ld\n", BufferSize);
  fflush(stderr);
#endif

  ProcessObj = NULL;
  ProcessorObj = NULL;
  MemoryObj = NULL;
  SystemObj = NULL;
  ObjectsObj = NULL;

  objPtr = FirstObject(PerfData);
  for (o=0; o < PerfData->NumObjectTypes; o++) {
#ifdef NTDBG
    fprintf(stderr, "Object %ld\n", objPtr->ObjectNameTitleIndex);
    fflush(stderr);
#endif
    switch (objPtr->ObjectNameTitleIndex) {
      case PROCESS_OBJ_ID: ProcessObj = objPtr; break;
      case PROCESSOR_OBJ_ID: ProcessorObj = objPtr; break;
      case MEMORY_OBJ_ID: MemoryObj = objPtr; break;
      case SYSTEM_OBJ_ID: SystemObj = objPtr; break;
      case OBJECTS_OBJ_ID: ObjectsObj = objPtr; break;
      case NETWORK_OBJ_ID: NetworkObj = objPtr; break;
      case UDP_OBJ_ID: UdpObj = objPtr; break;
      }
    objPtr = NextObject(objPtr);
    }
  if ( ProcessObj == NULL ||
       ProcessorObj == NULL ||
       MemoryObj == NULL ||
       SystemObj == NULL ||
       ObjectsObj == NULL ||
       NetworkObj == NULL ||
       UdpObj == NULL )
  {
    return -1;
  }
  loadProcessData();
  loadProcessorData();
  loadSystemData();
  loadMemoryData();
  loadObjectData();
  loadUdpData();
  loadCpuData();
  loadNetworkData();
  return 0;
}
void DebugObjectLoadingState::update()
{
    if (!_toLoad.empty()) loadObjectData();
}