Example #1
0
            /// <summary>
            /// Works just like DrawGuessAtPosition, only for evaluations.
            /// </summary>
            private void DrawEvaluationAtPosition(CudaStream s, MyMastermindWorld.EvaluationKind evaluation, int position,
                                                  int xGroupOffset, int yGroupOffset, int evaluationsPerRow)
            {
                MyCudaTexture texture;

                switch (evaluation)
                {
                case MyMastermindWorld.EvaluationKind.Bull:
                    texture = Owner.m_textureBull;
                    break;

                case MyMastermindWorld.EvaluationKind.Cow:
                    texture = Owner.m_textureCow;
                    break;

                case MyMastermindWorld.EvaluationKind.Miss:
                default:
                    texture = Owner.m_textureMiss;
                    break;
                }

                int xOffset = xGroupOffset + (position % evaluationsPerRow) * (GFX_EVALUATION_SPACER + texture.SizeInPixels.x);
                int yOffset = yGroupOffset + (position / evaluationsPerRow) * (GFX_EVALUATION_SPACER + texture.SizeInPixels.y);

                int yDiv = 10;

                Debug.Assert(texture.SizeInPixels.y % yDiv == 0);
                m_RgbaTextureKernel.SetupExecution(new dim3(texture.SizeInPixels.x, yDiv, 1),
                                                   new dim3(texture.SizeInPixels.y / yDiv, TARGET_VALUES_PER_PIXEL));
                m_RgbaTextureKernel.RunAsync(s, Owner.VisualOutput, Owner.VisualWidth, Owner.VisualHeight, xOffset, yOffset,
                                             texture.BitmapPtr, texture.SizeInPixels.x, texture.SizeInPixels.y);
            }
Example #2
0
            /// <summary>
            /// draws mastermind game board into Owner's VisualOutput memory block
            /// </summary>
            public override void Execute()
            {
                // erease background
                int blockDimX = Owner.VisualWidth;
                int gridDimX  = Owner.VisualHeight;

                if (blockDimX > 1024)
                {
                    gridDimX *= (int)(Math.Ceiling(blockDimX / 1024.0));
                    blockDimX = 1024;
                }
                m_RgbBackgroundKernel.SetupExecution(new dim3(blockDimX, 1, 1), new dim3(gridDimX, TARGET_VALUES_PER_PIXEL, 1));
                m_RgbBackgroundKernel.Run(Owner.VisualOutput, Owner.VisualWidth, Owner.VisualHeight, 0.9f, 0.9f, 0.9f);

                // prepare data for rendering
                Owner.GuessHistoryOutput.SafeCopyToHost();
                Owner.GuessEvaluationHistoryOutput.SafeCopyToHost();
                Owner.GuessCountOutput.SafeCopyToHost();

                int evaluationSquareWidth, guessCircleWidth, evaluationWidth,
                    evaluationsPerRow, guessWidth, rowWidth, rowHeight;

                Owner.GetGraphicsParameters(out evaluationSquareWidth, out guessCircleWidth, out evaluationWidth,
                                            out evaluationsPerRow, out guessWidth, out rowWidth, out rowHeight);
                int xGuessGroupOffset      = GFX_MAIN_SPACER + evaluationWidth + GFX_MAIN_SPACER;
                int xEvaluationGroupOffset = GFX_MAIN_SPACER;
                int totalGuesses           = (int)Math.Round(Owner.GuessCountOutput.Host[0]);

                int iStreamIndex = 0;

                // render at most NumberOfRenderedGuesses. The latest guesses have priority.
                for (int iGuess = 0; iGuess < Math.Min(totalGuesses, Owner.m_engineParams.NumberOfRenderedGuesses); iGuess++)
                {
                    int iGuessIndex = iGuess;
                    if (totalGuesses > Owner.m_engineParams.NumberOfRenderedGuesses)
                    {
                        iGuessIndex += totalGuesses - Owner.m_engineParams.NumberOfRenderedGuesses;
                    }

                    int yGuessGroupOffset = GFX_MAIN_SPACER + iGuess * (guessCircleWidth + GFX_MAIN_SPACER);
                    for (int iPosition = 0; iPosition < Owner.HiddenVectorLength; iPosition++)
                    {
                        iStreamIndex++;
                        DrawGuessAtPosition(m_streams[iStreamIndex % m_streams.Length],
                                            Owner.GuessHistoryOutput.Host[iGuessIndex * Owner.HiddenVectorLength + iPosition],
                                            iPosition, xGuessGroupOffset, yGuessGroupOffset);
                    }

                    int yEvaluationGroupOffset = yGuessGroupOffset + GFX_EVALUATION_SPACER;
                    int bulls = (int)Math.Round(Owner.GuessEvaluationHistoryOutput.Host[iGuessIndex * MyMastermindWorld.EVALUATION_ITEM_LENGTH + 0]);
                    int cows  = (int)Math.Round(Owner.GuessEvaluationHistoryOutput.Host[iGuessIndex * MyMastermindWorld.EVALUATION_ITEM_LENGTH + 1]);
                    for (int iPosition = 0; iPosition < Owner.HiddenVectorLength; iPosition++)
                    {
                        MyMastermindWorld.EvaluationKind ev = EvaluationKind.Miss;
                        if (bulls > 0)
                        {
                            ev = EvaluationKind.Bull;
                            bulls--;
                        }
                        else if (cows > 0)
                        {
                            ev = EvaluationKind.Cow;
                            cows--;
                        }
                        iStreamIndex++;
                        DrawEvaluationAtPosition(m_streams[iStreamIndex % m_streams.Length],
                                                 ev, iPosition, xEvaluationGroupOffset, yEvaluationGroupOffset,
                                                 evaluationsPerRow);
                    }
                }
            }