//static void FaceGenManager::BlitFaceIm(SDLSurfacePtr &faceim, Sint8 &genderOut, const Uint32 flags, const Uint32 seed) { Random rand(seed); const int species = (m_species.size()==1) ? 0 : rand.Int32(0,m_species.size()-1); const int race = rand.Int32(0,NumRaces(species)-1); int gender; switch (flags & GENDER_MASK) { case GENDER_MALE: gender = 0; break; case GENDER_FEMALE: gender = 1; break; case GENDER_RAND: default: gender = rand.Int32(0,NumGenders(species)-1); break; } genderOut = gender; const int head = rand.Int32(0,NumHeads(species,race)-1); const int eyes = rand.Int32(0,NumEyes(species,race)-1); const int nose = rand.Int32(0,NumNoses(species,race)-1); const int mouth = rand.Int32(0,NumMouths(species,race)-1); const int hair = rand.Int32(0,NumHairstyles(species,race)-1); const int clothes = rand.Int32(0,NumClothes(species)-1); const int armour = rand.Int32(0,NumArmour(species)-1); const int accessories = rand.Int32(0,NumAccessories(species)-1); const int background = rand.Int32(0,NumBackground(species)-1); FaceGenManager::TQueryResult res; FaceGenManager::GetImagesForCharacter(res, species, race, gender, head, eyes, nose, mouth, hair, clothes, armour, accessories, background); _blit_image(faceim, res.mBackground, 0, 0); _blit_image(faceim, res.mHead, 0, 0); if (!(flags & ARMOUR)) { _blit_image(faceim, res.mClothes, 0, 135); } _blit_image(faceim, res.mEyes, 0, 41); _blit_image(faceim, res.mNose, 1, 89); _blit_image(faceim, res.mMouth, 0, 155); if (!(flags & ARMOUR)) { if (rand.Int32(0,1)>0) _blit_image(faceim, res.mAccessories, 0, 0); _blit_image(faceim, res.mHairstyle, 0, 0); } else { _blit_image(faceim, res.mArmour, 0, 0); } }
void FaceParts::BuildFaceImage(SDL_Surface *faceIm, const FaceDescriptor &face, bool armoured) { const Uint32 selector = _make_selector(face.species, face.race, face.gender); _blit_image(faceIm, s_partdb->background_general.Get(), 0, 0); _blit_image(faceIm, _get_part(s_partdb->heads, selector, face.head), 0, 0); if (!armoured) { _blit_image(faceIm, _get_part(s_partdb->clothes, selector, face.clothes), 0, 135); } _blit_image(faceIm, _get_part(s_partdb->eyes, selector, face.eyes), 0, 41); _blit_image(faceIm, _get_part(s_partdb->noses, selector, face.nose), 1, 89); _blit_image(faceIm, _get_part(s_partdb->mouths, selector, face.mouth), 0, 155); if (!armoured) { _blit_image(faceIm, _get_part(s_partdb->accessories, selector, face.accessories), 0, 0); _blit_image(faceIm, _get_part(s_partdb->hairstyles, selector, face.hairstyle), 0, 0); } else { _blit_image(faceIm, _get_part(s_partdb->armour, selector, face.armour), 0, 0); } }
Face::Face(Context *context, Uint32 flags, Uint32 seed) : Single(context) { if (!seed) seed = time(0); MTRand rand(seed); m_flags = flags; m_seed = seed; int race = rand.Int32(0,2); int gender; switch (flags & GENDER_MASK) { case MALE: gender = 0; break; case FEMALE: gender = 1; break; case RAND: default: gender = rand.Int32(0,1); break; } int head = rand.Int32(0,MAX_HEAD); int eyes = rand.Int32(0,MAX_EYES); int nose = rand.Int32(0,MAX_NOSE); int mouth = rand.Int32(0,MAX_MOUTH); int hair = rand.Int32(0,MAX_HAIR); int clothes = rand.Int32(0,MAX_CLOTHES); int armour = rand.Int32(0,MAX_ARMOUR); int accessories = rand.Int32(0,MAX_ACCESSORIES); int background = rand.Int32(0,MAX_BACKGROUND); char filename[1024]; SDLSurfacePtr faceim = SDLSurfacePtr::WrapNew(SDL_CreateRGBSurface(SDL_SWSURFACE, FACE_WIDTH, FACE_HEIGHT, 24, 0xff, 0xff00, 0xff0000, 0)); snprintf(filename, sizeof(filename), "facegen/backgrounds/background_%d.png", background); _blit_image(faceim, filename, 0, 0); snprintf(filename, sizeof(filename), "facegen/race_%d/head/head_%d_%d.png", race, gender, head); _blit_image(faceim, filename, 0, 0); if (!(flags & ARMOUR)) { snprintf(filename, sizeof(filename), "facegen/clothes/cloth_%d_%d.png", gender, clothes); _blit_image(faceim, filename, 0, 135); } snprintf(filename, sizeof(filename), "facegen/race_%d/eyes/eyes_%d_%d.png", race, gender, eyes); _blit_image(faceim, filename, 0, 41); snprintf(filename, sizeof(filename), "facegen/race_%d/nose/nose_%d_%d.png", race, gender, nose); _blit_image(faceim, filename, 1, 89); snprintf(filename, sizeof(filename), "facegen/race_%d/mouth/mouth_%d_%d.png", race, gender, mouth); _blit_image(faceim, filename, 0, 155); if (!(flags & ARMOUR)) { snprintf(filename, sizeof(filename), "facegen/accessories/acc_%d.png", accessories); if (rand.Int32(0,1)>0) _blit_image(faceim, filename, 0, 0); snprintf(filename, sizeof(filename), "facegen/race_%d/hair/hair_%d_%d.png", race, gender, hair); _blit_image(faceim, filename, 0, 0); } else { snprintf(filename, sizeof(filename), "facegen/clothes/armour_%d.png", armour); _blit_image(faceim, filename, 0, 0); } m_texture.Reset(Graphics::TextureBuilder(faceim, Graphics::LINEAR_CLAMP, true, true).CreateTexture(GetContext()->GetRenderer())); if (!s_material) { Graphics::MaterialDescriptor matDesc; matDesc.textures = 1; s_material.Reset(GetContext()->GetRenderer()->CreateMaterial(matDesc)); } }
static void _blit_image(const SDLSurfacePtr &s, const char *filename, int xoff, int yoff) { _blit_image(s.Get(), filename, xoff, yoff); }
FaceVideoLink::FaceVideoLink(float w, float h, Uint32 flags, Uint32 seed, const std::string &name, const std::string &title) : VideoLink(w, h) { m_created = SDL_GetTicks(); m_message = new Gui::ToolTip(Lang::VID_LINK_ESTABLISHED); if (!seed) seed = time(NULL); MTRand rand(seed); m_flags = flags; m_seed = seed; int race = rand.Int32(0,2); int gender; switch (flags & GENDER_MASK) { case GENDER_MALE: gender = 0; break; case GENDER_FEMALE: gender = 1; break; case GENDER_RAND: default: gender = rand.Int32(0,1); break; } std::string charname = name; if (charname.empty()) charname = Pi::luaNameGen->FullName((gender != 0), rand); m_characterInfo = new CharacterInfoText(w * 0.8f, h * 0.15f, charname, title); int head = rand.Int32(0,MAX_HEAD); int eyes = rand.Int32(0,MAX_EYES); int nose = rand.Int32(0,MAX_NOSE); int mouth = rand.Int32(0,MAX_MOUTH); int hair = rand.Int32(0,MAX_HAIR); int clothes = rand.Int32(0,MAX_CLOTHES); int armour = rand.Int32(0,MAX_ARMOUR); int accessories = rand.Int32(0,MAX_ACCESSORIES); int background = rand.Int32(0,MAX_BACKGROUND); char filename[1024]; SDL_Surface *s = SDL_CreateRGBSurface(SDL_SWSURFACE, ceil_pow2(FACE_WIDTH), ceil_pow2(FACE_HEIGHT), 32, 0xff, 0xff00, 0xff0000, 0xff000000); snprintf(filename, sizeof(filename), PIONEER_DATA_DIR "/facegen/backgrounds/background_%d.png", background); //printf("%s\n", filename); _blit_image(s, filename, 0, 0); snprintf(filename, sizeof(filename), PIONEER_DATA_DIR "/facegen/race_%d/head/head_%d_%d.png", race, gender, head); //printf("%s\n", filename); _blit_image(s, filename, 0, 0); if (!(flags & ARMOUR)) { snprintf(filename, sizeof(filename), PIONEER_DATA_DIR "/facegen/clothes/cloth_%d_%d.png", gender, clothes); //printf("%s\n", filename); _blit_image(s, filename, 0, 135); } snprintf(filename, sizeof(filename), PIONEER_DATA_DIR "/facegen/race_%d/eyes/eyes_%d_%d.png", race, gender, eyes); //printf("%s\n", filename); _blit_image(s, filename, 0, 41); snprintf(filename, sizeof(filename), PIONEER_DATA_DIR "/facegen/race_%d/nose/nose_%d_%d.png", race, gender, nose); //printf("%s\n", filename); _blit_image(s, filename, 1, 89); snprintf(filename, sizeof(filename), PIONEER_DATA_DIR "/facegen/race_%d/mouth/mouth_%d_%d.png", race, gender, mouth); //printf("%s\n", filename); _blit_image(s, filename, 0, 155); if (!(flags & ARMOUR)) { snprintf(filename, sizeof(filename), PIONEER_DATA_DIR "/facegen/accessories/acc_%d.png", accessories); //printf("%s\n", filename); if (rand.Int32(0,1)>0) _blit_image(s, filename, 0, 0); snprintf(filename, sizeof(filename), PIONEER_DATA_DIR "/facegen/race_%d/hair/hair_%d_%d.png", race, gender, hair); //printf("%s\n", filename); _blit_image(s, filename, 0, 0); } else { snprintf(filename, sizeof(filename), PIONEER_DATA_DIR "/facegen/clothes/armour_%d.png", armour); _blit_image(s, filename, 0, 0); } glEnable(GL_TEXTURE_2D); glGenTextures(1, &m_tex); glBindTexture(GL_TEXTURE_2D, m_tex); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, s->w, s->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, s->pixels); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glDisable(GL_TEXTURE_2D); SDL_FreeSurface(s); }