float nearest_geoms(int g_ig,vec3 pt) { float res=1000; for(int i=0;i<neuron[g_ig].size();i++) { Geometry* g_er = &neuron[g_ig][i]; if(!g_er->tr.size())continue; float ll = pt.lengthSQR(g_er->vert[GetNearest(g_er->vert,pt)]); if(res>ll)res=ll; } return sqrt(res); }
const Waypoint* Waypoints::LookupLocation(const GeoPoint &loc, const fixed range) const { const Waypoint* wp = GetNearest(loc, range); if (!wp) return NULL; if (wp->location == loc) return wp; else if (positive(range) && (wp->IsCloseTo(loc, range))) return wp; return NULL; }
// всё то, что внутри сферы. центр сферы определяет связную компоненту, еднственно которую оставляем void GetInSphere(Geometry*target,vec3 c,float rad,Geometry*res) { iv3vec face; v3vec vert; Geometry tmpg; GetInSphere0(target, c, rad,&tmpg); tmpg.BuildRep2(); if(!tmpg.vert.size())return; int v_id = GetNearest(tmpg.vert,c); ChooseComponent(tmpg.vert,tmpg.face,vert,face,v_id); for(int i=0;i<face.size();i++) { res->AddTriangle(vert[face[i].x],vert[face[i].y],vert[face[i].z]); } }
int xDistanceFontGenerator::gen(wchar_t _char , FILE* file , int Offset , xDFFCharDesc& desc) { FT_Face pFT_Face = (FT_Face)m_FT_Face; FT_Int32 load_flags = FT_LOAD_RENDER|FT_LOAD_FORCE_AUTOHINT ; bool bAntilias = true; if(bAntilias) load_flags |= ( FT_LOAD_TARGET_NORMAL| FT_LOAD_TARGET_LIGHT); else load_flags |= ( FT_LOAD_MONOCHROME | FT_LOAD_TARGET_MONO ); //得到字模 FT_UInt glyph_index; /* retrieve glyph index from character code */ glyph_index = FT_Get_Char_Index( pFT_Face, _char ); /* load glyph image into the slot (erase previous one) */ int error = FT_Load_Glyph( pFT_Face, glyph_index, FT_LOAD_DEFAULT ); error = FT_Render_Glyph( pFT_Face->glyph, FT_RENDER_MODE_NORMAL ); memset(&desc , 0 , sizeof(desc) ) ; FT_Glyph glyph; if(FT_Get_Glyph( pFT_Face->glyph, &glyph )) { XEVOL_LOG(eXL_DEBUG_HIGH,"FT_Load_Glyph failed\n"); return false; } FT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph)glyph; //取道位图数据 FT_Bitmap& bitmap = bitmap_glyph->bitmap; //把位图数据拷贝自己定义的数据区里.这样旧可以画到需要的东西上面了。 int width = bitmap.width; int height = bitmap.rows; if(width == 0 || height == 0 ) { FT_Done_Glyph(glyph); return 0; } pFT_Face->size->metrics.y_ppem; pFT_Face->glyph->metrics.horiAdvance; desc.m_adv_x = pFT_Face->glyph->advance.x / 64.0f; desc.m_adv_y = pFT_Face->size->metrics.y_ppem; //m_FT_Face->glyph->metrics.horiBearingY / 64.0f; desc.m_left = (float)bitmap_glyph->left; desc.m_top = (float)bitmap_glyph->top; desc.m_w = width; desc.m_h = height; if(bitmap.pixel_mode == FT_PIXEL_MODE_GRAY) { for(int y=0; y < height ; y++) { for(int x=0; x < width; x++) { int _y = y; unsigned char _vl = 0; if(x < bitmap.width && y < bitmap.rows) { _vl = (x>=bitmap.width || y>=bitmap.rows) ? 0 : bitmap.buffer[x + bitmap.width*y]; } if(_vl >= 0x40) _vl = 255; else _vl = 0; m_ttfBuffer[(1*x + _y * width)+0] = _vl; } } } else if(bitmap.pixel_mode == FT_PIXEL_MODE_MONO) //单色图 { for(int y=0; y < height ; y++) { for(int x=0; x < width; x++) { int _y = y; unsigned char _vl = 0; if(x < bitmap.width && y < bitmap.rows) { _vl = ((bitmap.buffer[(y * bitmap.pitch) + x / 8] << (x % 8)) & 0x80) ? 0xFFFFFFFF : 0x00000000; } if(_vl > 0x7f) _vl = 255; else _vl = 0; m_ttfBuffer[(1*x + _y * width)+0] = _vl; } } } FT_Done_Glyph(glyph); wchar_t name[]=L" .bmp"; name[0] = _char; ds_wstring fullName = _XEVOL_ABSPATH_(name); //saveBitMap(fullName.c_str() , width , height , m_ttfBuffer); //从Freetype里取出来了。 //现在开始降采样和计算. float advx = desc.m_adv_x * (m_fontSize/(float)m_ttfSize); float advy = desc.m_adv_y * (m_fontSize/(float)m_ttfSize); desc.m_adv_x *= (m_fontSize/(float)m_ttfSize); desc.m_adv_y *= (m_fontSize/(float)m_ttfSize); desc.m_left *= (m_fontSize/(float)m_ttfSize); desc.m_top *= (m_fontSize/(float)m_ttfSize); desc.m_w *= (m_fontSize/(float)m_ttfSize); desc.m_h *= (m_fontSize/(float)m_ttfSize); if(desc.m_adv_x > 0 && advx == 0) desc.m_adv_x = 1; else desc.m_adv_x = advx; if(desc.m_adv_y > 0 && advy == 0) desc.m_adv_y = 1; else desc.m_adv_y = advy; if(desc.m_w == 0) desc.m_w = 1; if(desc.m_h == 0) desc.m_h = 1; int ow = desc.m_w * UPSAMPLES; int oh = desc.m_h * UPSAMPLES; float* tBuffer = new float[ow * oh]; float dw = ((float)width) /ow; float dh = ((float)height)/oh; for(int y = 0 ; y < oh ; y ++) { for(int x = 0 ; x < ow ; x ++) { int bx = (float)(x * dw + dw/2.0f); int by = (float)(y * dh + dh/2.0f); unsigned char* cl = getPixel(bx , by , width , height , m_ttfBuffer); float d = 0; if( *cl > 200) { d = GetNearest(bx , by , 0x00 , width , height , m_ttfBuffer); } else { d = -1.0f * GetNearest(bx , by , 0x00 , width , height , m_ttfBuffer); } tBuffer[y * ow + x] = d ; } } float _min = 0.0f; float _max = 0.0f; for(int y = 0 ; y < oh ; y ++) { for(int x = 0 ; x < ow ; x ++) { if(tBuffer[y * ow + x] > _max) _max = tBuffer[y * ow + x]; if(tBuffer[y * ow + x] < _min) _min = tBuffer[y * ow + x]; } } //归一化 for(int y = 0 ; y < oh ; y ++) { for(int x = 0 ; x < ow ; x ++) { float v = 0.0f; if( tBuffer[y * ow + x] > 0 ) { v = tBuffer[y * ow + x] / _max; tBuffer[y * ow + x] = v ; } else { v = -tBuffer[y * ow + x] / _min; tBuffer[y * ow + x] = v ; } } } //开始输出 int nByte = sizeof(float16) * desc.m_w * desc.m_h; float16* outBuffer = new float16[desc.m_w * desc.m_h]; downSample(tBuffer , outBuffer , desc.m_w , desc.m_h); fwrite(outBuffer , 1 , nByte , file); delete [] tBuffer; delete [] outBuffer; return nByte; }
int main() { lng i, j, k, cpt=0,NmbVer, NmbTri, NmbItm, MshIdx, ver, dim, ref, idx, (*TriTab)[3], buf[ BufSiz ], inc=50; long long OctIdx; double crd1[3] = {0,0,0}, crd2[3] = {0.002928, 0.079575, 0.006978}, crd3[3] = {-.0054, .1488, -.0067}; double dis, (*VerTab)[3], MinCrd[3], MaxCrd[3], IncCrd[3], AvgDis=0; time_t t, t2, MinTim = INT_MAX, MaxTim = 0; /*---------------------------------------*/ /* Open, allocate and read the mesh file */ /*---------------------------------------*/ t = clock(); puts("\nRead mesh"); if(!(MshIdx = GmfOpenMesh("test.meshb", GmfRead, &ver, &dim))) { puts("Cannot open test.meshb."); return(1); } NmbVer = GmfStatKwd(MshIdx, GmfVertices); NmbTri = GmfStatKwd(MshIdx, GmfTriangles); printf("vertices = %d, triangles = %d, dimension = %d, version = %d\n", NmbVer, NmbTri, dim, ver); if( !NmbVer || (dim != 3) ) { puts("Incompatible mesh."); return(1); } VerTab = malloc((NmbVer+1) * 3 * sizeof(double)); GmfGotoKwd(MshIdx, GmfVertices); GmfGetBlock(MshIdx, GmfVertices, GmfDouble, &VerTab[1][0], &VerTab[2][0], GmfDouble, &VerTab[1][1], &VerTab[2][1], \ GmfDouble, &VerTab[1][2], &VerTab[2][2], GmfLong, &ref, &ref); if(NmbTri) { TriTab = malloc((NmbTri+1) * 3 * sizeof(lng)); GmfGotoKwd(MshIdx, GmfTriangles); GmfGetBlock(MshIdx, GmfTriangles, GmfLong, &TriTab[1][0], &TriTab[2][0], GmfLong, &TriTab[1][1], &TriTab[2][1], \ GmfLong, &TriTab[1][2], &TriTab[2][2], GmfLong, &ref, &ref); } GmfCloseMesh(MshIdx); printf(" %g s\n", (double)(clock() - t) / CLOCKS_PER_SEC); /*---------------------------------------------------------*/ /* Build an octree from this mesh and perform some queries */ /*---------------------------------------------------------*/ puts("\nBuild the octree : "); t = clock(); OctIdx = NewOctree(NmbVer, VerTab[1], VerTab[2], NmbTri, TriTab[1], TriTab[2]); printf(" %g s\n", (double)(clock() - t) / CLOCKS_PER_SEC); for(i=0;i<3;i++) { MinCrd[i] = crd2[i] - .0001; MaxCrd[i] = crd2[i] + .0001; } puts("\nSearch for vertices in a bounding box :"); NmbItm = GetBoundingBox(OctIdx, TypVer, BufSiz, buf, MinCrd, MaxCrd); for(i=0;i<NmbItm;i++) printf(" vertex : %d\n", buf[i]); puts("\nSearch for the closest vertex from a given point :"); idx = GetNearest(OctIdx, TypVer, crd1, &dis, 0.); printf(" closest vertex = %d, distance = %g\n", idx, dis); if(NmbTri) { puts("\nSearch for triangles in a bounding box :"); NmbItm = GetBoundingBox(OctIdx, TypTri, BufSiz, buf, MinCrd, MaxCrd); for(i=0;i<NmbItm;i++) printf(" triangle : %d\n", buf[i]); puts("\nSearch for the closest triangle from a given point :"); idx = GetNearest(OctIdx, TypTri, crd1, &dis, 0.); printf(" closest triangle = %d, distance = %g\n", idx, dis); for(i=1;i<=NmbVer;i++) for(j=0;j<3;j++) if(VerTab[i][j] < MinCrd[j]) MinCrd[j] = VerTab[i][j]; else if(VerTab[i][j] > MaxCrd[j]) MaxCrd[j] = VerTab[i][j]; for(i=0;i<3;i++) IncCrd[i] = (MaxCrd[i] - MinCrd[i]) / inc; crd1[0] = MinCrd[0]; t = clock(); for(i=0;i<inc;i++) { crd1[1] = MinCrd[1]; for(j=0;j<inc;j++) { crd1[2] = MinCrd[2]; for(k=0;k<inc;k++) { t2 = clock(); idx = GetNearest(OctIdx, TypTri, crd1, &dis, .005); t2 = clock() - t2; MinTim = MIN(MinTim, t2); MaxTim = MAX(MaxTim, t2); AvgDis += dis; crd1[2] += IncCrd[2]; } crd1[1] += IncCrd[1]; } crd1[0] += IncCrd[0]; } printf("nb samples = %d, mean dist = %g, total time = %g s, min time = %g s, max time = %g s\n", \ inc*inc*inc, AvgDis / (inc*inc*inc), (double)(clock() - t) / CLOCKS_PER_SEC, \ (double)MinTim / CLOCKS_PER_SEC, (double)MaxTim / CLOCKS_PER_SEC); } /*------------------*/ /* Cleanup memories */ /*------------------*/ printf("\nFree octree %lld\n", OctIdx); printf(" memory used = %zd bytes\n", FreeOctree(OctIdx)); free(VerTab); if(NmbTri) free(TriTab); return(0); }
void CBuilding::Tick() { // handle death-tiles and leaving gamelayer if(GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/2.f, m_Pos.y-m_ProximityRadius/2.f)&CCollision::COLFLAG_DEATH || GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/2.f, m_Pos.y+m_ProximityRadius/2.f)&CCollision::COLFLAG_DEATH || GameServer()->Collision()->GetCollisionAt(m_Pos.x-m_ProximityRadius/2.f, m_Pos.y-m_ProximityRadius/2.f)&CCollision::COLFLAG_DEATH || GameServer()->Collision()->GetCollisionAt(m_Pos.x-m_ProximityRadius/2.f, m_Pos.y+m_ProximityRadius/2.f)&CCollision::COLFLAG_DEATH || GameLayerClipped(m_Pos)) { Die(-1, WEAPON_WORLD); return; } if(!IsGrounded()) { Die(-1, WEAPON_WORLD); return; } if(Server()->Tick() % 5 == 0 && m_Decon) { if( ((CGameControllerNODES*)GameServer()->m_pController)->Spawns[m_Team] <= 0) { m_Decon = false; } else { TakeDamage(vec2(0,0), 1, -1, WEAPON_SELF); } } if(m_Decay > 0) m_Decay--; if(m_AnimDecay > 0) m_AnimDecay--; if(m_SpawnanimDecay > 0) m_SpawnanimDecay--; m_Power = Powered(); if(!m_Power && (m_Type == B_REPEATER || m_Type == B_TELEPORT)) m_Anim = 0; if(!m_Power) m_Hit = 0; if(!m_Power && m_Type == B_TELEPORT) m_Anim = 0; if(!m_Alive || (!m_Power && m_Type != B_SHIELD)) return; if(Server()->Tick() % 100 == 0 && m_Health < m_Maxhealth/4) { GameServer()->CreateExplosion(pos, -1, -1, true); } switch(m_Type) { case B_REACTOR: { if(m_AnimDecay == 0) { m_Anim++; if(m_Anim > 3) { m_Anim = 0; m_AnimDecay = 100; } else m_AnimDecay = 10; } } break; case B_REPEATER: { if(!m_Power) { m_Anim = 0; } else { if(m_AnimDecay == 0) { m_Anim++; if(m_Anim > 1) { m_Anim = 0; m_AnimDecay = 100; } else m_AnimDecay = 10; } } } break; case B_SPAWN: { m_Anim = m_Anim & 0xF; if(m_AnimDecay == 0) { m_Anim++; if(m_Anim > 6) m_Anim = 0; m_AnimDecay = 35; } if(m_Spawnanim > 0 && m_SpawnanimDecay == 0) { m_Spawnanim--; m_SpawnanimDecay = 4; } m_Anim = (m_Spawnanim << 4) | m_Anim; } break; case B_AMMO1: case B_AMMO2: case B_AMMO3: { CCharacter *c = GetNearest(ms_PhysSize, m_Team); if(c) { if(m_Anim < 3 && m_AnimDecay == 0) { m_Anim++; m_AnimDecay = 4; } if(m_Decay == 0 && m_Anim == 3) { m_Decay = 50; int weapon = -1; if(m_Type == B_AMMO1) weapon = WEAPON_SHOTGUN; else if(m_Type == B_AMMO2) weapon = WEAPON_GRENADE; else if(m_Type == B_AMMO3) weapon = WEAPON_RIFLE; if(!c->m_Weapons[weapon].m_Got) { c->m_Weapons[weapon].m_Got = 1; c->m_ActiveWeapon = weapon; GameServer()->CreateSound(m_Pos, SOUND_PICKUP_SHOTGUN); } else { GameServer()->CreateSound(m_Pos, SOUND_PICKUP_GRENADE); } c->m_Weapons[weapon].m_Ammo = 10; } } else { if(m_Anim > 0 && m_AnimDecay == 0) { m_Anim--; m_AnimDecay = 4; } } } break; case B_TURRET1: { vec2 realpos = vec2(m_Pos.x, m_Pos.y-74); vec2 tmppos = m_Pos; m_Pos = realpos; CCharacter *c = GetNearest(700, m_Team^1); m_Pos = tmppos; if(c) { m_Angle = GetAngle(normalize(c->m_Pos - realpos)); if(m_Decay == 0) { m_Decay = 12; float a = m_Angle; a+=frandom()*0.20f -0.10f; CProjectile *pProj = new CProjectile(WEAPON_GUN, -1, realpos, vec2(cosf(a), sinf(a)), (int)(Server()->TickSpeed()*GameServer()->Tuning()->m_GunLifetime), 1, 0, 0, -1, WEAPON_GUN, false); GameServer()->CreateSound(realpos, SOUND_GUN_FIRE); } } } break; case B_TURRET2: { vec2 realpos = vec2(m_Pos.x, m_Pos.y-66); vec2 tmppos = m_Pos; m_Pos = realpos; CCharacter *c = GetNearest(500, m_Team^1); m_Pos = tmppos; if(c) { m_Angle = GetAngle(normalize(c->m_Pos-realpos)); if(m_Decay == 0) { m_Decay = 30; int shotspread = 2; for(int i = -shotspread; i <= shotspread; i++) { float spreading[] = {-0.185f, -0.070f, 0, 0.070f, 0.185f}; float a = m_Angle; a += spreading[i+2]; float v = 1-(abs(i)/(float)shotspread); float speed = mix((float)tuning.shotgun_speeddiff, 1.0f, v); CProjectile *pProj = new CProjectile(WEAPON_SHOTGUN, -2, realpos, vec2(cosf(a), sinf(a))*speed, (int)(Server()->TickSpeed()*GameServer()->Tuning()->m_ShotgunLifetime), 1, 0, 0, -1, WEAPON_SHOTGUN, false); } game.create_sound(realpos, SOUND_SHOTGUN_FIRE); } } } break; case B_HEALTH: case B_ARMOR: { CCharacter *c = GetNearest(ms_PhysSize, m_Team); if(c) { if(m_Decay == 0) { //wait for open first if(m_AnimDecay == 0 && m_Decay == 0 && m_Anim < 4) { m_AnimDecay = 3; m_Anim++; } else if(m_AnimDecay == 0) { if(m_Type == B_HEALTH && c->m_Health < 10) { m_Decay = 150; c->IncreaseHealth(3); GameServer()->CreateSound(m_Pos, SOUND_PICKUP_HEALTH); c->m_Ill = false; } else if(m_Type == B_HEALTH) { c->m_Ill = false; } else if(m_Type == B_ARMOR && c->m_Armor < 10) { m_Decay = 150; c->IncreaseArmor(3); GameServer()->CreateSound(m_Pos, SOUND_PICKUP_ARMOR); } } } } else { if(m_AnimDecay == 0 && m_Decay == 0 && m_Anim > 0) { m_AnimDecay = 3; m_Anim--; } } } break; case B_SHIELD: { if(Server()->Tick() % 50 == 0 && m_Power) { if(m_Armor < 30) m_Armor++; //game.create_damageind(pos, 3.141592, armor > 0 ? (int)(10.0f*armor/30) : 0); } if(Server()->Tick() % 5 == 0) { if(m_Hit > 0) m_Hit--; if(m_Power && m_Armor > 0) { CProjectile *pProj[128]; int num = GameServer()->m_World.FindEntities(m_Pos, 250.0f, (CEntity**)pProj, 128, CGameWorld::ENTTYPE_PROJECTILE); for(int i = 0; i < num && m_Armor > 0; i++) { if(pProj[i]->m_Bounce) continue; if((pProj[i]->m_Owner >= 0) && GameServer()->m_apPlayers[pProj[i]->m_Owner] && GameServer()->m_apPlayers[pProj[i]->m_Owner]->m_Team == m_Team) continue; if(pProj[i]->m_Owner < 0) continue; pProj[i]->m_Initpos = pProj[i]->m_Pos; pProj[i]->m_StartTick = Server()->Tick(); pProj[i]->m_Direction = normalize(pProj[i]->m_Pos-m_Pos); pProj[i]->m_Bounce = 1; m_Hit = 3; //game.create_shieldhit(m_Pos, 0); m_Armor = clamp(m_Armor-(pProj[i]->m_Weapon == WEAPON_GRENADE ? 4 : 2), 0, 30); if(m_Armor == 0) { m_Armor = -4; } } } } m_Anim = (m_Armor > 0 ? (int)(9.0f*m_Armor/30.0f) : 0) | (m_Hit << 4); } break; //NODESTODO: COUNTINUE! case B_TELEPORT: { if(m_Decay == 0) { //find other teleport... D= CBuilding *other = 0; for(int i = 0; i < ((CGameControllerNODES*)GameServer()->m_pController)->BuildingsCount[m_Team]; i++) { CBuilding *b = ((CGameControllerNODES*)GameServer()->m_pController)->Buildings[m_Team][i]; if( b != this && b->m_Type == B_TELEPORT && b->m_Alive && b->m_Power) { other = b; } } if(other) { bool is_enemy = false; CCharacter *c = GetNearest(ms_PhysSize-4.0f, m_Team); if(!c && m_Anim == 8) {//once opened, port enemies as well c = GetNearest(ms_PhysSize-4.0f, m_Team^1); is_enemy = true; } if(c) { if(m_Anim < 8 && m_AnimDecay == 0 && !is_enemy) { m_Anim++; m_AnimDecay = 2; other->m_Anim = m_Anim; other->m_AnimDecay = m_AnimDecay+1; other->m_Decay =m_AnimDecay+1; } else if(anim == 8 && m_AnimDecay == 0) { if(!c->m_pPlayer->m_Ported) { //dbg_msg("nodes", "yay"); float ill_prob = min((distance(other->m_Pos, m_Pos))/8000.0f * 0.2f, 0.2f); for(int i = 0; i < MAX_CLIENTS; i++) { if(game.players[i] && game.players[i]->get_character() && (game.players[i]->get_character()->core.hooked_player == c->player->client_id || c->core.hooked_player == game.players[i]->client_id)) { CCharacter *hc = game.players[i]->get_character(); hc->m_Pos = vec2(other->m_Pos.x, other->m_Pos.y-1); hc->core.m_Pos = vec2(other->m_Pos.x, other->m_Pos.y-1); hc->player->ported = true; hc->core.hook_state = -1; hc->core.hooked_player = -1; if(frandom() <= ill_prob) { if(!hc->ill) { hc->ill = true; hc->infecter = -1; } } } } //dbg_msg("nodes", "porting %d from (%d,%d) to (%d,%d)", c->player->client_id, (int)pos.x, (int)pos.y, (int)other->pos.x, (int)other->pos.y); c->pos = vec2(other->pos.x, other->pos.y-1); c->core.pos = vec2(other->pos.x, other->pos.y-1); c->player->ported = true; c->core.hook_state = -1; c->core.hooked_player = -1; if(frandom() <= ill_prob) { if(!c->ill) { c->ill = true; c->infecter = -1; } } decay = 50; other->decay = 50; anim = 1; other->anim = 1; game.create_playerspawn(other->pos); game.create_sound(pos, SOUND_TELEPORT); game.create_death(pos, c->player->client_id); game.create_sound(other->pos, SOUND_TELEPORT); } else { anim = 0; } } } else { if(anim > 0 && anim_decay == 0) { anim++; if(anim == 9) anim = 0; anim_decay = 2; other->anim = anim; other->anim_decay = anim_decay+1; other->decay =anim_decay+1; } } } } else { if(anim_decay == 0 && anim > 0) { anim_decay = 2; anim++; if(anim == 9) anim = 0; } } } break; } return; }