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); }
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); }
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; }
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); }
//重新绘制函数(波光效果) 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); }