Exemple #1
0
void State::detachTexture(const TextureMap &zeroTextures, GLuint texture)
{
    // Textures have a detach method on State rather than a simple
    // removeBinding, because the zero/null texture objects are managed
    // separately, and don't have to go through the Context's maps or
    // the ResourceManager.

    // [OpenGL ES 2.0.24] section 3.8 page 84:
    // If a texture object is deleted, it is as if all texture units which are bound to that texture object are
    // rebound to texture object zero

    for (TextureBindingMap::iterator bindingVec = mSamplerTextures.begin(); bindingVec != mSamplerTextures.end(); bindingVec++)
    {
        GLenum textureType = bindingVec->first;
        TextureBindingVector &textureVector = bindingVec->second;
        for (size_t textureIdx = 0; textureIdx < textureVector.size(); textureIdx++)
        {
            BindingPointer<Texture> &binding = textureVector[textureIdx];
            if (binding.id() == texture)
            {
                auto it = zeroTextures.find(textureType);
                ASSERT(it != zeroTextures.end());
                // Zero textures are the "default" textures instead of NULL
                binding.set(it->second.get());
            }
        }
    }

    // [OpenGL ES 2.0.24] section 4.4 page 112:
    // If a texture object is deleted while its image is attached to the currently bound framebuffer, then it is
    // as if Texture2DAttachment had been called, with a texture of 0, for each attachment point to which this
    // image was attached in the currently bound framebuffer.

    if (mReadFramebuffer)
    {
        mReadFramebuffer->detachTexture(texture);
    }

    if (mDrawFramebuffer)
    {
        mDrawFramebuffer->detachTexture(texture);
    }
}
void SlotMachine::Update(Canvas *_canvas) {
	Canvas *canvas = _canvas;
	if (state == SlotMachineState::sl_inProcess) {
		// Все ли барабаны остановлены
		bool allStoped = true;

		// Обновляем и проверяем состояние барабанов
		TypeObjectsMap::iterator wit; // Итератор для карты с барабанами

		// Проверяем состояние барабанов
		for (wit = wheelsMap.begin(); wit != wheelsMap.end(); ++wit) {
			if (wit->second->getState() == WheelState::_running) {
				wit->second->Update();
				allStoped = false;
			}
		}

		TypeObjectsMap::iterator bit; // Итератор для карты с кнопками

		// Все барабаны прекратили вращение
		if (allStoped) {
			bit = buttonsMap.find(ObjectRole::_start);
			if (bit != buttonsMap.end()) {
				Object *start = bit->second;
				if (start->getState() == ButtonState::_enabled) {
					// Закончили вращение. Возвращаемся в исходное состояние и проверяем результат
					if (result = CalcResult()) {
						showResultStartTime = currentTime = std::time(nullptr);
						state = SlotMachineState::sl_show_result;
						TextureMap * textureMap = canvas->getTextureMap();
						TextureMap::iterator it;
						resultTexture = nullptr;
						// Обработка результатов костыль
						switch (result) {
							case r_slash:
								it = textureMap->find(TextureRole::_w_slash);
								resultTexture = it->second;
								break;
							case r_center:
								it = textureMap->find(TextureRole::_w_center);
								resultTexture = it->second;
								break;
							case r_backslah:
								it = textureMap->find(TextureRole::_w_backslash);
								resultTexture = it->second;
								break;
						}

						resultTexture->ena = true;
					}
					else {
						state = SlotMachineState::sl_waiting;
						start->Update();
					}
				}
			}

		}
	}
	else if (state == SlotMachineState::sl_show_result) {
		currentTime = std::time(nullptr);
		int elapse = currentTime - showResultStartTime;

		if (elapse < SHOW_RESULT_DURATION) {
			//resultTexture->ena = true;
		}
		else {
			resultTexture->ena = false;
			state = SlotMachineState::sl_waiting;
			TypeObjectsMap::iterator bit;
			bit = buttonsMap.find(ObjectRole::_start);
			bit->second->Update();
		}
	}
}