public RenderTextureTestDepthStencil() { CCSize s = CCDirector.SharedDirector.WinSize; CCSprite sprite = new CCSprite("Images/fire"); sprite.Position = new CCPoint(s.Width * 0.25f, 0); sprite.Scale = 10; CCRenderTexture rend = new CCRenderTexture((int)s.Width, (int)s.Height, SurfaceFormat.Color, DepthFormat.Depth24Stencil8, RenderTargetUsage.DiscardContents); rend.BeginWithClear(0, 0, 0, 0, 0); var save = CCDrawManager.DepthStencilState; CCDrawManager.DepthStencilState = new DepthStencilState() { ReferenceStencil = 1, DepthBufferEnable = false, StencilEnable = true, StencilFunction = CompareFunction.Always, StencilPass = StencilOperation.Replace, TwoSidedStencilMode = true, CounterClockwiseStencilFunction = CompareFunction.Always, CounterClockwiseStencilPass = StencilOperation.Replace, }; sprite.Visit(); CCDrawManager.DepthStencilState = new DepthStencilState() { DepthBufferEnable = false, StencilEnable = true, StencilFunction = CompareFunction.NotEqual, StencilPass = StencilOperation.Keep, ReferenceStencil = 1 }; // GL_SRC_ALPHA CCDrawManager.BlendFunc(new CCBlendFunc(CCOGLES.GL_ONE, CCOGLES.GL_ONE_MINUS_SRC_ALPHA)); //! move sprite half width and height, and draw only where not marked sprite.Position = sprite.Position + new CCPoint(sprite.ContentSize.Width * sprite.Scale, sprite.ContentSize.Height * sprite.Scale) * 0.5f; sprite.Visit(); CCDrawManager.DepthStencilState = save; rend.End(); rend.Position = new CCPoint(s.Width * 0.5f, s.Height * 0.5f); AddChild(rend); }
public void NeedsLayout() { m_pOnSprite.Position = new CCPoint(m_pOnSprite.ContentSize.Width / 2 + m_fSliderXPosition, m_pOnSprite.ContentSize.Height / 2); m_pOffSprite.Position = new CCPoint(m_pOnSprite.ContentSize.Width + m_pOffSprite.ContentSize.Width / 2 + m_fSliderXPosition, m_pOffSprite.ContentSize.Height / 2); m_ThumbSprite.Position = new CCPoint(m_pOnSprite.ContentSize.Width + m_fSliderXPosition, m_pMaskTexture.ContentSize.Height / 2); if (m_pOnLabel != null) { m_pOnLabel.Position = new CCPoint(m_pOnSprite.Position.X - m_ThumbSprite.ContentSize.Width / 6, m_pOnSprite.ContentSize.Height / 2); } if (m_pOffLabel != null) { m_pOffLabel.Position = new CCPoint(m_pOffSprite.Position.X + m_ThumbSprite.ContentSize.Width / 6, m_pOffSprite.ContentSize.Height / 2); } CCRenderTexture rt = new CCRenderTexture((int)m_pMaskTexture.ContentSize.Width, (int)m_pMaskTexture.ContentSize.Height, SurfaceFormat.Color, DepthFormat.None, RenderTargetUsage.DiscardContents); rt.BeginWithClear(0, 0, 0, 0); m_pOnSprite.Visit(); m_pOffSprite.Visit(); if (m_pOnLabel != null) { m_pOnLabel.Visit(); } if (m_pOffLabel != null) { m_pOffLabel.Visit(); } if (m_pMaskSprite == null) { m_pMaskSprite = new CCSprite(m_pMaskTexture); m_pMaskSprite.AnchorPoint = new CCPoint(0, 0); m_pMaskSprite.BlendFunc = new CCBlendFunc(CCOGLES.GL_ZERO, CCOGLES.GL_SRC_ALPHA); } else { m_pMaskSprite.Texture = m_pMaskTexture; } m_pMaskSprite.Visit(); rt.End(); Texture = rt.Sprite.Texture; //IsFlipY = true; }
public void NeedsLayout() { _onSprite.Position = new CCPoint(_onSprite.ContentSize.Width / 2 + _sliderXPosition, _onSprite.ContentSize.Height / 2); _offSprite.Position = new CCPoint(_onSprite.ContentSize.Width + _offSprite.ContentSize.Width / 2 + _sliderXPosition, _offSprite.ContentSize.Height / 2); _thumbSprite.Position = new CCPoint(_onSprite.ContentSize.Width + _sliderXPosition, _maskSprite.ContentSize.Height / 2); if (_onLabel != null) { _onLabel.Position = new CCPoint(_onSprite.Position.X - _thumbSprite.ContentSize.Width / 6, _onSprite.ContentSize.Height / 2); } if (_offLabel != null) { _offLabel.Position = new CCPoint(_offSprite.Position.X + _thumbSprite.ContentSize.Width / 6, _offSprite.ContentSize.Height / 2); } var rt = new CCRenderTexture( (int)_maskSprite.ContentSizeInPixels.Width, (int)_maskSprite.ContentSizeInPixels.Height, SurfaceFormat.Color, DepthFormat.None, RenderTargetUsage.DiscardContents ); rt.BeginWithClear(0, 0, 0, 0); _onSprite.Visit(); _offSprite.Visit(); if (_onLabel != null) { _onLabel.Visit(); } if (_offLabel != null) { _offLabel.Visit(); } _maskSprite.AnchorPoint = new CCPoint(0, 0); _maskSprite.BlendFunc = new CCBlendFunc(CCOGLES.GL_ZERO, CCOGLES.GL_SRC_ALPHA); _maskSprite.Visit(); rt.End(); InitWithTexture(rt.Sprite.Texture); ContentSize = _maskSprite.ContentSize; }
public RenderTextureIssue937() { /* * 1 2 * A: A1 A2 * * B: B1 B2 * * A1: premulti sprite * A2: premulti render * * B1: non-premulti sprite * B2: non-premulti render */ CCLayerColor background = new CCLayerColor(new CCColor4B(200, 200, 200, 255)); AddChild(background); CCSprite spr_premulti = new CCSprite("Images/fire"); spr_premulti.Position = new CCPoint(16, 48); CCSprite spr_nonpremulti = new CCSprite("Images/fire"); spr_nonpremulti.Position = new CCPoint(16, 16); /* A2 & B2 setup */ CCRenderTexture rend = new CCRenderTexture(32, 64); // It's possible to modify the RenderTexture blending function by //CCBlendFunc bf = new CCBlendFunc (OGLES.GL_ONE, OGLES.GL_ONE_MINUS_SRC_ALPHA); //rend.Sprite.BlendFunc = bf; rend.Begin(); // A2 spr_premulti.Visit(); // B2 spr_nonpremulti.Visit(); rend.End(); CCSize s = CCDirector.SharedDirector.WinSize; /* A1: setup */ spr_premulti.Position = new CCPoint(s.Width / 2 - 16, s.Height / 2 + 16); /* B1: setup */ spr_nonpremulti.Position = new CCPoint(s.Width / 2 - 16, s.Height / 2 - 16); rend.Position = new CCPoint(s.Width / 2 + 16, s.Height / 2); AddChild(spr_nonpremulti); AddChild(spr_premulti); AddChild(rend); }