/// <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); }
/// <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); } } }