本文整理汇总了C++中clamp函数的典型用法代码示例。如果您正苦于以下问题:C++ clamp函数的具体用法?C++ clamp怎么用?C++ clamp使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了clamp函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: main
void main (void) {
gl_FragColor = clamp(effectColorAdd + texture2D(diffuseTextureUnit, gl_PointCoord) * fragColor * effectColorMul, 0.0, 1.0);
}
开发者ID:andreasdr,项目名称:tdme,代码行数:3,代码来源:render_fragmentshader.c
示例2: viewfieldx
float viewfieldx(int x)
{
return x <= 100 ? clamp((VIEWMIN+(VIEWMAX-VIEWMIN))/100.f*float(x), float(VIEWMIN), float(VIEWMAX)) : float(VIEWMAX);
}
开发者ID:sjuxax2,项目名称:cube2,代码行数:4,代码来源:ai.cpp
示例3: saturate
template <typename T> GLM_FUNC_QUALIFIER T saturate(T x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility)
开发者ID:15kingben,项目名称:ChallengeProject2,代码行数:1,代码来源:compatibility.hpp
示例4: vec4
int CMenus::PopupFilter(CMenus *pMenus, CUIRect View)
{
CUIRect ServerFilter = View, FilterHeader;
const float FontSize = 12.0f;
// slected filter
CBrowserFilter *pFilter = &pMenus->m_lFilters[pMenus->m_SelectedFilter];
CServerFilterInfo FilterInfo;
pFilter->GetFilter(&FilterInfo);
// server filter
ServerFilter.HSplitTop(ms_ListheaderHeight, &FilterHeader, &ServerFilter);
pMenus->RenderTools()->DrawUIRect(&FilterHeader, vec4(1,1,1,0.25f), CUI::CORNER_T, 4.0f);
pMenus->RenderTools()->DrawUIRect(&ServerFilter, vec4(0,0,0,0.15f), CUI::CORNER_B, 4.0f);
pMenus->UI()->DoLabelScaled(&FilterHeader, Localize("Server filter"), FontSize+2.0f, CUI::ALIGN_CENTER);
CUIRect Button;
ServerFilter.VSplitLeft(5.0f, 0, &ServerFilter);
ServerFilter.Margin(3.0f, &ServerFilter);
ServerFilter.VMargin(5.0f, &ServerFilter);
int NewSortHash = FilterInfo.m_SortHash;
ServerFilter.HSplitTop(20.0f, &Button, &ServerFilter);
static int s_BrFilterEmpty = 0;
if(pMenus->DoButton_CheckBox(&s_BrFilterEmpty, Localize("Has people playing"), FilterInfo.m_SortHash&IServerBrowser::FILTER_EMPTY, &Button))
NewSortHash = FilterInfo.m_SortHash^IServerBrowser::FILTER_EMPTY;
ServerFilter.HSplitTop(20.0f, &Button, &ServerFilter);
static int s_BrFilterSpectators = 0;
if(pMenus->DoButton_CheckBox(&s_BrFilterSpectators, Localize("Count players only"), FilterInfo.m_SortHash&IServerBrowser::FILTER_SPECTATORS, &Button))
NewSortHash = FilterInfo.m_SortHash^IServerBrowser::FILTER_SPECTATORS;
ServerFilter.HSplitTop(20.0f, &Button, &ServerFilter);
static int s_BrFilterFull = 0;
if(pMenus->DoButton_CheckBox(&s_BrFilterFull, Localize("Server not full"), FilterInfo.m_SortHash&IServerBrowser::FILTER_FULL, &Button))
NewSortHash = FilterInfo.m_SortHash^IServerBrowser::FILTER_FULL;
ServerFilter.HSplitTop(20.0f, &Button, &ServerFilter);
static int s_BrFilterFriends = 0;
if(pMenus->DoButton_CheckBox(&s_BrFilterFriends, Localize("Show friends only"), FilterInfo.m_SortHash&IServerBrowser::FILTER_FRIENDS, &Button))
NewSortHash = FilterInfo.m_SortHash^IServerBrowser::FILTER_FRIENDS;
ServerFilter.HSplitTop(20.0f, &Button, &ServerFilter);
static int s_BrFilterPw = 0;
if(pMenus->DoButton_CheckBox(&s_BrFilterPw, Localize("No password"), FilterInfo.m_SortHash&IServerBrowser::FILTER_PW, &Button))
NewSortHash = FilterInfo.m_SortHash^IServerBrowser::FILTER_PW;
ServerFilter.HSplitTop(20.0f, &Button, &ServerFilter);
static int s_BrFilterCompatversion = 0;
if(pMenus->DoButton_CheckBox(&s_BrFilterCompatversion, Localize("Compatible version"), FilterInfo.m_SortHash&IServerBrowser::FILTER_COMPAT_VERSION, &Button))
NewSortHash = FilterInfo.m_SortHash^IServerBrowser::FILTER_COMPAT_VERSION;
ServerFilter.HSplitTop(20.0f, &Button, &ServerFilter);
static int s_BrFilterPure = 0;
if(pMenus->DoButton_CheckBox(&s_BrFilterPure, Localize("Standard gametype"), FilterInfo.m_SortHash&IServerBrowser::FILTER_PURE, &Button))
NewSortHash = FilterInfo.m_SortHash^IServerBrowser::FILTER_PURE;
ServerFilter.HSplitTop(20.0f, &Button, &ServerFilter);
static int s_BrFilterPureMap = 0;
if(pMenus->DoButton_CheckBox(&s_BrFilterPureMap, Localize("Standard map"), FilterInfo.m_SortHash&IServerBrowser::FILTER_PURE_MAP, &Button))
NewSortHash = FilterInfo.m_SortHash^IServerBrowser::FILTER_PURE_MAP;
ServerFilter.HSplitTop(20.0f, &Button, &ServerFilter);
static int s_BrFilterGametypeStrict = 0;
if(pMenus->DoButton_CheckBox(&s_BrFilterGametypeStrict, Localize("Strict gametype filter"), FilterInfo.m_SortHash&IServerBrowser::FILTER_GAMETYPE_STRICT, &Button))
NewSortHash = FilterInfo.m_SortHash^IServerBrowser::FILTER_GAMETYPE_STRICT;
if(FilterInfo.m_SortHash != NewSortHash)
{
FilterInfo.m_SortHash = NewSortHash;
pFilter->SetFilter(&FilterInfo);
}
ServerFilter.HSplitTop(5.0f, 0, &ServerFilter);
ServerFilter.HSplitTop(19.0f, &Button, &ServerFilter);
pMenus->UI()->DoLabelScaled(&Button, Localize("Game types:"), FontSize, CUI::ALIGN_LEFT);
Button.VSplitRight(60.0f, 0, &Button);
ServerFilter.HSplitTop(3.0f, 0, &ServerFilter);
static float Offset = 0.0f;
static int s_BrFilterGametype = 0;
if(pMenus->DoEditBox(&s_BrFilterGametype, &Button, FilterInfo.m_aGametype, sizeof(FilterInfo.m_aGametype), FontSize, &Offset))
pFilter->SetFilter(&FilterInfo);
{
ServerFilter.HSplitTop(19.0f, &Button, &ServerFilter);
CUIRect EditBox;
Button.VSplitRight(60.0f, &Button, &EditBox);
pMenus->UI()->DoLabelScaled(&Button, Localize("Maximum ping:"), FontSize, CUI::ALIGN_LEFT);
char aBuf[5];
str_format(aBuf, sizeof(aBuf), "%d", FilterInfo.m_Ping);
static float Offset = 0.0f;
static int s_BrFilterPing = 0;
pMenus->DoEditBox(&s_BrFilterPing, &EditBox, aBuf, sizeof(aBuf), FontSize, &Offset);
int NewPing = clamp(str_toint(aBuf), 0, 999);
if(NewPing != FilterInfo.m_Ping)
{
FilterInfo.m_Ping = NewPing;
//.........这里部分代码省略.........
开发者ID:Bumble,项目名称:teeworlds,代码行数:101,代码来源:menus_popups.cpp
示例5: clamp
void CBeam::InputColorBlueValue( inputdata_t &inputdata )
{
int nNewColor = clamp( inputdata.value.Int(), 0, 255 );
SetColor( m_clrRender->r, m_clrRender->g, nNewColor );
}
开发者ID:SizzlingStats,项目名称:hl2sdk-ob-valve,代码行数:5,代码来源:beam_shared.cpp
示例6: AllocateToolParticleEffectId
//-----------------------------------------------------------------------------
// This is called after sending this entity's recording state
//-----------------------------------------------------------------------------
void C_ParticleSmokeGrenade::CleanupToolRecordingState( KeyValues *msg )
{
if ( !ToolsEnabled() )
return;
BaseClass::CleanupToolRecordingState( msg );
m_SmokeTrail.CleanupToolRecordingState( msg );
// Generally, this is used to allow the entity to clean up
// allocated state it put into the message, but here we're going
// to use it to send particle system messages because we
// know the grenade has been recorded at this point
if ( !clienttools->IsInRecordingMode() )
return;
// NOTE: Particle system destruction message will be sent by the particle effect itself.
if ( m_bVolumeFilled && GetToolParticleEffectId() == TOOLPARTICLESYSTEMID_INVALID )
{
// Needed for retriggering of the smoke grenade
m_bVolumeFilled = false;
int nId = AllocateToolParticleEffectId();
KeyValues *msg = new KeyValues( "ParticleSystem_Create" );
msg->SetString( "name", "C_ParticleSmokeGrenade" );
msg->SetInt( "id", nId );
msg->SetFloat( "time", gpGlobals->curtime );
KeyValues *pEmitter = msg->FindKey( "DmeSpriteEmitter", true );
pEmitter->SetInt( "count", NUM_PARTICLES_PER_DIMENSION * NUM_PARTICLES_PER_DIMENSION * NUM_PARTICLES_PER_DIMENSION );
pEmitter->SetFloat( "duration", 0 );
pEmitter->SetString( "material", "particle/particle_smokegrenade1" );
pEmitter->SetInt( "active", true );
KeyValues *pInitializers = pEmitter->FindKey( "initializers", true );
KeyValues *pPosition = pInitializers->FindKey( "DmeVoxelPositionInitializer", true );
pPosition->SetFloat( "centerx", m_SmokeBasePos.x );
pPosition->SetFloat( "centery", m_SmokeBasePos.y );
pPosition->SetFloat( "centerz", m_SmokeBasePos.z );
pPosition->SetFloat( "particlesPerDimension", m_xCount );
pPosition->SetFloat( "particleSpacing", m_SpacingRadius );
KeyValues *pLifetime = pInitializers->FindKey( "DmeRandomLifetimeInitializer", true );
pLifetime->SetFloat( "minLifetime", m_FadeEndTime );
pLifetime->SetFloat( "maxLifetime", m_FadeEndTime );
KeyValues *pVelocity = pInitializers->FindKey( "DmeAttachmentVelocityInitializer", true );
pVelocity->SetPtr( "entindex", (void*)entindex() );
pVelocity->SetFloat( "minRandomSpeed", 10 );
pVelocity->SetFloat( "maxRandomSpeed", 20 );
KeyValues *pRoll = pInitializers->FindKey( "DmeRandomRollInitializer", true );
pRoll->SetFloat( "minRoll", -6.0f );
pRoll->SetFloat( "maxRoll", 6.0f );
KeyValues *pRollSpeed = pInitializers->FindKey( "DmeRandomRollSpeedInitializer", true );
pRollSpeed->SetFloat( "minRollSpeed", -ROTATION_SPEED );
pRollSpeed->SetFloat( "maxRollSpeed", ROTATION_SPEED );
KeyValues *pColor = pInitializers->FindKey( "DmeRandomInterpolatedColorInitializer", true );
Color c1(
clamp( m_MinColor.x * 255.0f, 0, 255 ),
clamp( m_MinColor.y * 255.0f, 0, 255 ),
clamp( m_MinColor.z * 255.0f, 0, 255 ), 255 );
Color c2(
clamp( m_MaxColor.x * 255.0f, 0, 255 ),
clamp( m_MaxColor.y * 255.0f, 0, 255 ),
clamp( m_MaxColor.z * 255.0f, 0, 255 ), 255 );
pColor->SetColor( "color1", c1 );
pColor->SetColor( "color2", c2 );
KeyValues *pAlpha = pInitializers->FindKey( "DmeRandomAlphaInitializer", true );
pAlpha->SetInt( "minStartAlpha", 255 );
pAlpha->SetInt( "maxStartAlpha", 255 );
pAlpha->SetInt( "minEndAlpha", 0 );
pAlpha->SetInt( "maxEndAlpha", 0 );
KeyValues *pSize = pInitializers->FindKey( "DmeRandomSizeInitializer", true );
pSize->SetFloat( "minStartSize", SMOKEPARTICLE_SIZE );
pSize->SetFloat( "maxStartSize", SMOKEPARTICLE_SIZE );
pSize->SetFloat( "minEndSize", SMOKEPARTICLE_SIZE );
pSize->SetFloat( "maxEndSize", SMOKEPARTICLE_SIZE );
pInitializers->FindKey( "DmeSolidKillInitializer", true );
KeyValues *pUpdaters = pEmitter->FindKey( "updaters", true );
pUpdaters->FindKey( "DmeRollUpdater", true );
pUpdaters->FindKey( "DmeColorUpdater", true );
KeyValues *pAlphaCosineUpdater = pUpdaters->FindKey( "DmeAlphaCosineUpdater", true );
pAlphaCosineUpdater->SetFloat( "duration", m_FadeEndTime - m_FadeStartTime );
pUpdaters->FindKey( "DmeColorDynamicLightUpdater", true );
KeyValues *pSmokeGrenadeUpdater = pUpdaters->FindKey( "DmeSmokeGrenadeUpdater", true );
//.........这里部分代码省略.........
开发者ID:paralin,项目名称:hl2sdk,代码行数:101,代码来源:c_particle_smokegrenade.cpp
示例7: assert
float AI_Car_Experimental::RampBetween(float val, float startat, float endat)
{
assert(endat > startat);
return (clamp(val,startat,endat)-startat)/(endat-startat);
}
开发者ID:haltakov,项目名称:synthetic-dataset,代码行数:5,代码来源:ai_car_experimental.cpp
示例8: clamp
inline void Colour::setGreen(double g)
{
_g = clamp(g, 0.0, 1.0);
}
开发者ID:asandroq,项目名称:virtuality,代码行数:4,代码来源:color.hpp
示例9: ParseDetailGroup
//-----------------------------------------------------------------------------
// Parses the key-value pairs in the detail.rad file
//-----------------------------------------------------------------------------
static void ParseDetailGroup( int detailId, KeyValues* pGroupKeyValues )
{
// Sort the group by alpha
float alpha = pGroupKeyValues->GetFloat( "alpha", 1.0f );
int i = s_DetailObjectDict[detailId].m_Groups.Count();
while ( --i >= 0 )
{
if (alpha > s_DetailObjectDict[detailId].m_Groups[i].m_Alpha)
break;
}
// Insert after the first guy who's more transparent that we are!
i = s_DetailObjectDict[detailId].m_Groups.InsertAfter(i);
DetailObjectGroup_t& group = s_DetailObjectDict[detailId].m_Groups[i];
group.m_Alpha = alpha;
// Add in all the model groups
KeyValues* pIter = pGroupKeyValues->GetFirstSubKey();
float totalAmount = 0.0f;
while( pIter )
{
if (pIter->GetFirstSubKey())
{
int i = group.m_Models.AddToTail();
DetailModel_t &model = group.m_Models[i];
model.m_ModelName = pIter->GetString( "model", 0 );
if (model.m_ModelName != UTL_INVAL_SYMBOL)
{
model.m_Type = DETAIL_PROP_TYPE_MODEL;
}
else
{
const char *pSpriteData = pIter->GetString( "sprite", 0 );
if (pSpriteData)
{
const char *pProcModelType = pIter->GetString( "sprite_shape", 0 );
if ( pProcModelType )
{
if ( !Q_stricmp( pProcModelType, "cross" ) )
{
model.m_Type = DETAIL_PROP_TYPE_SHAPE_CROSS;
}
else if ( !Q_stricmp( pProcModelType, "tri" ) )
{
model.m_Type = DETAIL_PROP_TYPE_SHAPE_TRI;
}
else
model.m_Type = DETAIL_PROP_TYPE_SPRITE;
}
else
{
// card sprite
model.m_Type = DETAIL_PROP_TYPE_SPRITE;
}
model.m_Tex[0].Init();
model.m_Tex[1].Init();
float x = 0, y = 0, flWidth = 64, flHeight = 64, flTextureSize = 512;
int nValid = sscanf( pSpriteData, "%f %f %f %f %f", &x, &y, &flWidth, &flHeight, &flTextureSize );
if ( (nValid != 5) || (flTextureSize == 0) )
{
Error( "Invalid arguments to \"sprite\" in detail.vbsp!\n" );
}
model.m_Tex[0].x = ( x + 0.5f ) / flTextureSize;
model.m_Tex[0].y = ( y + 0.5f ) / flTextureSize;
model.m_Tex[1].x = ( x + flWidth - 0.5f ) / flTextureSize;
model.m_Tex[1].y = ( y + flHeight - 0.5f ) / flTextureSize;
model.m_Pos[0].Init( -10, 20 );
model.m_Pos[1].Init( 10, 0 );
pSpriteData = pIter->GetString( "spritesize", 0 );
if (pSpriteData)
{
sscanf( pSpriteData, "%f %f %f %f", &x, &y, &flWidth, &flHeight );
float ox = flWidth * x;
float oy = flHeight * y;
model.m_Pos[0].x = -ox;
model.m_Pos[0].y = flHeight - oy;
model.m_Pos[1].x = flWidth - ox;
model.m_Pos[1].y = -oy;
}
model.m_flRandomScaleStdDev = pIter->GetFloat( "spriterandomscale", 0.0f );
// sway is a percent of max sway, cl_detail_max_sway
float flSway = clamp( pIter->GetFloat( "sway", 0.0f ), 0.0, 1.0 );
model.m_SwayAmount = (unsigned char)( 255.0 * flSway );
//.........这里部分代码省略.........
开发者ID:Bubbasacs,项目名称:FinalProj,代码行数:101,代码来源:detailobjects.cpp
示例10: debugmsg
void player::consume_effects( const item &food )
{
if( !food.is_comestible() ) {
debugmsg( "called player::consume_effects with non-comestible" );
return;
}
const auto &comest = *food.type->comestible;
const int capacity = stomach_capacity();
if( has_trait( trait_id( "THRESH_PLANT" ) ) && food.type->can_use( "PLANTBLECH" ) ) {
// Just keep nutrition capped, to prevent vomiting
cap_nutrition_thirst( *this, capacity, true, true );
return;
}
if( ( has_trait( trait_id( "HERBIVORE" ) ) || has_trait( trait_id( "RUMINANT" ) ) ) &&
food.has_any_flag( herbivore_blacklist ) ) {
// No good can come of this.
return;
}
// Rotten food causes health loss
const float relative_rot = food.get_relative_rot();
if( relative_rot > 1.0f && !has_trait( trait_id( "SAPROPHAGE" ) ) &&
!has_trait( trait_id( "SAPROVORE" ) ) && !has_bionic( bio_digestion ) ) {
const float rottedness = clamp( 2 * relative_rot - 2.0f, 0.1f, 1.0f );
// ~-1 health per 1 nutrition at halfway-rotten-away, ~0 at "just got rotten"
// But always round down
int h_loss = -rottedness * comest.nutr;
mod_healthy_mod( h_loss, -200 );
add_msg( m_debug, "%d health from %0.2f%% rotten food", h_loss, rottedness );
}
const auto nutr = nutrition_for( food );
mod_hunger( -nutr );
mod_thirst( -comest.quench );
mod_stomach_food( nutr );
mod_stomach_water( comest.quench );
if( comest.healthy != 0 ) {
// Effectively no cap on health modifiers from food
mod_healthy_mod( comest.healthy, ( comest.healthy >= 0 ) ? 200 : -200 );
}
if( comest.stim != 0 &&
( abs( stim ) < ( abs( comest.stim ) * 3 ) ||
sgn( stim ) != sgn( comest.stim ) ) ) {
if( comest.stim < 0 ) {
stim = std::max( comest.stim * 3, stim + comest.stim );
} else {
stim = std::min( comest.stim * 3, stim + comest.stim );
}
}
add_addiction( comest.add, comest.addict );
if( addiction_craving( comest.add ) != MORALE_NULL ) {
rem_morale( addiction_craving( comest.add ) );
}
// Morale is in minutes
int morale_time = HOURS( 2 ) / MINUTES( 1 );
if( food.has_flag( "HOT" ) && food.has_flag( "EATEN_HOT" ) ) {
morale_time = HOURS( 3 ) / MINUTES( 1 );
int clamped_nutr = std::max( 5, std::min( 20, nutr / 10 ) );
add_morale( MORALE_FOOD_HOT, clamped_nutr, 20, morale_time, morale_time / 2 );
}
std::pair<int, int> fun = fun_for( food );
if( fun.first < 0 ) {
add_morale( MORALE_FOOD_BAD, fun.first, fun.second, morale_time, morale_time / 2, false,
food.type );
} else if( fun.first > 0 ) {
add_morale( MORALE_FOOD_GOOD, fun.first, fun.second, morale_time, morale_time / 2, false,
food.type );
}
const bool hibernate = has_active_mutation( trait_id( "HIBERNATE" ) );
if( hibernate ) {
if( ( nutr > 0 && get_hunger() < -60 ) || ( comest.quench > 0 && get_thirst() < -60 ) ) {
//Tell the player what's going on
add_msg_if_player( _( "You gorge yourself, preparing to hibernate." ) );
if( one_in( 2 ) ) {
//50% chance of the food tiring you
mod_fatigue( nutr );
}
}
if( ( nutr > 0 && get_hunger() < -200 ) || ( comest.quench > 0 && get_thirst() < -200 ) ) {
//Hibernation should cut burn to 60/day
add_msg_if_player( _( "You feel stocked for a day or two. Got your bed all ready and secured?" ) );
if( one_in( 2 ) ) {
//And another 50%, intended cumulative
mod_fatigue( nutr );
}
}
if( ( nutr > 0 && get_hunger() < -400 ) || ( comest.quench > 0 && get_thirst() < -400 ) ) {
add_msg_if_player(
_( "Mmm. You can still fit some more in...but maybe you should get comfortable and sleep." ) );
if( !one_in( 3 ) ) {
//Third check, this one at 66%
mod_fatigue( nutr );
}
}
//.........这里部分代码省略.........
开发者ID:Caeous,项目名称:Cataclysm-DDA,代码行数:101,代码来源:consumption.cpp
示例11: clamp
bool
ImageInput::read_tiles (int xbegin, int xend, int ybegin, int yend,
int zbegin, int zend,
int chbegin, int chend,
TypeDesc format, void *data,
stride_t xstride, stride_t ystride, stride_t zstride)
{
if (! m_spec.valid_tile_range (xbegin, xend, ybegin, yend, zbegin, zend))
return false;
chend = clamp (chend, chbegin+1, m_spec.nchannels);
int nchans = chend - chbegin;
// native_pixel_bytes is the size of a pixel in the FILE, including
// the per-channel format.
stride_t native_pixel_bytes = (stride_t) m_spec.pixel_bytes (chbegin, chend, true);
// perchanfile is true if the file has different per-channel formats
bool perchanfile = m_spec.channelformats.size();
// native_data is true if the user asking for data in the native format
bool native_data = (format == TypeDesc::UNKNOWN ||
(format == m_spec.format && !perchanfile));
if (format == TypeDesc::UNKNOWN && xstride == AutoStride)
xstride = native_pixel_bytes;
m_spec.auto_stride (xstride, ystride, zstride, format, nchans,
xend-xbegin, yend-ybegin);
// Do the strides indicate that the data area is contiguous?
bool contiguous = (native_data && xstride == native_pixel_bytes) ||
(!native_data && xstride == (stride_t)m_spec.pixel_bytes(false));
contiguous &= (ystride == xstride*(xend-xbegin) &&
(zstride == ystride*(yend-ybegin) || (zend-zbegin) <= 1));
int nxtiles = (xend - xbegin + m_spec.tile_width - 1) / m_spec.tile_width;
int nytiles = (yend - ybegin + m_spec.tile_height - 1) / m_spec.tile_height;
int nztiles = (zend - zbegin + m_spec.tile_depth - 1) / m_spec.tile_depth;
// If user's format and strides are set up to accept the native data
// layout, and we're asking for a whole number of tiles (no partial
// tiles at the edges), then read the tile directly into the user's
// buffer.
if (native_data && contiguous &&
(xend-xbegin) == nxtiles*m_spec.tile_width &&
(yend-ybegin) == nytiles*m_spec.tile_height &&
(zend-zbegin) == nztiles*m_spec.tile_depth) {
if (chbegin == 0 && chend == m_spec.nchannels)
return read_native_tiles (xbegin, xend, ybegin, yend, zbegin, zend,
data); // Simple case
else
return read_native_tiles (xbegin, xend, ybegin, yend, zbegin, zend,
chbegin, chend, data);
}
// No such luck. Just punt and read tiles individually.
bool ok = true;
stride_t pixelsize = native_data ? native_pixel_bytes
: (format.size() * nchans);
stride_t full_pixelsize = native_data ? m_spec.pixel_bytes(true)
: (format.size() * m_spec.nchannels);
stride_t full_tilewidthbytes = full_pixelsize * m_spec.tile_width;
stride_t full_tilewhbytes = full_tilewidthbytes * m_spec.tile_height;
stride_t full_tilebytes = full_tilewhbytes * m_spec.tile_depth;
size_t prefix_bytes = m_spec.pixel_bytes (0,chbegin,true);
std::vector<char> buf;
for (int z = zbegin; z < zend; z += std::max(1,m_spec.tile_depth)) {
int zd = std::min (zend-z, m_spec.tile_depth);
for (int y = ybegin; y < yend; y += m_spec.tile_height) {
char *tilestart = ((char *)data + (z-zbegin)*zstride
+ (y-ybegin)*ystride);
int yh = std::min (yend-y, m_spec.tile_height);
for (int x = xbegin; ok && x < xend; x += m_spec.tile_width) {
int xw = std::min (xend-x, m_spec.tile_width);
// Full tiles are read directly into the user buffer,
// but partial tiles (such as at the image edge) or
// partial channel subsets are read into a buffer and
// then copied.
if (xw == m_spec.tile_width && yh == m_spec.tile_height &&
zd == m_spec.tile_depth && !perchanfile &&
chbegin == 0 && chend == m_spec.nchannels) {
// Full tile, either native data or not needing
// per-tile data format conversion.
ok &= read_tile (x, y, z, format, tilestart,
xstride, ystride, zstride);
} else {
buf.resize (full_tilebytes);
ok &= read_tile (x, y, z,
perchanfile ? TypeDesc::UNKNOWN : format,
&buf[0], full_pixelsize,
full_tilewidthbytes, full_tilewhbytes);
if (ok)
copy_image (nchans, xw, yh, zd, &buf[prefix_bytes],
pixelsize, full_pixelsize,
full_tilewidthbytes, full_tilewhbytes,
tilestart, xstride, ystride, zstride);
// N.B. It looks like read_tiles doesn't handle the
// per-channel data types case fully, but it does!
// The call to read_tile() above handles the case of
// per-channel data types, converting to to desired
// format, so all we have to do on our own is the
// copy_image.
}
tilestart += m_spec.tile_width * xstride;
}
//.........这里部分代码省略.........
开发者ID:D-POWER,项目名称:oiio,代码行数:101,代码来源:imageinput.cpp
示例12: ReadReverbDef
static void ReadReverbDef (int lump)
{
FScanner sc;
const ReverbContainer *def;
ReverbContainer *newenv;
REVERB_PROPERTIES props;
char *name;
int id1, id2, i, j;
bool inited[NUM_REVERB_FIELDS];
BYTE bools[32];
sc.OpenLumpNum(lump);
while (sc.GetString ())
{
name = copystring (sc.String);
sc.MustGetNumber ();
id1 = sc.Number;
sc.MustGetNumber ();
id2 = sc.Number;
sc.MustGetStringName ("{");
memset (inited, 0, sizeof(inited));
props.Instance = 0;
props.Flags = 0;
while (sc.MustGetString (), NUM_REVERB_FIELDS > (i = sc.MustMatchString (ReverbFieldNames)))
{
if (ReverbFields[i].Float)
{
sc.MustGetFloat ();
props.*ReverbFields[i].Float = (float)clamp (sc.Float,
double(ReverbFields[i].Min)/1000,
double(ReverbFields[i].Max)/1000);
}
else if (ReverbFields[i].Int)
{
sc.MustGetNumber ();
props.*ReverbFields[i].Int = (j = clamp (sc.Number,
ReverbFields[i].Min, ReverbFields[i].Max));
if (i == 0 && j != sc.Number)
{
sc.ScriptError ("The Environment field is out of range.");
}
}
else
{
sc.MustGetString ();
bools[ReverbFields[i].Flag] = sc.MustMatchString (BoolNames);
}
inited[i] = true;
}
if (!inited[0])
{
sc.ScriptError ("Sound %s is missing an Environment field.", name);
}
// Add the new environment to the list, filling in uninitialized fields
// with values from the standard environment specified.
def = DefaultEnvironments[props.Environment];
for (i = 0; i < NUM_REVERB_FIELDS; ++i)
{
if (ReverbFields[i].Float)
{
if (!inited[i])
{
props.*ReverbFields[i].Float = def->Properties.*ReverbFields[i].Float;
}
}
else if (ReverbFields[i].Int)
{
if (!inited[i])
{
props.*ReverbFields[i].Int = def->Properties.*ReverbFields[i].Int;
}
}
else
{
if (!inited[i])
{
int mask = 1 << ReverbFields[i].Flag;
if (def->Properties.Flags & mask)
{
props.Flags |= mask;
}
}
else
{
if (bools[ReverbFields[i].Flag])
{
props.Flags |= 1 << ReverbFields[i].Flag;
}
}
}
}
newenv = new ReverbContainer;
newenv->Next = NULL;
newenv->Name = name;
newenv->ID = (id1 << 8) | id2;
newenv->Builtin = false;
newenv->Properties = props;
newenv->SoftwareWater = false;
//.........这里部分代码省略.........
开发者ID:1Akula1,项目名称:gzdoom,代码行数:101,代码来源:s_environment.cpp
示例13: compare_llhh
int compare_llhh(const void *a, const void *b)
{
return (int)clamp(((float *)a)[0]*N, 0, N-1) - (int)clamp(((float *)b)[0]*N, 0, N-1);
}
开发者ID:AlicVB,项目名称:darktable,代码行数:4,代码来源:noiseprofile.c
示例14: H_BEFORE
// ***************************************************************************
void CQuadGridClipClusterQTreeNode::clip(CClipTrav *clipTrav)
{
// if empty (test important for branch and leave clusters)
if(Empty)
return;
H_BEFORE( NL3D_QuadClip_NodeClip );
// Then clip against pyramid
bool unspecified= false;
bool visible= true;
for(sint i=0;i<(sint)clipTrav->WorldPyramid.size();i++)
{
// We are sure that pyramid has normalized plane normals.
if(!BBoxExt.clipBack(clipTrav->WorldPyramid[i]))
{
visible= false;
break;
}
// else test is the bbox is partially or fully in the plane
else if(!unspecified)
{
// if clipFront AND clipBack, it means partially.
if(BBoxExt.clipFront(clipTrav->WorldPyramid[i]))
unspecified= true;
}
}
H_AFTER( NL3D_QuadClip_NodeClip );
// if visible, parse sons
if(visible)
{
// clip sons or cluster sons
if(unspecified)
{
if( LeafNode)
{
// clip DistMax.
CVector c= BBoxExt.getCenter();
float dist= (c - clipTrav->CamPos).norm();
dist-= BBoxExt.getRadius();
sint minDistSetup= (sint)floor(Owner->_NumDist*dist/Owner->_DistMax);
// NB if too far, set _NumDist (ie will clip only the infinite objects ones)
clamp(minDistSetup, 0, (sint)Owner->_NumDist);
// clip the sons individually
H_AUTO( NL3D_QuadClip_SonsClip );
ListNode.clipSons(minDistSetup);
}
else
{
// clip cluster sons
Sons[0]->clip(clipTrav);
Sons[1]->clip(clipTrav);
Sons[2]->clip(clipTrav);
Sons[3]->clip(clipTrav);
}
}
else
{
// udpdate the sons, but don't clip, because we know they are fully visible.
clipTrav->ForceNoFrustumClip= true;
// show all cluster sons or sons
noFrustumClip(clipTrav);
// reset flag
clipTrav->ForceNoFrustumClip= false;
}
}
}
开发者ID:CCChaos,项目名称:RyzomCore,代码行数:73,代码来源:quad_grid_clip_cluster.cpp
示例15: main
int main(int argc, char *arg[])
{
if(argc < 2)
{
fprintf(stderr, "usage: %s input.pfm [-c a1 b1]\n", arg[0]);
exit(1);
}
int wd, ht;
float *input = read_pfm(arg[1], &wd, &ht);
float max = 0.0f;
// sanity checks:
// for(int k=0;k<3*wd*ht;k++) input[k] = clamp(input[k], 0.0f, 1.0f);
// correction requested?
if(argc >= 9 && !strcmp(arg[2], "-c"))
{
const float a[3] = {atof(arg[3]), atof(arg[4]), atof(arg[5])}, b[3] = {atof(arg[6]), atof(arg[7]), atof(arg[8])};
// const float m[3] = {1, 1, 1};
// 2.0f*sqrt(a[0]*1.0f+b[0])/a[0],
// 2.0f*sqrt(a[1]*1.0f+b[1])/a[1],
// 2.0f*sqrt(a[2]*1.0f+b[2])/a[2]};
#if 1
// dump curves:
for(int k=0;k<N;k++)
{
for(int c=0;c<3;c++)
{
// const float y = k/(N-1.0f);
// const float x = m[c]*m[c]*a[c]*y*y/4.0f - b[c]/a[c];
float x = k/(N-1.0f)/a[c];
const float d = fmaxf(0.0f, x + 3./8. + (b[c]/a[c])*(b[c]/a[c]));
x = 2.0f*sqrtf(d);
fprintf(stderr, "%f ", x);
}
fprintf(stderr, "\n");
}
#endif
for(int k=0;k<wd*ht;k++)
{
for(int c=0;c<3;c++)
{
// input[3*k+c] = 2.0f*sqrtf(a[c]*input[3*k+c]+b[c])/(a[c]*m[c]);
input[3*k+c] = input[3*k+c] / a[c];
const float d = fmaxf(0.0f, input[3*k+c] + 3./8. + (b[c]/a[c])*(b[c]/a[c]));
input[3*k+c] = 2.0f*sqrtf(d);
max = fmaxf(max, input[3*k+c]);
}
}
for(int k=0;k<3*wd*ht;k++) input[k] /= max;
}
else if(argc >= 4 && !strcmp(arg[2], "-h"))
{
int bins = 0;
float *hist = read_histogram(arg[3], &bins);
float *inv_hist = (float *)malloc(3*sizeof(float)*bins);
invert_histogram(hist, inv_hist, bins);
#if 1
// output curves and their inverse:
for(int k=0;k<bins;k++)
// fprintf(stderr, "%f %f %f %f %f %f %f\n", k/(float)bins, hist[3*k], hist[3*k+1], hist[3*k+2], inv_hist[3*k], inv_hist[3*k+1], inv_hist[3*k+2]);
fprintf(stderr, "%f %f %f\n", inv_hist[3*k], inv_hist[3*k+1], inv_hist[3*k+2]);
// fprintf(stderr,"scanned %d bins\n", bins);
#endif
for(int k=0;k<wd*ht;k++)
{
for(int c=0;c<3;c++)
{
float f = clamp(input[3*k+c]*bins, 0, bins-2);
const int bin = (int)f;
f -= bin;
input[3*k+c] = (1.0f-f)*inv_hist[3*bin+c] + f*inv_hist[3*(bin+1)+c];
}
}
}
float std[N][3] = {{0.0f}};
float cnt[N][3] = {{0.0f}};
// one level haar decomposition, separable, decimated, lifting scheme
for(int j=0;j<ht;j++)
{
for(int i=0;i<wd-1;i+=2)
{
float *buf = input + 3*(wd*j + i);
for(int c=0;c<3;c++)
{
buf[c] += buf[3+c];
buf[c] *= .5f;
buf[3+c] -= buf[c];
}
// buf += 3;
}
}
for(int i=0;i<wd;i++)
{
for(int j=0;j<ht-1;j+=2)
{
float *buf = input + 3*(wd*j + i);
for(int c=0;c<3;c++)
{
//.........这里部分代码省略.........
开发者ID:AlicVB,项目名称:darktable,代码行数:101,代码来源:noiseprofile.c
示例16: GetCurrentPatch
//.........这里部分代码省略.........
return;
}
}
last_patch = curr_patch_ptr; //store the last patch car was on
BEZIER curr_patch = RevisePatch(curr_patch_ptr, use_racingline);
#ifdef VISUALIZE_AI_DEBUG
steerlook.push_back(curr_patch);
#endif
//if there is no next patch (probably a non-closed track), let it roll
if (!curr_patch.GetNextPatch()) return;
BEZIER next_patch = RevisePatch(curr_patch.GetNextPatch(), use_racingline);
//find the point to steer towards
float track_width = GetPatchWidthVector(curr_patch).Magnitude();
float lookahead = track_width * LOOKAHEAD_FACTOR1 +
car->GetVelocity().Magnitude() * LOOKAHEAD_FACTOR2;
lookahead = 1.0;
float length = 0.0;
MATHVECTOR <float, 3> dest_point = GetPatchFrontCenter(next_patch);
while (length < lookahead)
{
#ifdef VISUALIZE_AI_DEBUG
steerlook.push_back(next_patch);
#endif
length += GetPatchDirection(next_patch).Magnitude();
dest_point = GetPatchFrontCenter(next_patch);
//if there is no next patch for whatever reason, stop lookahead
if (!next_patch.GetNextPatch())
{
length = lookahead;
break;
}
next_patch = RevisePatch(next_patch.GetNextPatch(), use_racingline);
//if next patch is a very sharp corner, stop lookahead
if (GetPatchRadius(next_patch) < LOOKAHEAD_MIN_RADIUS)
{
length = lookahead;
break;
}
}
MATHVECTOR <float, 3> next_position = TransformToWorldspace(dest_point);
MATHVECTOR <float, 3> car_position = car->GetCenterOfMassPosition();
MATHVECTOR <float, 3> car_orientation = direction::Forward;
(car->GetOrientation()).RotateVector(car_orientation);
MATHVECTOR <float, 3> desire_orientation = next_position - car_position;
//car's direction on the horizontal plane
car_orientation[2] = 0;
//desired direction on the horizontal plane
desire_orientation[2] = 0;
car_orientation = car_orientation.Normalize();
desire_orientation = desire_orientation.Normalize();
//the angle between car's direction and unit y vector (forward direction)
double alpha = Angle(car_orientation[0], car_orientation[1]);
//the angle between desired direction and unit y vector (forward direction)
double beta = Angle(desire_orientation[0], desire_orientation[1]);
//calculate steering angle and direction
double angle = beta - alpha;
//angle += steerAwayFromOthers(c, dt, othercars, angle); //sum in traffic avoidance bias
if (angle > -360.0 && angle <= -180.0)
angle = -(360.0 + angle);
else if (angle > -180.0 && angle <= 0.0)
angle = - angle;
else if (angle > 0.0 && angle <= 180.0)
angle = - angle;
else if (angle > 180.0 && angle <= 360.0)
angle = 360.0 - angle;
float optimum_range = car->GetOptimumSteeringAngle();
angle = clamp(angle, -optimum_range, optimum_range);
float steer_value = angle / car->GetMaxSteeringAngle();
if (steer_value > 1.0) steer_value = 1.0;
else if (steer_value < -1.0) steer_value = -1.0;
assert(!isnan(steer_value));
if(isRecovering){
// If we are driving backwards, we need to invert steer direction.
steer_value = steer_value > 0.0 ? -1.0 : 1.0;
}
inputs[CARINPUT::STEER_RIGHT] = steer_value;
}
开发者ID:haltakov,项目名称:synthetic-dataset,代码行数:101,代码来源:ai_car_experimental.cpp
示例17: main
int main(int argc, char *argv[]) try
{
physics_driftmax = 0.0025f;
GLWin glwin("point cloud push interaction");
RSCam dcam;
dcam.Init((argc == 2) ? argv[1] : NULL);
Image<unsigned short> dimage(dcam.dcamera());
glwin.ViewAngle = dcam.fov().y;
float viewdist = 2.0f;
float yaw = 120;
int mousexold = 0;
Mesh mesh;
bool pause = false;
bool debuglines=false;
int center = 0;
bool chains = true;
bool usehull = false;
std::vector<RigidBody*> rigidbodies;
std::vector < std::pair<RigidBody*, RigidBody*>> links;
for (float x = -0.2f; x < 0.2f; x+= 0.07f)
for(float z: {0.350f})
for (float y = -0.2f; y <= 0.2f; y += 0.07f)
{
rigidbodies.push_back(new RigidBody({ AsShape(WingMeshDual(WingMeshCube(0.025f),0.028f)) }, { x,y,z }));
//rigidbodies.push_back(new RigidBody({ AsShape(WingMeshCube(0.025f) ) }, { x,y,z }));
links.push_back({(y > -0.2f)?rigidbodies[rigidbodies.size() - 2]:NULL , rigidbodies.back()});
}
//rigidbodies.push_back(new RigidBody({ AsShape(WingMeshCube(0.05f)) }, { 0,0,0.50f }));
auto seesaw = new RigidBody({ AsShape(WingMeshBox({ 0.20f, 0.015f, 0.05f })) }, { 0,0,0.45f });
rigidbodies.push_back(seesaw);
glwin.keyboardfunc = [&](unsigned char key, int x, int y)->void
{
switch (std::tolower(key))
{
case 'q': case 27: exit(0); break; // 27 is ESC
case ' ': pause = !pause; break;
case 'c': chains = !chains; break;
case 'd': debuglines = !debuglines; break;
case 'h': usehull = !usehull; break;
case 'r': for (auto &rb : rigidbodies) { rb->angular_momentum = rb->linear_momentum = float3(0.0f);rb->pose() = { rb->position_start,rb->orientation_start }; } break;
default: std::cout << "unassigned key (" << (int)key << "): '" << key << "'\n"; break;
}
};
if (dcam.dev->supports_option(rs::option::r200_lr_auto_exposure_enabled))
dcam.dev->set_option(rs::option::r200_lr_auto_exposure_enabled, 1);
while (glwin.WindowUp())
{
if (glwin.MouseState)
{
yaw += glwin.mousepos.x - mousexold;
}
mousexold = glwin.mousepos.x;
viewdist *= powf(1.1f, (float)glwin.mousewheel);
if (!pause)
dimage = dcam.GetDepth();
glPushAttrib(GL_ALL_ATTRIB_BITS);
glViewport(0, 0, glwin.res.x, glwin.res.y);
glClearColor(0.1f, 0.1f, 0.15f, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluPerspective(glwin.ViewAngle, (double)glwin.aspect_ratio(), 0.01f, 50.0f);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
gluLookAt(0, 0, viewdist, 0, 0, 0, 0, -1, 0);
glEnable(GL_DEPTH_TEST);
glTranslatef(0, 0, 0.35f);
glRotatef(yaw, 0, 1, 0);
glTranslatef(0, 0, -0.35f);
std::vector<float3> pts;
std::vector<float3> outliers;
std::vector<float3> vpts;
glDisable(GL_BLEND);
float2 wrange = { 0.20f,0.60f };
auto dp_image_c = Transform(dimage, [](unsigned short s) {return byte3((unsigned char)clamp(255 - s / 4, 0, 255)); });
drawimage(dp_image_c, { 0.78f,0.22f }, { 0.2f,-0.2f }, 3);
float depth_scale = (dcam.dev) ? dcam.dev->get_depth_scale() : 0.001f; // to put into meters // if file assume file is mm
for (auto p : rect_iteration(dimage.dim())) // p is int2 from 0,0 to w,h of dcam
//.........这里部分代码省略.........
开发者ID:melax,项目名称:dsamples,代码行数:101,代码来源:dphyspush.cpp
示例18: Spectate
void CSpectator::OnRender()
{
if(!m_Active)
{
if(m_WasActive)
{
if(m_SelectedSpectatorID != NO_SELECTION)
Spectate(m_Selected
|
请发表评论