Ejemplo n.º 1
0
void CyclicStreamClipinfo::InitializeStreamView(ShrinkedArmature& parts, time_seconds minT, time_seconds maxT, double sampleRateHz, size_t interval_frames)
{
	m_pParts = &parts;
	m_pFeature = make_shared<PartsFeatureType>();

	m_sampleRate = sampleRateHz;

	// find closest 2^k window size, ceil work more robust, but usually it result in 512 frames, which is too long
	m_windowSize = 1 << static_cast<int>(floor(log2(maxT.count() * sampleRateHz * 4)));

	m_minFr = m_windowSize / (maxT.count() * sampleRateHz);
	m_maxFr = m_windowSize / (minT.count() * sampleRateHz);
	m_FrWidth = m_maxFr - m_minFr + 1;

	m_analyzeInterval = interval_frames;
	// if automatic, we set 1/16 of period as analyze interval
	if (m_analyzeInterval == 0)
		m_analyzeInterval = std::max(m_windowSize / 16, 1);

	m_frameWidth = 0;
	for (int i = 0; i < parts.size(); i++)
		m_frameWidth += m_pFeature->GetDimension(*parts[i]);

	// make sure each row/column in buffer is aligned as __mm128 for SIMD
	const int alignBoundry = alignof(__m128) / sizeof(float);
	m_bufferWidth = ((m_frameWidth-1) / alignBoundry + 1) * alignBoundry;
	assert(m_bufferWidth >= m_frameWidth);

	// this 4 is just some majical constant that large enough to avaiod frequent data moving
	m_bufferCapacity = m_windowSize * 4;

	m_buffer.setZero(m_bufferWidth, m_bufferCapacity);
	m_Spectrum.setZero(m_bufferWidth, m_windowSize);
	m_SmoothedBuffer.setZero(m_windowSize, m_frameWidth);

	m_cropMargin = m_sampleRate * 0.5; // 0.1s of frames as margin
	m_cyclicDtcThr = g_RevampActiveSupportThreshold;

	int n = m_windowSize;

#ifdef FFTW
	fftwf_plan plan = fftwf_plan_many_dft_r2c(1, &n, m_frameWidth,
		m_buffer.data(), nullptr, m_bufferWidth, 1,
		(fftwf_complex*)m_Spectrum.data(), nullptr, m_bufferWidth, 1,
		0);

	m_fftplan = plan;
#endif
}
void KeyboardMouseFirstPersonControl::Update(time_seconds const& time_delta)
{
	using namespace DirectX;

	XMVECTOR vel = XMVectorZero();
	if (m_keyboard->IsKeyDown(m_directionalKeys[0])) // 'W'
		vel += XMVectorSet( .0f,.0f,-1.0f,.0f);
	if (m_keyboard->IsKeyDown(m_directionalKeys[2])) // 'S'
		vel += XMVectorSet(.0f, .0f, 1.0f, .0f);
	if (m_keyboard->IsKeyDown(m_directionalKeys[1])) // 'A'
		vel += XMVectorSet(-1.0f, .0f, .0f, .0f);
	if (m_keyboard->IsKeyDown(m_directionalKeys[3])) // 'D'
		vel += XMVectorSet(1.0f, .0f, .0f, .0f);
	vel = XMVector3Normalize(vel);
	CameraVeclocity = vel;

	if (m_pTarget && CameraVeclocity.LengthSquared() > 0.01f)
	{
		XMVECTOR disp = (Speed * (float)time_delta.count()) * vel;

		disp = XMVector3Rotate(disp, m_pTarget->GetOrientation());

		m_pTarget->Move(disp);
	}
}