示例#1
0
void LightEffect::prepareForRender(Sprite *sprite, Texture2D *normalmap)
{
    auto gl = getGLProgramState();

    gl->setUniformVec2("u_contentSize", sprite->getContentSize());

    Point posRelToSprite = PointApplyAffineTransform(Point(_lightPos.x, _lightPos.y), sprite->getWorldToNodeAffineTransform());
    gl->setUniformVec3("u_lightPos", Vec3(posRelToSprite.x, posRelToSprite.y, _lightPos.z));

    gl->setUniformTexture("u_normals", normalmap);

	int opacity = sprite->getOpacity();
    SpriteFrame *frame = sprite->getSpriteFrame();
    Size untrimmedSize = frame->getOriginalSize();
    Size trimmedSize = frame->getRect().size;
    Vec2 framePos = frame->getRect().origin;
    Size texSize = frame->getTexture()->getContentSize();
    
    // set sprite position in sheet
    gl->setUniformVec2("u_spritePosInSheet", Vec2(framePos.x / texSize.width, framePos.y / texSize.height));
    gl->setUniformVec2("u_spriteSizeRelToSheet", Vec2(untrimmedSize.width / texSize.width, untrimmedSize.height / texSize.height));
    gl->setUniformInt("u_spriteRotated", frame->isRotated());
	gl->setUniformFloat("u_spriteOpacity", (float)opacity / 255.0f);
    
    // set offset of trimmed sprite
    Vec2 bottomLeft = frame->getOffset() + (untrimmedSize - trimmedSize) / 2;
    Vec2 cornerOffset = frame->isRotated() ? Vec2(bottomLeft.y, bottomLeft.x)
                                           : Vec2(bottomLeft.x, untrimmedSize.height - trimmedSize.height - bottomLeft.y);
    gl->setUniformVec2("u_spriteOffset", cornerOffset);

}
void LightsHolder::prepareForRender(Sprite *_sprite, Texture2D *normalmap)
{
    int idx=0;
    for(auto &ef : _effectsArray) {
     
        if (ef != nullptr)
        {
            Point posRelToSprite = PointApplyAffineTransform(Point(ef->getLightPos().x, ef->getLightPos().y),_sprite->getWorldToNodeAffineTransform());
            _lightPos[idx]=Vec3(posRelToSprite.x, posRelToSprite.y, ef->getLightPos().z);
            brightness[idx]=ef->getBrightness();
    
        }
        idx++;
    }
    
    auto gl = getGLProgramState();

    gl->setUniformVec2("u_contentSize", _sprite->getContentSize());


 

    gl->setUniformVec3v("u_lightPos",_lightsNumber,_lightPos);

    gl->setUniformTexture("u_normals", normalmap);

    SpriteFrame *frame = _sprite->getSpriteFrame();
    Size untrimmedSize = frame->getOriginalSize();
    Size trimmedSize = frame->getRect().size;
    Vec2 framePos = frame->getRect().origin;
    Size texSize = frame->getTexture()->getContentSize();
    
    // set sprite position in sheet
    gl->setUniformVec2("u_spritePosInSheet", Vec2(framePos.x / texSize.width, framePos.y / texSize.height));
    gl->setUniformVec2("u_spriteSizeRelToSheet", Vec2(untrimmedSize.width / texSize.width, untrimmedSize.height / texSize.height));
    
    gl->setUniformFloatv("u_brightness",_lightsNumber, brightness);
    
    gl->setUniformInt("u_spriteRotated", frame->isRotated());
    gl->setUniformInt("u_lightsNumber", _lightsNumber);
    
    // set offset of trimmed sprite
    Vec2 bottomLeft = frame->getOffset() + (untrimmedSize - trimmedSize) / 2;
    Vec2 cornerOffset = frame->isRotated() ? Vec2(bottomLeft.y, bottomLeft.x)
                                           : Vec2(bottomLeft.x, untrimmedSize.height - trimmedSize.height - bottomLeft.y);
    gl->setUniformVec2("u_spriteOffset", cornerOffset);

}
示例#3
0
void ShaderNode::onDraw(const Mat4 &transform, uint32_t flags)
{
    float w = SIZE_X, h = SIZE_Y;
    GLfloat vertices[12] = {0,0, w,0, w,h, 0,0, 0,h, w,h};

    auto glProgramState = getGLProgramState();
    glProgramState->setUniformVec2("resolution", _resolution);
    glProgramState->setUniformVec2("center", _center);
    glProgramState->setVertexAttribPointer("a_position", 2, GL_FLOAT, GL_FALSE, 0, vertices);

    glProgramState->apply(transform);

    glDrawArrays(GL_TRIANGLES, 0, 6);
    
    CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,6);
}
示例#4
0
void PreloadScene::PreloadData()
{
    m_dataStartLoading = true;
//    CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("audio/player_sfx.ogg");
//    CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("audio/explode_sfx.ogg");
//    CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("audio/breaks_sfx.ogg");
//    CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("audio/passingBy_sfx.ogg");
//    CocosDenshion::SimpleAudioEngine::getInstance()->preloadBackgroundMusic("audio/music.ogg");

    SpriteFrameCache::getInstance()->addSpriteFramesWithFile("textures/gui_objects.plist");
    SpriteFrameCache::getInstance()->addSpriteFramesWithFile("textures/world_objects.plist");
    SpriteFrameCache::getInstance()->addSpriteFramesWithFile("textures/light_objects.plist");

    auto vhsProgram = AppDelegate::ShaderEffect("shaders/vhs.fsh");
    auto vhsInGame = AppDelegate::ShaderEffect("shaders/vhs_ingame.fsh");
    auto zoomShader = AppDelegate::ShaderEffect("shaders/zoom_blur.fsh");
    auto zoomGlState = GLProgramState::getOrCreateWithGLProgram(zoomShader);
    zoomGlState->setUniformVec2("u_blurCenter", Vec2(0.5,0.67));


    ShaderCache::getInstance()->addGLProgram(vhsProgram, "VHS");
    ShaderCache::getInstance()->addGLProgram(zoomShader, "ZOOM");
    ShaderCache::getInstance()->addGLProgram(vhsInGame, "VHS_INGAME");
    m_dataFinishLoading = true;
}
示例#5
0
void FishLayer::draw(Renderer* renderer, const Mat4 &transform, uint32_t flags)
{
	if(m_Sprite)
	{
		//乌龟从右向左移动,移出屏幕后就回到最右边
		auto s = Director::getInstance()->getWinSize();
		m_Sprite->setPositionX(m_Sprite->getPositionX()-1);
		if(m_Sprite->getPositionX() < -100)
		{
			m_Sprite->setPositionX(s.width + 10);
		}
		
		auto glprogramstate = m_Sprite->getGLProgramState();
		if(glprogramstate)
		{
			m_LightAni.x += 0.01;
			if(m_LightAni.x > 1.0)
			{
				m_LightAni.x-= 1.0;
			}
			m_LightAni.y += 0.01;
			if(m_LightAni.y > 1.0)
			{
				m_LightAni.y-= 1.0;
			}
			glprogramstate->setUniformVec2("v_animLight",m_LightAni);
		}
	}
	Node::draw(renderer,transform,flags);
}
示例#6
0
//重新绘制函数(波光效果)
void Tortoise::draw(cocos2d::Renderer* renderer, const cocos2d::Mat4 &transform, uint32_t flags) {
	auto glprogramstate = _sprite->getGLProgramState();
	if(glprogramstate)
	{
		_lightAni.x += 0.01;
		if(_lightAni.x > 1.0)
		{
			_lightAni.x-= 1.0;
		}
		_lightAni.y += 0.01;
		if(_lightAni.y > 1.0)
		{
			_lightAni.y-= 1.0;
		}
		glprogramstate->setUniformVec2("v_animLight",_lightAni);
	}
	Node::draw(renderer,transform,flags);
}